Orchestrata Ultimate › Plans › system-analysis-master

Orchestrata — master system analysis

Source: plans/system-analysis-master.md at 8a2cb42ad · last changed 2026-08-23 · first committed 2026-08-23 · 1639 lines.

Prose pending.

Plan text

Orchestrata — master system analysis

Living document. Generated from analysis/register.json; every analysis round appends to the register and this file is re-rendered. Do not hand-edit — an edit here is lost on the next round and silently disagrees with the evidence it cites.

0. Document control

Rounds folded in 2
Analyst reports 54
Raw findings 622
After de-duplication 566
Coordinator rulings 10 domain reports

Round log

Round Run Focus Date
1 wf_97366b85-e8a system analysis 2026-08-23
2 wf_3228b34c-1f2 gap swarms 2026-08-23

Id scheme. Findings carry a global OA-NNN id. Agent-local ids are kept only as provenance (R1·GATE-03), because the per-agent id spaces collide — two round-2 lenses independently minted GS-01…GS-14. That is the same two registers, one id space defect this analysis found in the project's ADR registers, so the report does not repeat it.

Verification coverage actually achieved. Measured from the run journals, not asserted. An agent that died leaves its findings unverified, and the report has to say so rather than present them as vetted.

Round Coordinators landed Consolidation Confirmed Unverified
1 6 of 6 yes 163 135
2 4 of 6 never ran 93 153

Verification states. confirmed = an independent domain coordinator re-verified it and promoted it. refuted = a coordinator rejected it, with the reason recorded. unverified = no coordinator ruling matched it yet — not a claim that it is wrong.

1. Verdict

37 FATAL · 275 MAJOR · 197 MINOR · 57 INFO

256 independently confirmed · 288 awaiting a coordinator ruling · 22 refuted and retained as a record.

Every domain that reported returned FAILING. The deployed bytes are correct — the production checkout is git-clean at the pushed commit, every unit file is byte-identical, and every daemon runs from the production venv. What fails is the layer that is supposed to notice when they stop being correct.

2. Systemic patterns — the highest-value output

Individual defects are cheap to fix and cheap to re-introduce. These are the shapes that recur across unrelated subsystems; each one predicts defects nobody has looked for yet.

P1. The oracle that cannot fail: a verdict derived from a field the producer never writes, an exit code the checker cannot set, or a stream the parser cannot read. The check is authored against the happy path and accepted because it prints PASS on a tree already believed good.

P2. Registration mistaken for wiring: an artifact exists, is executable, is deployed, and is named in a manifest — and nothing invokes it.

P3. The scope-narrowing default: a checker whose default argument excludes the root where the violations live, reporting a ratio whose denominator was derived from what it chose to look at.

P4. Fork-then-diverge: one capability, two implementations, and every path-keyed reference bound to whichever copy the author had open.

P5. Bare python / python3 in an invocation string: the verdict is decided by PATH, and the resulting ModuleNotFoundError is swallowed.

P6. Two authorities, no supersession path: the correcting decision is recorded somewhere the reader of the wrong document cannot see.

P7. Fail-open by default in the guard layer: a guard that cannot evaluate its input allows, and the allow is indistinguishable from a real pass.

P8. The hand-maintained inventory living beside a generated one, with no mechanical link and no completeness check — so every new gate, spec, package or script silently widens the gap.

2b. Strongest evidence — findings two or more independent lenses reached separately

These agents did not see each other's work. Independent convergence is the single best signal in the corpus, and it is where remediation should start.

ID × Sev Finding Verified
OA-038 6 🟠 .pre-commit-config.yaml — 19 declared hooks, zero executions ✅ confirmed
OA-001 5 🔴 7 of 8 prod units execute the DEV checkout's interpreter at every start ✅ confirmed
OA-039 4 🟠 The single-entry-point guard's regex covers 9 of the 23 gate commands ✅ confirmed
OA-002 3 🔴 The git pre-commit hook reports 0 issues on a file with 4 ERROR findings — code-review.py pref… ✅ confirmed
OA-040 3 🟠 The RUL-023 wiring gate has no rule for claude/hooks, the surface holding all 13 unregistered… ❌ refuted
OA-041 3 🟠 run_tests._run_gates fails open on a missing gate script and still prints All safety gates pass ✅ confirmed
OA-510 3 ⬜ My own write side effect, disclosed: one bytecode cache file ⏳ unverified
OA-003 2 🔴 .github/workflows/ci.yml has never been runnable: 12 gate scripts invoked nowhere else, commit… ✅ confirmed
OA-004 2 🔴 25 of 57 live hook registrations — the entire .claude/settings.json project surface — did not… ✅ confirmed
OA-005 2 🔴 Deleted generator still declared by a tracked artifact; the loss-detector reports OK ✅ confirmed
OA-006 2 🔴 Deployed turn-capture hook defaults REDIS_HOST to localhost — RUL-003 violated in production ✅ confirmed
OA-007 2 🔴 The architecture gate cannot fail: no local runner passes --strict, so architecture_checker.… ✅ confirmed
OA-008 2 🔴 The live production kernel and gateway resolve their semantic-retrieval corpus to 61 stale age… ✅ confirmed
OA-009 2 🔴 The pre-commit test-review gate has never executed — its invocation is an argparse error ✅ confirmed
OA-010 2 🔴 gates.py --only <unknown-name> prints ALL GATES PASS and exits 0 having run zero gates ✅ confirmed
OA-042 2 🟠 26 tracked instructions bind the 23-gate battery to /usr/bin/python — a GIL-ENABLED, non-venv… ⏳ unverified
OA-043 2 🟠 32 fabricated IMPORTS edges in the production graph, including a core.logging -> core.logging… ✅ confirmed
OA-044 2 🟠 6 of 11 scripts in AGENTS.md's tool table, and the entire MANDATORY orchestrator pipeline, do… ✅ confirmed
OA-045 2 🟠 Both ADR registers write the same id space; the prod graph resolves 25 ids to the wiki decisio… ✅ confirmed
OA-046 2 🟠 CLAUDE.md understates the always-loaded codebase map by 2.9x; three mutually inconsistent toke… ✅ confirmed
OA-047 2 🟠 Eight specs declare Status "Complete" with zero requirement facts and zero @traces citations a… ⏳ unverified
OA-048 2 🟠 Every complexity finding is WARNING; both the installed pre-commit hook and CI filter at ERROR… ⏳ unverified
OA-049 2 🟠 Repo ADR-0003 'Neo4j is the fact system of record' is Accepted and unsuperseded while the whol… ✅ confirmed
OA-050 2 🟠 The live CI executor runs out of the DEV working checkout, and RUL-027 reports PASS because it… ⏳ unverified

3. FATAL register — all 37

Write Sinks, CI & Dating

OA-003 — .github/workflows/ci.yml has never been runnable: 12 gate scripts invoked nowhere else, committed the same day the repo went GitLab-only

🔴 FATAL · dead · ✅ confirmed · evidence: measured · state: static-source · corroborated ×2

The workflow declares 24 named steps, 19 of them checks, and invokes 13 gate scripts. Diffing its script list against .gitlab-ci.yml's shows 12 scripts that exist ONLY in the unrunnable GitHub workflow: ast_report.py, audit_test_purity.py, check_async_await.py, code-review.py, gate.py, gen_intent_lexicon.py, gen_level0.py, kg_schema.py, pyright_ratchet.py, run_tests_threadpool.py, serialize_codebase_ast.py, validate_ci.py. These cover the Prolog gate, the Level-0 context drift gate, canonical KG schema conformance, the intent-lexicon drift gate, the test-purity gate, the traceability ratchet, the async-correctness gate and both pyright ratchets — the entire mechanised half of this project's rulings. None has an automatic runner. Round 1 counted '8 further checks'; the measured figure is 19 steps / 12 orphaned scripts.

When it appeared. NEVER WIRED — 134 days. Both CI definitions were committed on 2026-04-11; the GitLab one explicitly "for GitLab", and the remote has been GitLab-only for the whole of recorded history. The GitHub workflow has been continuously maintained since — its last touch is 12e56bd3 on 2026-08-18, and it accumulated steps at 3c25acc6 / d3222032 (2026-08-16, pyright ratchets) — so 134 days of edits were made to a file that has never executed once. No commit records a rationale for keeping it.

Proposed fix. Port the 12 orphaned gate scripts into .gitlab-ci.yml (or into scripts/gates.py invoked from one GitLab job) and delete .github/workflows/ci.yml. Keeping it is worse than deleting it: every future contributor adding a check there believes they have wired enforcement, which is systemic pattern #2 with a 134-day track record.

Origin: R2·H-03, R1·DOCS-TRUTH-009 · Files: ast_report.py, audit_test_purity.py, check_async_await.py, code-review.py, docs/LEVEL0.md, gate.py

OA-014 — 120 consecutive total CI failures produced zero signal — the only automatic CI verification checks the YAML document, never the pipeline

🔴 FATAL · false-green · ⏳ unverified · evidence: measured · state: production

Nothing in this repository reads pipeline status. The validate-ci gate — the project's sole automatic verification touching CI — parses .gitlab-ci.yml and reports 'All 14 CI validation gates passed' while every pipeline that file produces has failed for 12 days. scripts/validate_ci.py:399 binds ci_file = repo_root / ".gitlab-ci.yml": its oracle is the document's shape, and no shape check can fail on an executor that cannot pull an image. A repository-wide search for any pipeline-status reader (glab ci, glab api .../pipelines, CI_PIPELINE_STATUS) across scripts/, deploy/, claude/ and .claude/ returns only human instructions inside deploy/gitlab-runner/README.md and the registration script. deploy/ship.sh contains no pipeline check. This is systemic pattern #1 applied to the CI surface, and it is why the outage survived 12 days, 120 pipelines, and a 38-agent analysis.

When it appeared. The blindness is NEVER-WIRED, not a regression: no pipeline-status reader has ever existed in this tree (0 hits in tracked files). The validate-ci gate itself dates to 2abdff0e 'feat(repro): CI/local runner parity — enforce the canonical runner (R6)' 2026-07-11 16:06:11 -0400 and has been document-scoped since introduction. The window in which its green was actively false began 2026-08-11T20:26:36Z (CI-01) and is 12 days old as of 2026-08-23.

Proposed fix. Add a gate whose oracle is GitLab, not the file: glab api projects/:id/pipelines?ref=master&per_page=1 and fail unless the newest pipeline for the current HEAD sha is success. Name what would have to be true for it to fail (a red or missing pipeline) and prove it can, by pointing it at HEAD today — it must go red immediately. Until that exists, validate-ci should print its own blind spot in the same output as its PASS, the way the four gates round 1 praised already do: 'validates .gitlab-ci.yml as a document; does not observe pipeline execution'.

Origin: R2·CI-02 · Files: deploy/gitlab-runner/README.md, deploy/gitlab-runner/register.sh, deploy/ship.sh, scripts/gates.py, scripts/validate_ci.py

OA-017 — 623 GitLab master pipelines, zero successes ever; 12 days of runner_system_failure that nobody read

🔴 FATAL · false-green · ⏳ unverified · evidence: measured · state: production

The remote is git@gitlab.com:MSamy/orchestrata-ultimate-architecture.git and .gitlab-ci.yml (15,938 bytes, 11 jobs: lint, test, coverage-gate, architecture-check, vizint-compliance, vizint-provenance-e2e, build, build-image, volk_harness_nightly) does run there. It has produced 623 master pipelines from 2026-04-18T23:56:14Z to 2026-08-22T04:54:57Z. Not one of them succeeded: the API returns count 0 for ref=master&status=success, and exactly ONE successful pipeline exists in the project's entire history — 2557034680 on branch ci/ci-green, 2026-05-27. Since 2026-08-11 every job fails with failure_reason=runner_system_failure before its script runs: the incus executor cannot pull registry.gitlab.com/msamy/orchestrata-ultimate-architecture/ci:latest, "Requesting bearer token: received unexpected HTTP status: 403 Forbidden". So for 12 days no lint, test, coverage-gate or architecture-check has executed at all, and the build and coverage-gate stages sit permanently 'skipped'. This is the pipeline history the round-1 report never opened. Because nothing reads it, the failure mode silently changed from script_failure (2026-04-18 onward) to ci_quota_exceeded (2026-06-26 to 2026-07-21) to runner_system_failure (2026-08-11 onward) with no reaction.

When it appeared. NEVER GREEN — this is a never-wired condition, not a regression, for master as a whole: the oldest recorded master pipeline is 2462935674 at 2026-04-18T23:56:14Z and it failed (lint, script_failure). CI config landed 2026-04-11 (cd2b1801). The CURRENT failure mode IS a dated regression: the last script_failure sample is 2026-08-10T17:19:26Z (2748173067) and the first runner_system_failure sample is 2026-08-11T22:15:17Z (2752211843), so the registry/runner break occurred between those two timestamps — 12 days ago as of 2026-08-23. The ci_quota_exceeded era ran 2026-06-26 to 2026-07-21. Caveat: GitLab may prune very old pipeline records; the 623 recorded span the whole period from 9 days afte…

Proposed fix. Two separate repairs, in this order. (1) Fix the runner's registry credentials — the 403 on the bearer-token request means the gitlab-runner's incus executor has no valid pull credential for registry.gitlab.com/msamy/orchestrata-ultimate-architecture/ci:latest, or the image tag no longer exists; until that is fixed no evidence about the code is obtainable from CI. (2) Then attack the underlying script_failure that predates it, and do NOT declare CI wired until a master pipeline reaches status=success — the project has produced exactly one green pipeline in 126 days and it was on a throwaway branch. Add a notification so the next silent failure-mode change is not invisible for 12 days.

Origin: R2·RS-03 · Files: env, home/mohamed/workspace/orchestrata-ultimate-architecture/.gitlab-ci.yml

OA-020 — Git blame is unusable for 80.9% of the repo: a CI accident on 2026-07-27 deleted and re-added the whole tree

🔴 FATAL · debt · ⏳ unverified · evidence: measured · state: static-source

This is the mechanical cause of round 1's structural failure ('nothing is dated'). On 2026-07-27 the pre-push test suite, running from a worktree, committed two tree-deleting commits onto master: 5322ba6d "initial" (18:49:06, 4,057 files, 6,013,967 deletions) and e39f8d16 "init" (19:18:47, 4,055 files, 6,014,425 deletions). bdafa201 (19:28:19) restored the content by re-adding all 4,055 files as 6,014,425 insertions. All three are ancestors of HEAD. 3,965 of today's 4,901 tracked files (80.9%) appear in bdafa201's add-list, and in a 25-file sample, 23 files have >=91% of their lines blamed to bdafa201 — including specs/020-claude-code-harness/spec.md at 1,912 of 1,912 lines (100%). No requirement in SPEC-020, the most-cited document in round 1, can be dated by blame at all. git log -S still sees through the gap (scripts/code-review.py correctly blames back to 2026-04-19), so the repo is datable — but only with the right instrument, and round 1 used none.

When it appeared. The discontinuity is dated exactly: 2026-07-27 18:49:06 to 19:28:19 EDT, three commits, 39 minutes. Recorded rationale: PARTIAL — bdafa201's subject names the cause (the pre-push test suite hijacked the branch) but no commit, ADR or plan records the decision to leave the two destructive commits in master's history rather than rewriting them out, and none records the resulting loss of blame history.

Proposed fix. Two actions. (1) Publish this as a standing analysis rule: in this repo, date findings with git log -S <literal> and git log --diff-filter=A, NEVER with git blame or --follow, and treat any 2026-07-27 date as a null result requiring a second lookup. (2) Fix the cause — the pre-push hook must never be able to commit to master; the mutation sentinel added in 854bc6d9 the same day was the response, and it should be verified to actually block this specific sequence.

Origin: R2·H-04 · Files: architecture/current-to-target-mapping.md, claude/SESSION_SYSTEM.md, claude/hooks/error_gate/checks_structure.py, plans/execution-plan.md, plugins/orchestrata/commands/session.md, rtm/scripts/architecture_checker.py

OA-021 — GitLab CI has executed zero Python checks for 12 days — 360 consecutive runner_system_failure job runs, live-reproduced root cause

🔴 FATAL · disconnection · ⏳ unverified · evidence: measured · state: production

The CI that runs on the project's real remote is 100% red and has been since 2026-08-11T20:26:36Z. lint (ruff + black + mypy), architecture-check (architecture_checker.py --strict) and test (scripts/run_tests.py, the whole suite) have failed 360 consecutive times with GitLab failure_reason runner_system_failure — the job dies in prepare_executor, before a single script line runs. coverage-gate (--fail-under=92) has been skipped 116/116 because it needs: test, and build skipped 89 times, so the coverage floor and the artifact build have not been enforced once either. The mechanism is not a code failure: the Incus custom executor maps registry.gitlab.com/msamy/.../ci:latest to glreg:... and incus launch shells out to skopeo AS ROOT, which has no credentials for the private registry.

When it appeared. REGRESSION, dated to a 26-hour window. Last successful lint job: id 15815547498, 2026-08-10T17:54:21.534Z. First universal runner_system_failure: jobs 15842330163/164/166, 2026-08-11T20:26:36.420Z. Before that the self-hosted executor worked: 2026-08-09 and 2026-08-10 show lint and architecture-check success on essentially every pipeline (test failed with script_failure — an honest red, i.e. the checks were running). The prior era was different again: 2026-07-14 -> 2026-07-31 every job failed ci_quota_exceeded (SaaS minutes exhausted); 2026-08-02 -> 2026-08-06 jobs ran and failed on scripts; the Incus executor landed 5fcc0858 'Self-hosted CI: GitLab Runner custom executor driving In…

Proposed fix. Restore the credential and then remove the class of failure: (1) run sudo skopeo login registry.gitlab.com on the runner host with a deploy token, writing to a PERSISTENT path (--authfile /root/.config/containers/auth.json) — skopeo's root default is $XDG_RUNTIME_DIR/containers/auth.json = /run/containers/0/auth.json, which is tmpfs and dies at every boot, and this host reboots often (8 reboots recorded since 2026-08-19); (2) make prepare.sh assert the credential BEFORE launching — an explicit skopeo inspect preflight that fails with 'no registry credential for ; run sudo skopeo login' turns 360 identical opaque system failures into one actionable message; (3) add the login to a provisioning step in deploy/gitlab-runner/ so it is repo state, not undocumented machine state that…

Origin: R2·CI-01 · Files: XDG_RUNTIME_DIR/containers/auth.json, architecture_checker.py, config/containers/auth.json, deploy/gitlab-runner/incus-executor/_common.sh, deploy/gitlab-runner/incus-executor/prepare.sh, root/.config/containers/auth.json

OA-024 — SPEC-020's audit trail was specified and never built — resolving round-1 contradiction #3

🔴 FATAL · missing · ⏳ unverified · evidence: measured · state: production

Round 1 left this open in §6: 'Did ~/.claude/audit/ ever exist? This decides whether SPEC-020's audit trail is built-then-disconnected (a wiring fix) or specified-never-built (a build).' It is specified-never-built. Across the whole working tree, ~/.claude/audit/ appears in exactly 15 lines of specs/020-claude-code-harness/{spec.md,checklists/requirements.md} and in exactly ONE line of any executable-language file — a COMMENT in tests/claude/test_instruction_enforcer_hook.py:13. There is no writer, in any .py/.sh/.js/.ts, anywhere in the tree. The requirements checklist nevertheless marks REQ-020-124, REQ-020-200, REQ-020-204 and REQ-020-205 as [x] complete. The correct repair is a build, not a rewire.

When it appeared. NEVER BUILT. The spec text has been in the tree since at least bdafa201 (2026-07-27) and its content predates that; specs/020 is 100% blame-collapsed to that commit (see H-04), so an exact spec authoring date is not recoverable from blame — but it does not need to be: no writer commit exists at any point in the 3,417-commit history, which is the answer the contradiction needed. Recorded rationale for the four [x] marks against a non-existent sink: NONE.

Proposed fix. Uncheck REQ-020-124/200/204/205 in specs/020-claude-code-harness/checklists/requirements.md before anything else — a [x] against a sink that never existed is the checklist asserting a fact it never tested. Then either build the audit writer or amend SPEC-020 to drop the audit trail; do not leave a P0 spec claiming a 'never deleted' guarantee over a directory nothing creates.

Origin: R2·H-07 · Files: checklists/requirements.md, claude/audit/enforcement_log.json, claude/audit/findings/deception_log.json, nspecs/020-claude-code-harness/checklists/requirements.md, nspecs/020-claude-code-harness/spec.md, py/.sh

OA-026 — TOP-01's test-review branch is a REGRESSION pinned to one commit: e1e1a4f7 (2026-05-26) deleted --format and wired three hooks to pass it, in the same commit

🔴 FATAL · false-green · ⏳ unverified · evidence: measured · state: production

Round 1 correctly measured that scripts/hooks/pre-commit's test-review branch exits 2 because it passes --format, which test-review.py does not define. It could not say when. Commit e1e1a4f7 (2026-05-26 12:29:48, "feat(hooks): test review + real DispatchResult in tests") rewrote test-review.py in a 512-line change that REMOVED parser.add_argument("--format", choices=["text","json"], default="text", ...) — present since 87c38cc2 on 2026-04-22 — and in the SAME commit added three hook invocations of the form python scripts/test-review.py --format text --min-severity WARNING --stdout "$FILE" 2>/dev/null, plus rewrote the module docstring to a usage example that uses the flag it had just deleted. The 2>/dev/null swallowed the argparse error, so the gate has reported 'no test issues' since the day it was wired. It has never once executed successfully. scripts/run_review_pipeline.sh:38 carries the same broken invocation.

When it appeared. REGRESSION, dated exactly: e1e1a4f7, 2026-05-26 12:29:48 -0400. Broken for 89 days. The flag existed and worked from 87c38cc2 (2026-04-22) for 34 days. Recorded rationale: NONE — the commit message documents the rewrite's new rules and the hook wiring in detail and says nothing about dropping --format; the removal appears to be collateral damage in a 512-line rewrite, and the docstring edit in the same hunk shows the author still believed the flag existed.

Proposed fix. Restore --format to test-review.py's argparse (it is still documented in the script's own docstring and used by scripts/run_review_pipeline.sh, so restoring is the smaller change than removing three call sites), and delete 2>/dev/null from every invocation — that redirect is what converted a hard argparse error into a silent pass for 89 days.

Origin: R2·H-05 · Files: kimi/hooks/post-write-review.sh, kimi/hooks/subagent-stop-review.sh, nscripts/test-review.py, ntest-review.py, scripts/run_review_pipeline.sh, scripts/test-review.py

OA-027 — The gates cache lost 20 of 23 recorded verdicts between 09:33 and 12:39 today, and error_report.py has no denominator check that could notice

🔴 FATAL · false-green · ⏳ unverified · evidence: measured · state: production

Round 1 read .cache/gates.json at 09:33 with 24 entries recording mypy=false and plugin-drift=false. At 12:15:47 today it held 2 entries; at 12:39:35 it holds 3 — ast, prod-separation, validate-ci — all ok:true. scripts/gates.py defines 23 gates. So the battery's recorded verdict now covers 13% of the battery and records zero failures, and the two honest reds round 1 relied on are gone. scripts/gates.py::_load_cache returns {} when the file is missing or unreadable, so any deletion silently resets the record. scripts/error_report.py:203-206 then reports f"{len(entries)} gate(s); {cached} served from cache" and appends a FAIL line only for entries whose status key is non-PASS — it never compares len(entries) against the number of gates that exist. Absence of a verdict and a passing verdict are indistinguishable in its output. This compounds TOP-05: error_report cannot report red because it reads keys the producer never writes, AND cannot report incomplete because it has no denominator.

When it appeared. The mechanism is never-correct and dated to birth (see H-06): _load_cache's fail-to-empty and _save_cache's {fingerprint,ok} schema both entered at 07e5c255 on 2026-08-07 (16 days); error_report.py's status/verdict read and missing denominator both entered at 713ee031 on 2026-08-09 (14 days). The specific loss of the 24-entry cache is dated to a 3-hour window today, 2026-08-23 between 09:33 and 12:15:47, during the gap swarm. Recorded rationale: the fail-to-empty branch carries an inline comment ('a corrupt cache must never block a run') — a rationale for fail-open that is exactly systemic pattern #7; nothing records a rationale for the absent denominator.

Proposed fix. Three changes, in this order. (1) error_report.py must import the gate roster from gates.py and print N of 23 gates have a recorded verdict; M unknown, treating unknown as a loud non-pass. (2) error_report.py:201 must read ok, the key the producer actually writes. (3) _load_cache's fail-to-empty must distinguish 'missing' from 'corrupt' and say which in the run's output — silently starting from {} is how 20 verdicts vanished without a trace.

Origin: R2·H-09 · Files: cache/gates.json, error_report.py, gates.py, plans/system-analysis-2026-08-23.md, scripts/error_report.py, scripts/gates.py

OA-029 — The only CI that exists has never once been green on master: 1 success in 956 pipelines, 0 on master since 2026-04-18

🔴 FATAL · disconnection · ⏳ unverified · evidence: measured · state: production

Round 1 never read the remote's pipeline history and concluded "the enforcement layer has no automatic trigger". There IS an automatic trigger: GitLab CI has produced 956 pipelines. It has produced exactly ONE success in the project's entire history — pipeline 2557034680 on 2026-05-27 on branch ci/ci-green — and ZERO successes on master, from the first master pipeline on 2026-04-18 through the HEAD pipeline on 2026-08-22. The defect is not a missing trigger; it is a trigger that fires on every push and whose red verdict has been ignored for 126 consecutive days. A verdict nobody consumes is functionally identical to no verdict, but it is a different repair: the trigger does not need building, its output needs a consequence.

When it appeared. Never green. The red streak on master begins at the FIRST master pipeline, 2462935674 on 2026-04-18, and runs unbroken to HEAD's 2781400278 on 2026-08-22 — 126 days. This is never-wired-to-a-consequence, not a regression: there was no green state to regress from. The single lifetime success, 2026-05-27 on branch ci/ci-green (sha f9114dc9, commit "test/ci: green the test job — fix regression + guard CI-unrunnable tests"), shows the green was achieved on a dedicated branch and never landed on master.

Proposed fix. Do not build a new trigger. Make the existing one consequential: (a) make the master pipeline blocking on GitLab (protected-branch pipeline requirement), and (b) treat the 126-day red streak as the first repair, not a background condition. Until master can go green once, every claim of the form "a gate catches this" is unfalsifiable.

Origin: R2·H-01

OA-030 — The reviews/ dated write is what makes the pre-commit code-review gate a constant PASS — 12 ERRORs swallowed, measured today

🔴 FATAL · false-green · ⏳ unverified · evidence: measured · state: production

scripts/code-review.py:1966-1971 unconditionally writes a dated report into reviews/ before honouring --stdout. That write calls output_json(..., str(dated_path)), and output_json at :1152-1153 prints "JSON report written to {output_file}" to STDOUT. scripts/hooks/pre-commit:51-52 captures that same stdout and pipes it into json.load, so the parse ALWAYS raises on line 1 and the || echo 0 fallback sets ISSUE_COUNT=0. The gate can never see a finding. Round 1 (TOP-01) reported the fail-open as inferred and did not identify the cause; the cause is the reviews/ sink itself. I reproduced the exact production pipeline against a real production source file: stdout line 1 was the banner, json.load raised, ISSUE_COUNT=0, and the report that same run wrote recorded total_issues=12 with summary_by_severity {'ERROR': 12, 'WARNING': 6, 'INFO': 12}. Twelve ERROR-severity findings on a file that is currently failing the mypy gate would pass the pre-commit review branch today.

When it appeared. NEVER WIRED, not a regression. The stdout banner has existed since 2026-04-19 (81973ac8 "code review"), the only commit matching git log -S 'Always write a dated report to reviews/' -- scripts/code-review.py. The --stdout flag was added 2026-05-26 (03422f78 "feat(hooks): add --stdout flag to code-review.py, update hooks to use it"), but git cat-file -e 03422f78:scripts/hooks/pre-commit returns ABSENT — the live hook did not exist then. git log --diff-filter=A -- scripts/hooks/pre-commit returns exactly one commit: 854bc6d9 2026-07-27, and git show 854bc6d9:scripts/hooks/pre-commit | grep -n code-review shows the identical parse already at line 35 of its first version. The gate has b…

Proposed fix. Send the code-review.py:1153 banner to stderr (the sibling banner at :1990 already uses file=sys.stderr — this one was simply missed), OR make the dated reviews/ write conditional on not args.stdout. Then add a negative-corpus assertion to the hook: feed it a file with a known ERROR and require a non-zero ISSUE_COUNT, so the gate is required to demonstrate it CAN fail. Do not fix the hook's parse alone — the producer's contract is the defect.

Origin: R2·RS-01 · Files: R/scripts/code-review.py, R/src/orchestrata_ultimate/postman/governance.py, code-review.py, home/mohamed/workspace/orchestrata-ultimate-architecture/scripts/code-review.py, home/mohamed/workspace/orchestrata-ultimate-architecture/src/orchestrata_ultimate/postman/governance.py, reviews/code-review-2026-08-23-123443.json

OA-032 — The three CI jobs carrying all remaining enforcement abort in the runner in 11 seconds — 0 gate scripts execute on the remote today

🔴 FATAL · false-green · ⏳ unverified · evidence: measured · state: production

.gitlab-ci.yml — the only CI definition the remote can run — invokes exactly two gate scripts: scripts/architecture_checker.py and scripts/run_tests.py. Both live in jobs (architecture-check, test) that currently fail with failure_reason=runner_system_failure after ~11 seconds, alongside lint. That is not a code failure; it is the job dying before its script runs. Across the 12 most recent pipelines the signature is identical and uniform: 3 runner_system_failure, 2 skipped, 2 success. The two jobs that DO pass (vizint-compliance, vizint-provenance-e2e) run on the same runner (orchestrata-incus, id 54962152), so this is job-specific, not a runner outage. Net result: the number of enforcement scripts that actually execute on the project's only remote is zero, and the pipeline still reports per-job statuses that a reader could mistake for having been evaluated.

When it appeared. A REGRESSION with two dated steps. (1) 2026-07-19 through 2026-07-26: all jobs failed with ci_quota_exceeded — GitLab.com shared-runner minutes exhausted; the self-hosted orchestrata-incus runner was the response. (2) Between 2026-08-03 (script_failure, jobs executing) and 2026-08-19 (runner_system_failure, jobs not executing) the three jobs stopped running at all. The exact commit is not identifiable from the repo because the failure is in the runner's Incus executor environment, not in tracked CI YAML — .gitlab-ci.yml's last change is 3d0b6774 on 2026-08-16, which is inside that window and is the prime suspect (a subnet sweep touching CI comments). No commit records a rationale for accept…

Proposed fix. Fix the Incus executor for the three aborting jobs before touching anything else in the enforcement layer — while they abort, adding gates to CI adds nothing. Then make runner_system_failure a distinct, loud state in whatever reads pipeline status: an aborted job is 'not evaluated', which must never present the same way as 'evaluated and passed'.

Origin: R2·H-02 · Files: deploy/gitlab-runner/incus-executor/prepare.sh, deploy/gitlab-runner/incus-executor/run.sh, nscripts/architecture_checker.py, nscripts/run_tests.py, scripts/architecture_checker.py, scripts/run_tests.py

Enforcement & Gates

OA-002 — The git pre-commit hook reports 0 issues on a file with 4 ERROR findings — code-review.py prefixes its JSON with a stdout banner and the hook falls back to || echo 0

🔴 FATAL · false-green · ✅ confirmed · evidence: measured · state: `` · corroborated ×3

scripts/hooks/pre-commit — the live hook, since core.hooksPath=scripts/hooks — parses code-review.py's stdout as JSON, the parse always fails because output_json() unconditionally prints "JSON report written to " to stdout before the JSON, and the 2>/dev/null || echo 0 fallback turns every failure into ISSUE_COUNT=0, so the commit is never blocked.

Proposed fix. Fix the generator, not the caller: send the "JSON report written to" line at code-review.py:1153 to sys.stderr, matching line 1991. Then fix the caller too — scripts/hooks/pre-commit must use the script's exit code (already 1 on ERRORs) instead of re-deriving a count, must not swallow stderr with 2>/dev/null, and must not use || echo 0, which converts every failure of the gate into a pass. Bare python (=/usr/bin/python, the system interpreter) should be uv run python per platform convention.

Origin: R1·GATES-FG-002, R1·GATES-BYPASS-001, R1·CPLX-006 · Files: code-review.py, home/mohamed/workspace/orchestrata-ultimate-architecture/code-review.py, home/mohamed/workspace/orchestrata-ultimate-architecture/scripts/code-review.py, reviews/code-review-2026-08-23-090541.json, reviews/code-review-2026-08-23-090959.json, scripts/code-review.py

OA-004 — 25 of 57 live hook registrations — the entire .claude/settings.json project surface — did not fire in this subagent session

🔴 FATAL · disconnection · ✅ confirmed · evidence: measured · state: `` · corroborated ×2

Every hook registered in .claude/settings.json failed to execute for this session's tool calls, while user-scope plugin hooks executed normally on the same calls, so the project enforcement layer (single-gate-entrypoint, no-xdist, force-ast-toolkit, force-test-observation, no-unbounded-wait, force-trace-intel, proportionate-test-scope, no-doubles-py, no-banned-deps, require-design-before-build, workflow-default-sonnet, typecheck-on-write and the five Stop guards) is absent exactly in the sessions that do the building.

Proposed fix. Do not rely on .claude/settings.json registrations to constrain delegated agents. Either (a) move the enforcement guards onto a surface subagents load — the plugin declaration, which measurably fires here — or (b) make each project hook resolve its own repo root instead of cd "$CLAUDE_PROJECT_DIR" &&, and make an unresolvable root DENY rather than short-circuit to allow. Before either, instrument a main session the same way to establish whether the gap is subagent-specific or total; the current 'live PreToolUse guard' claim in plans/claude-surface-promotion-plan.md:157-159 ('live IMMEDIATELY in every session whose cwd is this repo') is false as written.

Origin: R1·HOOKREG-001, R1·HOOKREG-005 · Files: PREFIX/scripts/patch_settings.py, PREFIX/settings.hooks.json, PREFIX/settings.json, STAGE/claude/scripts/patch_settings.py, STAGE/claude/settings.hooks.json, claude/README.md

OA-007 — The architecture gate cannot fail: no local runner passes --strict, so architecture_checker.py always exits 0

🔴 FATAL · false-green · ✅ confirmed · evidence: measured · state: `` · corroborated ×2

scripts/architecture_checker.py returns 0 for any number of layer, DI-container, direct-driver and graph-seam violations unless --strict is passed, and four of the five runners that invoke it — including scripts/gates.py, the guard-enforced battery — omit the flag.

Proposed fix. Add --strict to gates.py:66, scripts/health_check.py:79 and .pre-commit-config.yaml:38, or invert the default so violations exit 1 and a --report-only flag opts out. The source comment at architecture_checker.py:681 ("In non-strict mode we exit 0 so the gate passes while violations are documented") is the defect, not a note about it — a gate whose default is 'document, do not fail' is not a gate. gates.py's own mypy entry already states the correct principle ("THE SAME COMMAND CI's lint job runs"); the architecture entry violates it, since CI runs src/ --strict and the battery runs src/orchestrata_ultimate non-strict — a different scope AND a different verdict rule.

Origin: R1·GATES-FG-001, R2·ARCH-01 · Files: architecture_checker.py, cache/gates.json, gates.py, github/workflows/ci.yml, home/mohamed/workspace/orchestrata-ultimate-architecture/.pre-commit-config.yaml, home/mohamed/workspace/orchestrata-ultimate-architecture/scripts/architecture_checker.py

OA-009 — The pre-commit test-review gate has never executed — its invocation is an argparse error

🔴 FATAL · false-green · ✅ confirmed · evidence: measured · state: `` · corroborated ×2

scripts/hooks/pre-commit invokes scripts/test-review.py with a --format flag that test-review.py does not define, so the command exits 2 before running any check, stderr is discarded, and the hook records zero issues for every staged test file.

Proposed fix. Either add a real --format json emitter to test-review.py or change the hook to consume its exit code (1 = ERROR found) instead of parsing JSON. Remove 2>/dev/null and || echo 0 from both branches so an unparseable or failing gate blocks the commit.

Origin: R1·GATES-BYPASS-002, R1·PURITY-002 · Files: home/mohamed/workspace/orchestrata-ultimate-architecture/scripts/test-review.py, ntest-review.py, scripts/code-review.py, scripts/test-review.py, test-review.py, tests/core/test_gate_waivers.py

OA-010 — gates.py --only <unknown-name> prints ALL GATES PASS and exits 0 having run zero gates

🔴 FATAL · false-green · ✅ confirmed · evidence: measured · state: `` · corroborated ×2

main() builds selected by filtering GATES against --only without validating the names, so a typo, a renamed gate, or a removed gate name yields an empty selection, an empty failure list, the literal line '[gates] ALL GATES PASS', and exit code 0.

Proposed fix. Reject unknown --only names with exit 2 and a list of valid gates before any work. The output string 'ALL GATES PASS' is quoted as evidence of a green battery in docs/development-and-testing.md:406 and in commit messages, and a zero-gate run produces a byte-identical string — the reader cannot tell them apart.

Origin: R1·GATES-FG-004, R1·GATES-BYPASS-003 · Files: cache/gates.json, gates.py, home/mohamed/workspace/orchestrata-ultimate-architecture/scripts/gates.py, scripts/gates.py

Runtime & Deployment

OA-001 — 7 of 8 prod units execute the DEV checkout's interpreter at every start

🔴 FATAL · drift · ✅ confirmed · evidence: measured · state: `` · corroborated ×5

Every orchestrata/orchgraph unit except orchestrata-history-mining runs /home/mohamed/.local/bin/orchestrata-kg-ready as a non-optional ExecStartPre, and that script's shebang binds /home/mohamed/workspace/orchestrata-ultimate-architecture/.venv/bin/python, so the production services cannot start without executing code out of the live development git checkout.

Proposed fix. Move the readiness probe into the prod tree (e.g. prod/orchestrata-ultimate/deploy/orchestrata-kg-ready) and change all 7 ExecStartPre lines in deploy/systemd/*.service to /home/mohamed/prod/orchestrata-ultimate/.venv/bin/python /home/mohamed/prod/orchestrata-ultimate/deploy/orchestrata-kg-ready. Fix the unit templates in deploy/systemd/ and plugins/orchestrata/systemd/, not the installed copies — deploy/systemd/install.sh re-installs from the repo and would revert a hand-patch.

Origin: R1·RUNTIME-001, R1·RUNTIME-ENVSEP-001, R1·RUNTIME-DEPLOY-001, R1·RUNTIME-DEPLOY-002, R1·RUNTIME-003 · Files: check_prod_tree_separation.py, deploy/install-claude-config.sh, deploy/ship.sh, deploy/systemd/orchestrata-kg-ready.py, home/mohamed/.config/systemd/user/orchestrata-ast-live-sync.service, home/mohamed/.config/systemd/user/orchestrata-bot.service

OA-006 — Deployed turn-capture hook defaults REDIS_HOST to localhost — RUL-003 violated in production

🔴 FATAL · false-green · ✅ confirmed · evidence: measured · state: `` · corroborated ×2

claude/tools/claude_turn_capture.py:101-102 supplies literal fallbacks "localhost" and "6379" for REDIS_HOST/REDIS_PORT, the file is deployed byte-identical to ~/.claude/tools/claude_turn_capture.py and registered as a live hook in every project, and the process is fail-open with sys.exit(0) so the fallback produces silent turn-capture loss instead of a loud configuration error.

Proposed fix. Route _build_redis_client through core.redis_factory.resolve_redis_host/resolve_redis_port (both verified to raise under env -i), or read the keys with a one-arg get and raise naming the key. Then close the two detector holes (INFRA-CONTRACTS-002 and -003) in the same change, because fixing only this file leaves the class of defect undetectable.

Origin: R1·INFRA-CONTRACTS-001, R1·TESTS-ORACLE-002 · Files: CLAUDE_PROJECT_DIR/.env, HOME/.claude/tools/claude_turn_capture.py, HOME/.env, claude/hooks/ast_sync_hook.py, claude/settings.hooks.json, claude/tools/claude_turn_capture.py

OA-023 — SPEC-020's audit trail has zero writers and zero sinks while its checklist is 240/240 checked

🔴 FATAL · missing · ✅ confirmed · evidence: measured · state: ``

Every hook SPEC-020 names as an audit writer is deployed to ~/.claude/hooks/ and registered on none of the six live registration surfaces, and neither mandated sink — ~/.claude/audit/ nor ~/.claude/logs/file_operations.log — exists, so nothing the harness does is recorded.

Proposed fix. Two separable defects, both to be fixed rather than documented away. (1) Wire the four audit writers into claude/settings.hooks.json and plugins/orchestrata/hooks/hooks.json by regenerating from the generator (gen_plugin.py), not by hand-editing the deployed cache — posttool_auditor on PostToolUse(.*), log_operation on PreToolUse(Write|Edit|Bash), stop_auditor on Stop, stop_auditor_subagent on SubagentStop — then verify by asserting ~/.claude/audit/sessions/ is non-empty after one turn. (2) Either add the file_operations.log append to intercept_bash/intercept_write/intercept_edit, or amend spec.md:793 and :806 which currently assert a behaviour those hooks have never had. Separately, specs/020-claude-code-harness/checklists/requirements.md at 240/240 checked is an unverified ass…

Origin: R1·OBS-RUNTIME-002 · Files: __init__.py, block_except_pass.py, claude/plugins/cache/orchestrata/orchestrata/1.3.0/hooks/hooks.json, claude/settings.hooks.json, claude/settings.json, claude/settings.local.json

OA-036 — scripts/error_report.py can never report a failed gate — key-name mismatch with the cache it reads

🔴 FATAL · false-green · ✅ confirmed · evidence: measured · state: ``

scripts/error_report.py::gates classifies each gate by body.get("status") or body.get("verdict"), keys that scripts/gates.py::_save_cache never writes, so the tool banner-titled "read this before reporting status" printed "No red finding in the artifacts read" and exited 0 while the cache it had just read recorded two gates as failed.

Proposed fix. Fix the reader at the layer the defect manifests: make scripts/error_report.py::gates read the ok boolean that scripts/gates.py::_save_cache actually writes, and make build_report return non-zero when any gate has ok=false. Add a test that writes a cache with one ok=false entry and asserts the report contains a FAIL line and a non-zero exit — an oracle that can fail. The cached/reused display path is likewise dead against this schema and must either be wired to a key gates.py emits or removed.

Origin: R1·OBS-RUNTIME-001 · Files: cache/gates.json, home/mohamed/workspace/orchestrata-ultimate-architecture/.cache/gates.json, home/mohamed/workspace/orchestrata-ultimate-architecture/scripts/error_report.py, home/mohamed/workspace/orchestrata-ultimate-architecture/scripts/gates.py, reports/run-tests-latest.json, scripts/error_report.py

Docs & Knowledge

OA-005 — Deleted generator still declared by a tracked artifact; the loss-detector reports OK

🔴 FATAL · false-green · ✅ confirmed · evidence: measured · state: `` · corroborated ×2

reports/kg-dialect-failures-2026-07-26.md names scripts/kg_dialect_preflight.py as its generator, that script was deleted on 2026-07-27 in commit e73df607, and the generated-artifacts gate prints "generator provenance satisfied" because its header-discovery regex cannot cross a backtick and its scan never covers reports/.

Proposed fix. In scripts/check_generated_artifacts.py, add optional opening-quote tolerance to _HEADER_GENERATOR_RE, and extend both check_generator_headers and scan_generator_headers defaults from ("tests","src","docs") to include "reports", "plans", "claude", ".claude", "scripts", "specs", "infra", "plugins", "deploy". Then decide reports/kg-dialect-failures-2026-07-26.md: restore scripts/kg_dialect_preflight.py from e73df607~1, or retire the artifact — retirement needs the user's explicit approval per the gate's own remedy language. Add a regression test in tests/scripts/test_check_generated_artifacts.py that fixtures a backticked "Generated by scripts/gone.py" header under reports/ and asserts a [LOSS] violation.

Origin: R1·DOCS-GENROT-001, R2·AF-02 · Files: docs/LEVEL0.md, generate_pytest.py, home/mohamed/workspace/orchestrata-ultimate-architecture/reports/kg-dialect-failures-2026-07-26.md, home/mohamed/workspace/orchestrata-ultimate-architecture/scripts/check_generated_artifacts.py, nreports/kg-dialect-failures-2026-07-26.md, plans/rtm.md

OA-016 — 36 gRPC claims in the always-loaded doc tier describe a transport the code REJECTS at runtime

🔴 FATAL · contradiction · ✅ confirmed · evidence: measured · state: ``

AGENTS.md, CLAUDE.md, docs/LEVEL0.md and docs/CODEBASE_MAP.md state 36 times that the kernel speaks gRPC on port 50053, while cxp_transport() raises ValueError on CXP_TRANSPORT=grpc, all three env profiles pin CXP_TRANSPORT=cxpt, create_cxp_server has no gRPC branch, grpcio/grpcio-tools/grpc are listed in .claude/banned-libraries.txt as RETIRED 2026-08-07, and import grpc fails in the project venv.

Proposed fix. Fix the GENERATOR first: replace 'gRPC' with 'cxpt' at scripts/gen_level0.py:165 and :206 and at scripts/gen_codebase_map.py wherever it emits the kernel row, then regenerate. Hand-edit the 27 remaining mentions in AGENTS.md and CLAUDE.md (they have no generator). Then add 'grpc' presented as the CURRENT kernel transport to doc_lint's _STALE_PATTERNS — this is exactly the retired-infrastructure class check 1 exists for, and it caught none of the 36 because the pattern list stops at 10.222.9.x / swiplserver / MQI / gatekeeper-neo4j.

Origin: R1·DOCS-TRUTH-003 · Files: docs/CODEBASE_MAP.md, docs/LEVEL0.md, docs/kernel-is-required.md, env/dev.env, gen_level0.py, home/mohamed/workspace/orchestrata-ultimate-architecture/AGENTS.md

OA-018 — AGENTS.md names a different, 4-month-stale git repository as the edit target

🔴 FATAL · contradiction · ✅ confirmed · evidence: measured · state: ``

AGENTS.md:285 tells a fresh agent the work-in-progress target is /home/mohamed/workspace/orchestrata-ultimate/src/orchestrata_ultimate/, which is a separate git repository with a different remote, a HEAD from 2026-04-11 and 41 Python modules, not this checkout's 868.

Proposed fix. Change AGENTS.md:285 to the repo-relative 'src/orchestrata_ultimate/' as CLAUDE.md:41 already has it. AGENTS.md:13, :284, :310, :387 and :1023 correctly name the frozen SOURCE monorepo at /home/mohamed/workspace/orchestrata/packages/ — only :285 points outward. Add a doc_lint check that every absolute /home/mohamed path in a doc resolves inside this repo or into the declared frozen source.

Origin: R1·DOCS-ONBOARD-001 · Files: home/mohamed/workspace/orchestrata-ultimate-architecture/AGENTS.md

OA-019 — All 10 documented session subcommands fail on the CLI a fresh agent resolves, including the startup-protocol entry point

🔴 FATAL · contradiction · ✅ confirmed · evidence: measured · state: ``

The session binary on a fresh agent's PATH is /home/mohamed/.local/bin/session, whose argparse dispatch accepts none of the 10 subcommands CLAUDE.md and AGENTS.md document; every one exits 2, including session overview, which AGENTS.md:76-100 makes the first command of the Automatic Startup Protocol.

Proposed fix. Pick one CLI as the project's session entry point and make every doc name it explicitly. Either write .venv/bin/session <verb> throughout CLAUDE.md:56-62 and AGENTS.md:221-280 (the .claude/hooks/session-overview.sh hook already does exactly this at line 22), or add the click verbs to ~/.claude/tools/session_cli.py so the PATH-resolved binary honours the documented surface. A verb-parity test between the two entry points would have caught the divergence.

Origin: R1·DOCS-ONBOARD-002 · Files: home/mohamed/workspace/orchestrata-ultimate-architecture/AGENTS.md, home/mohamed/workspace/orchestrata-ultimate-architecture/CLAUDE.md

Knowledge Graphs

OA-008 — The live production kernel and gateway resolve their semantic-retrieval corpus to 61 stale agent-worktree files, not the source tree

🔴 FATAL · drift · ✅ confirmed · evidence: measured · state: production · corroborated ×2

~/prod/orchestrata-ultimate/.env:58-59 sets MEMGRAPH_CHUNK_LABEL=SemanticChunk and MEMGRAPH_VECTOR_INDEX_NAME=semantic_chunk_embedding_idx. orchestrata-kernel.service:27 loads that file as EnvironmentFile=, and env/prod.env (layered at :32) does not override either key. SemanticGraphConfig.from_env() (config.py:108) therefore returns chunk_label='SemanticChunk' in production, and knowledge_graph/semantic_bridge.py:73-74 issues MATCH (c:{chunk_label}) WHERE toLower(c.content) CONTAINS $term against it — this is the retrieval leg of render_semantic_context (SPEC-107 REQ-107-015) and of the search_code_semantic volk tool (tools/context_tools.py:621,653,676). Measured live: all 1,418 :SemanticChunk nodes come from 61 distinct sources, every one under .claude/; 1,274 of them (89.8%) from .claude/worktrees/agent-a578908f534234feb/. The corpus contains agent prompt markdown, .claude/settings.json, .claude/settings.local.json and three SKILL.md files. It contains zero files from src/, docs/, specs/ or any other source root. The current 7,334-chunk CodestralChunk index — which IS byte-current — is never queried by this path.

When it appeared. NEVER CORRECTLY WIRED, with a compounding regression. config.py's default became CodestralChunk on 2026-07-08 (git log -S 'chunk_label: str = "CodestralChunk"' -- src/.../semantic_graph/config.py -> fb9d233c 2026-07-08). .env.example added the SemanticChunk/semantic_chunk_embedding_idx override three days later, 2026-07-11 (git log -S 'MEMGRAPH_VECTOR_INDEX_NAME' -- .env.example -> c51076d6, 'env contract — complete .env.example + validate_env preflight (R2)'), and the override has never matched the ingest label since. c3e37a54 (2026-08-09, 'Name the vector space after whatever filled it') made the label backend-derived and did not update .env.example. .env itself is untra…

Proposed fix. Delete MEMGRAPH_CHUNK_LABEL and MEMGRAPH_VECTOR_INDEX_NAME from .env, ~/prod/orchestrata-ultimate/.env and .env.example, and make SemanticGraphConfig.from_env() derive both from embedder_factory.chunk_label()/vector_index_name() so there is ONE resolution path instead of two. Add a startup assertion in the adapter that the configured index's declared dimension equals embed_dimension() and that the configured label is the one the selected backend writes — refuse to serve retrieval otherwise. Then re-run the six probe queries against the kernel path and require non-zero hits on a symbol added in the last 48h.

Origin: R2·GRAPH-01, R2·GRAPH-13 · Files: claude/settings.json, claude/settings.local.json, config.py, embedder_factory.py, env/prod.env, home/mohamed/.config/systemd/user/orchestrata-kernel.service

OA-012 — 1,236 legacy requirement ids live in the production KG after the commit that declared their return impossible

🔴 FATAL · false-green · ⏳ unverified · evidence: measured · state: production

Commit fb167c13 (2026-08-19) 'refactor(specs): eliminate legacy story ids corpus-wide and make their return impossible' migrated 47,715 occurrences across 388 files and installed three enforcement layers (a grammar that rejects the shape, a counter, and a corpus-guard test that 'scans every file'). All three are file scanners. The production operational KG — the storage tier that context injection actually reads — still serves 1,236 requirement ids in the legacy REQ-NNN-USn-MMM form. Disk carries 0. check_req_format.py's DEFAULT_ROOTS is ('specs', 'src/orchestrata_ultimate', 'tests') and the file contains 0 occurrences of graph/cypher/memgraph/bolt/orchkg.

When it appeared. REGRESSION dated exactly: the guarantee was made on 2026-08-19 17:42:05 -0400 in fb167c13 and was false for the graph at the moment it was made. Measured 2026-08-23 — 4 days later, still 1,236. The graph's copies predate the migration; the last spec write into orchkg is before 2026-07-23 (see GS-04).

Proposed fix. Add a graph arm to check_req_format.py (or a new gate) that runs the same grammar over :RequirementItem.req_tag in orchkg and fails on any legacy hit, and sweep the 1,236 existing nodes. Until then no 'legacy ids are gone' claim is true of the system, only of its files.

Origin: R2·GS-03 · Files: check_req_format.py, scripts/check_req_format.py, scripts/migrate_legacy_story_ids.py, tmp/.../legacy_ids_in_graph.py

OA-015 — 23.6% of the production operational KG is unreachable from any :Project root — regression from a measured 0 on 2026-07-26, gate exits 1 and nothing runs it

🔴 FATAL · disconnection · ✅ confirmed · evidence: measured · state: production

The session-254 ruling states that every node in the operational KG must be reachable from a root :Project node. In production right now 67,665 of 286,576 nodes (23.6%) are not. The checker built to enforce it, scripts/check_kg_connectivity.py, works correctly and exits 1 — it is registered in scripts/health_check.py:644 as a REQUIRED (not advisory) check, and scripts/health_check.py itself is invoked by no CI job, no systemd unit, no git hook, no ship stage and no gate. It is not one of the 24 entries in scripts/gates.py::GATES. The invariant has therefore been false and unobserved for four weeks.

When it appeared. REGRESSION, precisely bracketed. Commit c33e6bdd (2026-07-26 05:16 'Root-connectivity: writer fixes + BFS gate wired into health_check') records in its own message: 'Live gate: 66,160/66,160 reachable, UNREACHABLE=0, exit 0.' The context.json backlog entry recording growth to 8,447 unreachable is timestamped 2026-07-27T14:57:18 — one day later. Today 2026-08-23 12:10 it is 67,665, an 8x growth on the last recorded number. git log -S 'compute_connectivity' -- scripts/health_check.py returns nothing after c33e6bdd, so the wiring into health_check was never removed — health_check itself simply has no runner.

Proposed fix. Give health_check.py an automatic trigger, or lift check_kg_connectivity.py into scripts/gates.py::GATES as a live-infra gate. Then repair the data: the three subtrees without a :Project root are KG-04 and KG-05; deleting those two stale subtrees removes 1796 of 1796 orphan Modules, 13,344 of 13,344 orphan Methods, 3,485 of 3,485 orphan Classes, 4,202 of 4,202 orphan Functions and 37,489 of 37,489 orphan Parameters — i.e. the whole code-layer orphan set — leaving only the 5,551 conversation-layer orphans. Pin the invocation to the venv interpreter, not bare python.

Origin: R2·KG-01 · Files: deploy/ship.sh, env/prod.env, github/workflows/ci.yml, health_check.py, home/mohamed/workspace/orchestrata-ultimate-architecture/context.md, home/mohamed/workspace/orchestrata-ultimate-architecture/scripts/check_kg_connectivity.py

OA-035 — Zero TRACES_TO edges in the production KG: two incompatible node-id schemes

🔴 FATAL · disconnection · ⏳ unverified · evidence: measured · state: production

The operational knowledge graph orchkg contains 0 TRACES_TO relationships against 8,026 @traces-decorated entities in src/ citing 3,109 distinct requirement ids. The trace writer builds entity ids as {project}:{rel_path}::{Class}.{method}; the writer that actually populates the live graph (GraphSyncer, via canonical_schema.project_qualified_id) builds them as {project}:{dotted.qualified_name}. Zero of the 47,003 live Class/Function/Method nodes contain '::', so the MERGE in _write_trace_relationships can never match a node. Four production readers query TRACES_TO and get nothing back: kernel/pipeline_kg.py:37 (KgRelevanceRetriever), context_injector.py:1303, requirement_resolution.py:161, context_pack/relevance.py:176.

When it appeared. NEVER-WIRED against the live writer, not a regression. The '::' entity_id was introduced 2026-07-12 in 9cc64537 'fix(kg): project-scoped AST + spec-tier identity — multi-project wave W2' (git log -S 'entity_id = f"{pid}:{rel_path}::'). The canonical dotted project_qualified_id was introduced 2026-07-22 in f51b5d67 'fix(tests+kg): eliminate parallel-collision failure classes across the suite' (git log -S 'def project_qualified_id'). The two schemes have coexisted for 32 days. I could not establish whether TRACES_TO edges existed before 2026-07-12: the graph carries no history and this file's git history begins 2026-06-18 (b46336d6).

Proposed fix. Make _accumulate_trace_info and _stage_code.py call canonical_schema.project_qualified_id instead of hand-building '{pid}:{rel}::{name}'. Then add a gate that asserts TRACES_TO count > 0 and that a sample of @traces citations resolves end-to-end in the graph — the current sync reports 'relationships_created += 0' as success, which is measurement trap #6 (success asserted against the wrong oracle).

Origin: R2·GS-01 · Files: context_injector.py, context_pack/relevance.py, kernel/pipeline_kg.py, requirement_resolution.py, scripts/graph_query.py, src/orchestrata_ultimate/kernel/pipeline_kg.py

Supply Chain & Payloads

OA-013 — 11 real GIL-flip test failures were reclassified as flakes and superseded by solo passes; CI records them in an artifact nothing reads

🔴 FATAL · false-green · ⏳ unverified · evidence: measured · state: production

scripts/run_tests.py re-runs every batch-failed module alone and lets the solo pass OVERWRITE the batch failure, logging the discarded failure to .flake_recoveries.ndjson as a 'load/order flake'. A GIL re-enablement is not a flake: it is a deterministic, irreversible, process-wide state change caused by a sibling module in the same batch. The log holds 11 such discarded failures across 7 distinct days (2026-08-11 to 2026-08-21 20:23, the most recent run) over three victim modules. .gitlab-ci.yml:224 collects .flake_recoveries.ndjson as a job ARTIFACT only — no job reads it, no threshold, no failure condition — so every one of these runs reported green.

When it appeared. FIRST OBSERVED 2026-08-11T20:55:30, MOST RECENT 2026-08-21T20:23:28 (2 days before this analysis), 7 distinct days. Solo-recovery itself was introduced with the rationale dated 2026-07-10 in the run_tests.py docstring. This is a NEVER-WIRED gap, not a regression: solo-recovery was designed for genuine order flakes and no supersede-exclusion for hard-state failures was ever specified. The .flake_recoveries.ndjson file starts 2026-07-10T04:14:36, so the log predates the GIL records by a month — the GIL class appeared 2026-08-11.

Proposed fix. Make solo-recovery refuse to supersede a failure whose text names an irreversible process-state condition (start with 'The GIL is enabled'): those are order-DEPENDENT, not order-FLAKY, and a passing solo run proves nothing about the batch. Then add a CI job that reads .flake_recoveries.ndjson and fails the pipeline on any GIL record — the artifact is already collected; only the consumer is missing.

Origin: R2·GS-01 · Files: home/mohamed/workspace/orchestrata-ultimate-architecture/.gitlab-ci.yml, home/mohamed/workspace/orchestrata-ultimate-architecture/scripts/run_tests.py, run_tests.py, scripts/run_tests.py, tests/scripts/test_code_intel.py, tests/tools/test_codebase_query_tools.py

OA-025 — SentenceTransformerEmbedder._load_model() flips the GIL process-wide and irreversibly; 6,535 of 33,259 collected tests run after it

🔴 FATAL · risk · ⏳ unverified · evidence: measured · state: production

src/orchestrata_ultimate/semantic_graph/embedders.py:375 defers from sentence_transformers import SentenceTransformer into _load_model(). That import loads tokenizers.tokenizers, which has not declared it can run without the GIL, so CPython re-enables the GIL for the whole process and never turns it back off. The flip happens BEFORE the model can fail — measured with a nonexistent model name, the GIL was on after RepositoryNotFoundError. tests/semantic_graph/test_embedders.py's _load_qwen_model() calls it (CUDA is available on this machine and the 1.2 GB model is cached), and that module sits at collection positions 26722-26743 of 33259, leaving 6,535 tests (19.6%) to execute in a GIL-ENABLED interpreter in the same process. Reproduced end-to-end in the suite's own default order.

When it appeared. The collision became possible 2026-07-18 (8a471f56 'prolog codeintel: janus is THE query transport — fail-fast, no fallback' added both _assert_free_threaded and test_assert_free_threaded_injection_seam), 36 days ago. The trigger side is older: 5f0d3edb 2026-07-08 added SentenceTransformerEmbedder, its deferred sentence_transformers import and _load_qwen_model in one commit; tokenizers and triton entered uv.lock the same day (51c8e3a2 2026-07-08). NEVER WIRED, not a regression — no commit ever mediated between the two. Env profiles made local the dev/test default later still (aac1b552 2026-08-09), but the test fixtures hard-construct SentenceTransformerEmbedder and never read the profile, s…

Proposed fix. Move the sentence-transformers import out of the shared test process: run the local-embedder tests in a dedicated pytest subprocess (their own batch, scheduled last), or gate _load_model() behind an explicit opt-in that the batched runner never sets. Do NOT 'fix' it by monkeypatching or skipping — both are banned here. Long term the only durable fix is upstream: tokenizers must declare Py_MOD_GIL_NOT_USED, or be vendored free-threaded the way tree-sitter and janus already were.

Origin: R2·GS-02 · Files: docs/free-threaded-prolog.md, home/mohamed/workspace/orchestrata-ultimate-architecture/src/orchestrata_ultimate/semantic_graph/embedders.py, home/mohamed/workspace/orchestrata-ultimate-architecture/src/orchestrata_ultimate/tools/codebase_tools.py, home/mohamed/workspace/orchestrata-ultimate-architecture/tests/semantic_graph/test_embedders.py, home/mohamed/workspace/orchestrata-ultimate-architecture/tests/tools/test_codebase_tools.py, nsrc/orchestrata_ultimate/tools/codebase_tools.py

OA-033 — The un-rotated DEEPSEEK_API_KEY in pushed git history is the same key production uses today

🔴 FATAL · risk · ✅ confirmed · evidence: measured · state: production

.env.pre-orchgraph-cutover.1783689323 survives in three commits reachable from origin/master (pushed to git@gitlab.com:MSamy/orchestrata-ultimate-architecture.git) carrying four non-empty credential values. One of them, DEEPSEEK_API_KEY (len=35, sha256[:12]=de1581d0d6e6), is byte-identical to the value currently in .env (dev, mode 600), ~/.env (mode 600) and ~/prod/orchestrata-ultimate/.env (mode 644) — the file seven running production units load via EnvironmentFile=. GITLAB_TOKEN (64->61 chars, sha 53a7f1e7a837 -> 07811e427394) and OPENROUTER_API_KEY (sha 5a08aa1697e2 -> 58f2a82c19b5) WERE rotated; NEO4J_PASSWORD no longer appears in any live env file. So 1 of 4 leaked credentials remains live and unrotated. I did not and will not test the credential against DeepSeek; the identity claim is a sha256 comparison of the historical blob against the live production env file.

When it appeared. Committed 2026-07-10 (a8189e51), re-committed 2026-07-27 (e39f8d16 init, bdafa201), removed from the working tree 2026-08-12 (d08aaf60) whose own message states: "removing it from history and rotating those credentials are separate decisions, not closed by this commit." Neither decision has been taken in the 11 days since. NOT a regression — an explicitly deferred remediation that was never completed.

Proposed fix. Rotate DEEPSEEK_API_KEY now — it is the only one of the four still live. Then either purge the blob from history (git filter-repo + force-push, coordinated) or accept it in writing and record the acceptance. Add a history-scanning gate (see SEC-06); check_secret_leaks.py structurally cannot see this.

Origin: R2·SEC-01 · Files: env, home/mohamed/.env, home/mohamed/prod/orchestrata-ultimate/.env, home/mohamed/workspace/orchestrata-ultimate-architecture/.env, prod/orchestrata-ultimate/.env

OA-034 — Two live credentials sit in plaintext in every one of the 14 retained backup snapshots (8.86 GiB, unencrypted, inside the DEV checkout)

🔴 FATAL · risk · ⏳ unverified · evidence: measured · state: production

The orchkg snapshot inside every retained backup run contains the live GITLAB_TOKEN and the live GDRIVE_CLIENT_SECRET in plaintext. GDRIVE_CLIENT_SECRET in the 2026-08-23 snapshot is byte-identical to the value in ~/.env (both len=35, sha256 prefix 0ff705e9158fb842 on both sides) and appears 6 times. The GITLAB_TOKEN string captured from the snapshot (len=48) is a proven substring of the live ~/.env GITLAB_TOKEN (len=61) — shell case-match returned 'snapshot token IS a substring of the live GITLAB_TOKEN in ~/.env'. A retired NEO4J_PASSWORD (len=10) is also present; the live ~/.env value for that key is now empty. Provenance is exact: the bytes sit inside a conversation-turn node in the orchkg database (project orchestrata-ultimate, turn id e7e858d8-c38d-4f37-ba54-71dc45353984, role assistant, source claude-code, timestamp 2026-07-18T17:47:45.566Z) whose text quoted the PAT verbatim out of a Todoist task description — and which, in the same message, warned that 'a PAT sitting in a Todoist task description is readable by anything with Todoist access'. The ingestion path performs no redaction: grep -i 'redact|scrub|sanitiz|secret|glpat|mask' over claude/tools/claude_turn_capture.py returns zero hits. Every one of the 14 retained runs (2026-08-10 through 2026-08-23) contains a glpat- match; the archive is 0640 files under 0755 directories, unencrypted, gitignored at .gitignore:277, and single-copy.

When it appeared. The credential entered the conversation corpus 2026-07-18T17:47:45.566Z (timestamp carried on the turn node itself). The backup archive begins 2026-07-26 (first run 20260726-063202, pruned; backup.log line 5). All 14 CURRENTLY retained runs, 2026-08-10 through 2026-08-23, carry it — verified individually. This is NEVER-WIRED, not a regression: claude/tools/claude_turn_capture.py has carried zero redaction across its entire tracked history (b3a85cb7 2026-08-14, 993f9f00 2026-08-14, 5fe467e4 2026-08-16 — grep for redact/scrub/sanitiz/mask/secret returns 0 hits at HEAD). The archive path itself was pinned into the DEV tree deliberately on 2026-08-16 04:49:52 by f68876cf.

Proposed fix. Treat both credentials as disclosed and rotate them now: revoke the GitLab PAT (memory records the canonical store as ~/.env with copies to sync, and the replacement flow via the Todoist 'Code'/'glab' task) and rotate the Google Drive OAuth client secret. Rotation alone is not the fix — the archive keeps whatever the graph holds, so also (a) purge the offending turn node from orchkg and re-snapshot, (b) add a redaction pass to the turn-capture ingestion path keyed on the same prefix corpus scripts/check_secret_leaks.py already defines (glpat-/ghp_/sk-ant-/GOCSPX-/AKIA/hf_) so credentials never reach the graph, and (c) encrypt the archive at rest or move it out of the checkout (see GAP-BKP-03). Do NOT rely on rotating and leaving the old value in 14 snapshots — a revoked GitLab PAT is stil…

Origin: R2·GAP-BKP-01 · Files: claude/tools/claude_turn_capture.py, env, home/mohamed/.env, home/mohamed/workspace/orchestrata-ultimate-architecture/claude/tools/claude_turn_capture.py, home/mohamed/workspace/orchestrata-ultimate-architecture/secrets/env.sops.env

Tests & Verification

OA-011 — 1,074 generated smoke tests cannot fail — no assertion plus a blanket exception swallow

🔴 FATAL · false-green · ✅ confirmed · evidence: measured · state: ``

Every one of the 1,074 generated *_smoke tests has zero assert statements and catches every Exception from the code under test with a handler whose entire body is return, so it reports PASS regardless of what the code returns or raises.

Proposed fix. Fix the generator, not the 271 generated files: scripts/generate_pytest.py:1387-1441. A smoke test that swallows everything is worth nothing — either (a) drop the blanket handler so an unexpected exception fails the test and keep a narrow except TypeError only for the dummy-argument mismatch the comment actually justifies, plus an explicit pytest.fail when construction succeeds and the call raises anything else, or (b) delete the smoke template entirely and keep only the _interface tests, which do discriminate. Then regenerate. Do NOT hand-patch the 1,074 sites.

Origin: R1·TESTS-FALSEGREEN-001 · Files: reconcile.py, scan.py, scripts/generate_pytest.py, test_template_cannot_fail.py, tests/generated_agents/test_prolog_bridge_generated.py, tests/generated_agents/test_volks_codedirector_review_checks_generated.py

Specs & Requirements

OA-022 — SPEC-007 declares 11 engineering constitutional articles; the enforced constitution declares 12 ethics articles with zero name overlap

🔴 FATAL · contradiction · ✅ confirmed · evidence: measured · state: ``

SPEC-007 Prolog Governance (Status: Complete) specifies a constitution of 11 engineering rules that shares not one article name with the 12-article ethics constitution that src/orchestrata_ultimate/prolog/constitutional.pl actually defines and that intent_policy.pl queries at runtime.

Proposed fix. Do not resolve by guessing. Present both sets to the human owner: the code+checklist ethics constitution (12 articles) is what governs live decisions, so SPEC-007 §'The 11 Constitutional Articles' and SPEC_INVENTORY §Governance are the two documents that must be rewritten to the 12-article ethics set — and the 11 engineering rules they currently hold need a new home (they are already stated in CLAUDE.md Key Rules and AGENTS.md, so the honest fix may be deletion rather than relocation). Then add a gate that asserts every constitutional_article/4 fact has a matching spec table row and vice versa, so the two can never drift again.

Origin: R1·SPECS-CONTRA-001 · Files: specs/007-prolog-governance/checklists/requirements.md, specs/007-prolog-governance/spec.md, specs/SPEC_INVENTORY.md, src/orchestrata_ultimate/prolog/constitutional.pl, src/orchestrata_ultimate/prolog/intent_policy.pl

Unopened Surfaces

OA-028 — The only --strict enforcement of the standard has not executed its script since 2026-08-11 — 160+ consecutive infrastructure failures, 0 successes

🔴 FATAL · disconnection · ✅ confirmed · evidence: measured · state: production

.gitlab-ci.yml:271 is the single place in the system that runs the checker with --strict: uv run --no-project python scripts/architecture_checker.py src/ --strict. That job has failed at executor preparation on every pipeline since 2026-08-11T20:26:36Z, dying with 403 Forbidden fetching registry.gitlab.com/msamy/orchestrata-ultimate-architecture/ci:latest before a single script line runs. The architecture rule has had ZERO working automatic enforcement for 12 days. Round 1 never read GitLab pipeline history and so could not see this.

When it appeared. REGRESSION, dated to the hour. Last green: 2026-08-10T17:54:21Z (job 15815547499, sha 9ec6806e). First red: 2026-08-11T20:26:36Z (job 15842330164, sha 40efefa6). Continuous since — 12 days as of 2026-08-23. The cause is registry/runner-side (403 on the bearer token), not a repo commit: git log --since=2026-08-08 --until=2026-08-13 -- .gitlab-ci.yml docker/ returns no commits.

Proposed fix. Two separate fixes, and neither substitutes for the other. (a) Restore the runner's registry credentials so ${CI_IMAGE} pulls — this un-blocks lint, test and architecture-check together. (b) Independently, stop depending on a remote job for a stdlib-only AST scan: with ARCH-01 fixed, the local battery enforces the same rule with the same exit code and no image. Also add an alert on consecutive pipeline failure — 160 red pipelines produced no signal anyone acted on.

Origin: R2·ARCH-02 · Files: scripts/architecture_checker.py

Code & Architecture

OA-031 — The session fork silently destroys two context.json fields the src implementation writes

🔴 FATAL · drift · ✅ confirmed · evidence: measured · state: ``

claude/tools/session (loaded by session on PATH) reads and rewrites the same context.json as src/orchestrata_ultimate/session but drops state.goal.current_step and state.portfolio_goals, because its pydantic models declare neither field and default to extra='ignore'.

Proposed fix. session goal advance / goal step (src click CLI, cli/goals.py:239-276) are the only writers of current_step, and session set-goal (deployed fork) is what actually runs on PATH — so the plan-window cursor is destroyed the next time any fork command touches the file. Collapse to ONE implementation: make claude/tools/session a thin import of orchestrata_ultimate.session (shipped as a wheel into ~/.claude/.venv), or, if the fork must stay standalone, set model_config = ConfigDict(extra='allow') on its models AND add a test that round-trips a src-written context.json through the fork asserting byte equality. Do not leave two pydantic schemas writing one file.

Origin: R1·DUP-FORK-001 · Files: CLAUDE_HOME/tools/session_cli.py, claude/tools/session/models.py, claude/tools/session_cli.py, context.py, home/mohamed/workspace/orchestrata-ultimate-architecture/claude/tools/session/context.py, home/mohamed/workspace/orchestrata-ultimate-architecture/claude/tools/session/models.py

Contradictions

OA-037 — ~/.claude/audit/ existed and was fully populated for at least four months; a 235.5 MiB off-machine mirror survives

🔴 FATAL · contradiction · ✅ confirmed · evidence: measured · state: production

The round-1 open question "did ~/.claude/audit/ ever exist, or was it never built?" resolves against "never built" on direct artifact evidence. A mirror of this machine's ~/.claude at mseek:Workspace/sync/.claude holds a complete audit tree: 2,890 objects / 235.534 MiB, with all four subtrees SPEC-020 spec.md:876-886 mandates (sessions/, archive/YYYY-MM-DD/, findings/, subagent_findings/) plus enforcement_log.jsonl, and the sibling logs/file_operations.log at 23,399,294 bytes. 55 dated archive directories run 2025-12-28 through 2026-04-16. Archive filenames match REQ-020-206 ({session_id}_{epoch}.jsonl) byte-for-byte in shape: 8afbad68-f479-4c96-94df-3b44bdcbcb4c_1776384245.jsonl. The first line of findings/deception_log.jsonl is real stop_auditor.py output ({"type": "ACTION_DECEPTION", "severity": "CRITICAL", "pattern_matched": ...}) timestamped 2025-12-28T00:51:39. The mirror is provably this machine's ~/.claude: it sits beside sync/.claude/history.jsonl, sync/.claude/backups/.claude.json.backup.1776386638723, and sync/.claude/projects/-home-mohamed-workspace-orchestrata-ultimate-architecture/8afbad68-...jsonl. Locally the directory is gone and there is no displaced copy: ls ~/.claude/audit is ENOENT, no .claude.old/.claude.bak exists, and ~/.claude/.local/share/Trash is empty. CASE FOR "it existed and was lost" (strong): everything above, plus every top-level entry in the current ~/.claude carries a btrfs birth time of 2026-04-29 04:26:46 or later — the state directory was recreated wholesale that morning and audit/ did not come back. CASE FOR "treat it as never built" (weaker but real): the surviving evidence is entirely off-machine and on mseek:, which the user's own memory index records as the STALE remote (last object under sync/.claude is 2026-04-17T00:51Z); nothing in the repository, in any commit, in any installer, or in any local file records that the directory ever existed, so from the repo's point of view there is no prior art to restore. CONSEQUENCE EITHER WAY: REQ-020-208 "Archive data NEVER deleted" is currently false on this machine — 235.5 MiB of never-delete data is not here.

When it appeared. REGRESSION, not never-wired. Live and writing from at least 2025-12-28T00:51:39 (first deception_log entry) to 2026-04-16 20:47:56 (last mirrored audit write) and 2026-04-16 20:03:41 (last file_operations.log write). Lost at or before 2026-04-29 04:26:46, the btrfs birth time of the current ~/.claude and of every top-level entry inside it. The mirror cannot bound the upper end more tightly than 2026-04-17T00:51Z because the mseek: sync itself stopped then (newest object anywhere under sync/.claude). Zero audit writes since 2026-04-29 at the latest: each writer calls mkdir(parents=True, exist_ok=True) on its own sink before writing, so a single successful write since then would have re-creat…

Proposed fix. QUESTION FOR THE USER: given that the audit trail demonstrably ran (2,890 objects, 235.5 MiB, 2025-12-28 to 2026-04-16) and vanished with the 2026-04-29 recreation of ~/.claude — do you want SPEC-020 audit treated as a RESTORE or as a fresh BUILD? IF RESTORE: remediation is (i) re-register the five writers on the current delivery path, (ii) decide the sink root per C3-03, and (iii) pull the 235.5 MiB back from mseek: before that remote is retired, since REQ-020-208 forbids losing it — this is days of work, not hours, and it puts recovered pre-2026-04-29 data beside new data with a four-month hole in the middle. IF FRESH BUILD: remediation is only (i) and (ii), the historical 235.5 MiB is written off, and REQ-020-208's guarantee is knowingly broken once and re-baselined from today — which…

Origin: R2·C3-01 · Files: -home-mohamed/c55c93a3-f29c-4f8f-813f-69f2a3f7030f.json, Workspace/sync/.claude/audit/findings/deception_log.json, findings/deception_log.json, home/mohamed/.claude/projects/-home-mohamed/c55c93a3-f29c-4f8f-813f-69f2a3f7030f.json, home/mohamed/workspace/orchestrata-ultimate-architecture/specs/020-claude-code-harness/spec.md, sessions/7633c856-ebe3-4ce7-ab9c-1632594300d1.json

4. MAJOR register — 275, by subsystem

Docs & Knowledge (31)

ID Class Finding Verified
OA-044 drift 6 of 11 scripts in AGENTS.md's tool table, and the entire MANDATORY orchestrator pipeline, do not exist at th… ✅ confirmed
OA-045 contradiction Both ADR registers write the same id space; the prod graph resolves 25 ids to the wiki decisions while 96 src… ✅ confirmed
OA-046 drift CLAUDE.md understates the always-loaded codebase map by 2.9x; three mutually inconsistent token figures insid… ✅ confirmed
OA-056 false-green doc_lint.py, the drift authority for this domain, cannot see any onboarding drift and is not in the gate batt… ⏳ unverified
OA-090 drift 6 of 14 documented python scripts/*.py invocations die with ModuleNotFoundError under the interpreter a fre… ✅ confirmed
OA-102 contradiction A prose generator string is an unaudited waiver channel in a gate that declares itself non-waivable ✅ confirmed
OA-105 false-green ADR-005's suite-wide monkeypatch ban is violated in end2end/ and the test-purity gate reports PASS ✅ confirmed
OA-106 contradiction AGENTS.md prescribes pyswip test fixtures for a library that is banned, uninstalled, and absent from conftest ✅ confirmed
OA-107 false-green AGENTS.md startup step 2 reports "KG: not connected" on a fully connected knowledge graph ✅ confirmed
OA-108 drift AGENTS.md §5 mandates a subplan entry point in scripts/orchestrator/, deleted 2026-04-19 ⏳ unverified
OA-109 contradiction AGENTS.md's "must return 0 matches" grep recipe returns 264 matches on a compliant suite, 89% of them the pro… ✅ confirmed
OA-115 false-green Atomic-write check is blind to the real CODEBASE_MAP generator; 2 of 31 'examined' generators examined nothing ✅ confirmed
OA-116 contradiction CLAUDE.md and AGENTS.md document a session-CLI verb set that does not exist in the CLI an agent shell actuall… ⏳ unverified
OA-117 drift Canonical ADR-011's stated auth semantics were deleted from the code and never superseded ⏳ unverified
OA-136 drift LEVEL0 attributes its 17-tool inventory to the wrong registry and points at a call that raises TypeError ⏳ unverified
OA-179 disconnection The ADR three-way drift detector is RED and nothing runs it ⏳ unverified
OA-199 false-green The doc-drift authority scans 14.6% of the corpus, has no path or command existence check, and is not a gate ⏳ unverified
OA-208 contradiction The mandated diagnostic playbook's six primary commands are all dead — five denied by a live guard, one rejec… ✅ confirmed
OA-209 false-green The mandated first-turn digest's INFRA section fails to parse on a healthy fleet because the JSON producer pr… ⏳ unverified
OA-231 false-green The spec-checklist glob cannot detect a missing checklist: 14 of 71 spec dirs have none, gate reports 0 viola… ✅ confirmed
OA-233 false-green The startup digest's LAST TEST VERDICT section reports no verdict, and PROJECT STATUS reports a non-authorita… ✅ confirmed
OA-245 contradiction Two CLAUDE.md commands are denied by a live PreToolUse guard, and the guard's own remedy names a flag that do… ✅ confirmed
OA-252 debt Zero of 63 ADRs across both registers has ever been superseded, while in-place edits are forbidden ✅ confirmed
OA-262 contradiction claude/README.md tells you to register hooks in a file no deploy path reads, and contradicts itself 40 lines… ✅ confirmed
OA-270 drift deploy/systemd/README.md names a deleted script for a live prod unit and a decommissioned env key ✅ confirmed
OA-271 false-green doc_lint TEST-COUNT check reads the module count (16) as the test count (389) — 24x wrong, guarded by a tauto… ⏳ unverified
OA-272 disconnection doc_lint's TEST-COUNT check matches nothing in the only scope it is ever pointed at ✅ confirmed
OA-273 false-green doc_lint's container-IP check is blind to 7 of 25 containers and to both non-prod subnets ✅ confirmed
OA-275 contradiction docs/adr/README.md contains zero mention of the canonical register ⏳ unverified
OA-278 disconnection graph-write-swallow: a self-declared gate and its RUL-030-registered baseline, wired into nothing ✅ confirmed
OA-284 dead plans/rtm.json + plans/rtm.md: 2.0 MB of RTM output with no writer, 427 dead ids, 2,532 live requirements mis… ✅ confirmed

Enforcement & Gates (30)

ID Class Finding Verified
OA-038 disconnection .pre-commit-config.yaml — 19 declared hooks, zero executions ✅ confirmed
OA-039 drift The single-entry-point guard's regex covers 9 of the 23 gate commands ✅ confirmed
OA-040 false-green The RUL-023 wiring gate has no rule for claude/hooks, the surface holding all 13 unregistered hook scripts ❌ refuted
OA-041 false-green run_tests._run_gates fails open on a missing gate script and still prints All safety gates pass ✅ confirmed
OA-053 contradiction The rulings index — the declared single source of truth — disagrees with the ruling files on 10 of 31 rows ✅ confirmed
OA-072 missing 10 of 26 standing user rulings have no gate, hook or test ⏳ unverified
OA-073 drift 10 of the plugin's 31 hook commands execute files outside the plugin root, defeating the 'plugin is the only… ✅ confirmed
OA-121 risk Four bypass tokens fire on a raw substring, need no reason, and are recorded nowhere ✅ confirmed
OA-150 false-green RUL-023 wiring gate reports "satisfied" after grading zero artifacts ⏳ unverified
OA-155 false-green RULINGS_DIR turns the rulings gate into an exit-0 skip that run_tests reports as a pass ⏳ unverified
OA-177 disconnection The 23-gate battery has no automatic trigger — 12 gates exist only there ✅ confirmed
OA-180 disconnection The CLAUDE.md rule-enforcement layer is inert: 13 of 35 claude/hooks unregistered, and its config file does n… ✅ confirmed
OA-191 false-green The battery cache is blind to .env, .service and .timer files: env-subnet-scheme and prod-separation serve ca… ✅ confirmed
OA-201 risk The gate cache is unsigned, untracked, and written without a lock by concurrent runs ❌ refuted
OA-211 disconnection The only plaintext-secret gate hangs off the pre-commit hook, and check_secret_leaks.py has no invoker at all ✅ confirmed
OA-230 false-green The single-gate-entrypoint PreToolUse guard did not fire on this delegated agent session's Bash calls ⏳ unverified
OA-237 false-green The wiring gate (RUL-023) grades only paths added since merge-base with master — it graded 3 markdown files o… ✅ confirmed
OA-246 contradiction Two checkers accept a bare, unreasoned gate-ok: that the canonical waiver reader refuses ✅ confirmed
OA-249 false-green Two rulings are green in the lint with zero live executors ⏳ unverified
OA-256 false-green check_prod_tree_separation scans 7 of 20 installed .service units and misses TWO live dev-tree references, no… ✅ confirmed
OA-260 false-green check_wiring's W4 accepts scripts/health_check.py as a runner, and nothing invokes health_check.py ⏳ unverified
OA-264 contradiction claude/settings.json registers session_auto_start.py, which exists nowhere, while 10 REQ-020 requirements are… ✅ confirmed
OA-268 false-green coverage-claude ignores pytest's exit code — failing tests still pass the gate ✅ confirmed
OA-269 false-green deploy/ship.sh never runs the 23-gate battery, and mypy runs in no pre-push gate — the tree currently fails m… ✅ confirmed
OA-277 false-green feature-loss is cached on a content fingerprint although it walks git history and docs/adr ⏳ unverified
OA-287 false-green prod-separation serves a cached PASS from a 2-file fingerprint while grading 7 files outside the repo ⏳ unverified
OA-295 false-green rulings_lint passes 31/31 by proving mechanisms EXIST, never that they run ✅ confirmed
OA-296 false-green rulings_lint reports 'all declared mechanisms verified' from existence-only checks — it never asks whether a… ⏳ unverified
OA-299 disconnection scripts/health_check.py has no automatic invoker; four rulings rest on it alone ⏳ unverified
OA-309 false-green validate-ci's cache fingerprint is blind to docker/docker-compose.yml, which 4 of its 14 gates read ⏳ unverified

Specs & Requirements (30)

ID Class Finding Verified
OA-047 contradiction Eight specs declare Status "Complete" with zero requirement facts and zero @traces citations anywhere ⏳ unverified
OA-049 contradiction Repo ADR-0003 'Neo4j is the fact system of record' is Accepted and unsuperseded while the whole fleet runs Me… ✅ confirmed
OA-063 false-green "Specs with no implementation" rests on an oracle that resolves 1.6% of symbols as reachable; 6 of 18 specles… ✅ confirmed
OA-069 contradiction 1,347 requirement ids are ticked complete in spec checklists while the RTM evidence artifact grades them UNLI… ✅ confirmed
OA-071 contradiction 1,676 requirement ids (23%) live outside the registry the ownership gate reads ⏳ unverified
OA-074 contradiction 10 specs holding 757 requirements declare Status "Complete" with zero @traces declarations and zero test cita… ✅ confirmed
OA-089 disconnection 50.1% of ratified requirement ids are cited by nothing; 8 Status:Complete specs have zero citations at all ❌ refuted
OA-119 contradiction Fifteen specs assert Complete/Implemented while every requirement checkbox is unchecked ⏳ unverified
OA-120 contradiction Five co-committed RTM artifacts report mutually exclusive coverage: 100.0%, 100.0%, and 4.1% CITED ✅ confirmed
OA-125 contradiction Four readers of the requirement corpus disagree; the traceability engine sees 23.4% fewer ids than the ratifi… ✅ confirmed
OA-133 drift Inverse drift: three specs still read Draft or Design Phase while their capability is shipped and deployed ⏳ unverified
OA-147 false-green RUL-013 spec-authority gate reports PASS/0 while three ungrounded test citations exist, all dropped by its ow… ✅ confirmed
OA-148 disconnection RUL-013's only mechanism, check_spec_authority.py, is wired into nothing and cannot fail on production code ⏳ unverified
OA-153 false-green RUL-031's declared mechanism is RED and runs in no automated path ✅ confirmed
OA-154 false-green RUL-031's requirement-id gate executes on no path; the doc claiming it is enforced is false ⏳ unverified
OA-169 contradiction SPEC-097 Testing Standards mandates mocked unit tests; four other authorities and a live gate forbid mocks ou… ✅ confirmed
OA-170 missing SPEC-100's 150-checkbox requirements checklist parses to ZERO requirement facts, and the parser exits 0 ✅ confirmed
OA-172 contradiction SPEC_INVENTORY.md contradicts spec.md on 8 of its 27 rows and omits 44 of 71 specs under the heading 'Complet… ⏳ unverified
OA-184 disconnection The RTM declaration harvester accepts one source root; claude/ is structurally unscannable, falsely UNLINKING… ✅ confirmed
OA-196 false-green The cross-spec uniqueness assertion fails on a prose citation and cannot see 1679 spec.md definitions ⏳ unverified
OA-214 false-green The pre-commit req-id-format gate is RED right now, and one of its two failures is a false positive on a back… ⏳ unverified
OA-216 disconnection The production entry surface models neither scripts/ nor claude/, so a deployed, ACTIVE prod service reads as… ⏳ unverified
OA-221 drift The published RTM is stale and nothing regenerates it — every session prints 2026-08-19 grades, hiding 4 GHOS… ✅ confirmed
OA-227 false-green The requirement-id gate is RED on three false positives, all from token-scanning instead of definition-matchi… ⏳ unverified
OA-240 contradiction Three documents each declare themselves THE spec standard, with two different 'canonical' section orders and… ✅ confirmed
OA-241 contradiction Three live readers give three different answers to "what requirements exist": 5584 / 5560 / 7256 ⏳ unverified
OA-242 contradiction Three requirement-corpus loaders disagree — 7256 / 5560 / 7336 ids for the same specs/ tree; trace_intel cann… ⏳ unverified
OA-257 false-green check_req_format is RED at HEAD on a false positive, and is not one of the 23 gates the sanctioned battery ru… ⏳ unverified
OA-276 false-green docs/rtm.json stamps VERIFIED on all 7753 rows from a hardcoded literal — including 5 ids that are not requir… ✅ confirmed
OA-300 false-green session_close_hook.generate_rtm reads a JSON key derive_rtm never writes — every session close reports 0 requ… ✅ confirmed

Knowledge Graphs (27)

ID Class Finding Verified
OA-043 drift 32 fabricated IMPORTS edges in the production graph, including a core.logging -> core.logging self-loop, from… ✅ confirmed
OA-052 disconnection The only writer of the KG spec tier is unreachable from the deployed session CLI and is on no schedule ✅ confirmed
OA-087 dead 36,417 exhaust nodes across five labels have zero production readers — written, retained, never queried ⏳ unverified
OA-091 drift 62,114 orphan code-intelligence nodes under three shadow project identities, ~9,000 of them synced from a del… ⏳ unverified
OA-093 risk 82.2% of operational exhaust has no age bound; ToolCall cannot be age-bounded because 97.9% of it carries no… ✅ confirmed
OA-094 dead 865-module orphan subtree agent-a55ea2123f8449549 — 11,469 prod nodes whose 865 file_paths are 865/865 absent… ⏳ unverified
OA-097 debt 92.0% of the shared semantic/RAG database is legacy operational telemetry that stopped writing 2026-07-08 and… ✅ confirmed
OA-103 dead A second stale code subtree — orchestrata-ultimate-architecture, 868 modules / 11,632 nodes, a frozen duplica… ✅ confirmed
OA-128 dead GraphSyncer._sync_requirements reads an AST field the serializer has never emitted, and reports 0 as success ⏳ unverified
OA-129 false-green GraphSyncer.verify() cannot fail, and five of its seven counts are not project-scoped — it reports 37,441 met… ✅ confirmed
OA-131 disconnection IMPLEMENTS is structurally impossible: the query matches a :File label that does not exist in orchkg ✅ confirmed
OA-135 contradiction KG connectivity invariant violated at 8.0x its own baseline while the execution register records enforcement… ⏳ unverified
OA-137 false-green Memgraph's vector_search.search does not reject a dimension mismatch — it returns confident rows ⏳ unverified
OA-139 disconnection No automatic trigger re-ingests the semantic index — the only refresh path is a human typing the command ⏳ unverified
OA-175 drift Test-fixture nodes and per-worker pytest label indexes sit on the PRODUCTION semantic database, which the sui… ⏳ unverified
OA-182 drift The KG spec/requirement tier is 31+ days stale while the code tier in the same database is 2 hours old ⏳ unverified
OA-193 contradiction The canonical ontology's chunk-unification target is on the ingest pruner's delete list — 2,634 live producti… ✅ confirmed
OA-195 disconnection The connectivity gate has never executed in the context it is wired into — health_check invokes bare python… ⏳ unverified
OA-203 contradiction The graph is a sixth requirement-corpus reader at 5,388, and the two RTM artifacts disagree with each other a… ⏳ unverified
OA-217 drift The production knowledge graph's code layer describes the DEV working tree at an UNCOMMITTED state, not HEAD… ✅ confirmed
OA-219 drift The production semantic graph's spec tier is 100% test and error junk ⏳ unverified
OA-228 missing The semantic index root set excludes scripts/, claude/, specs/, rtm/, plugins/ and 99% of tests/ — 1,024 of 4… ✅ confirmed
OA-244 drift ToolCall exhaust is structurally unusable — 97.9% carry no timestamp and no outcome, 20.3% carry only an id,… ✅ confirmed
OA-251 disconnection Zero of 24 gates touches either knowledge graph; the three graph checkers that exist are wired into nothing ⏳ unverified
OA-255 false-green check_adr_graph_sync.py reads the TEST fleet by default while claiming to read the live orchkg ✅ confirmed
OA-282 dead kg_retention.py's Session reaper is unsatisfiable by construction — 10,082 of 10,082 gateway Sessions can nev… ⏳ unverified
OA-283 false-green orchestrata-ast-live-sync.service has been structurally unable to sync since 2026-08-10 while systemd reports… ✅ confirmed

Code & Architecture (27)

ID Class Finding Verified
OA-048 false-green Every complexity finding is WARNING; both the installed pre-commit hook and CI filter at ERROR — 1531 standar… ⏳ unverified
OA-051 disconnection The only CI job that runs the complexity checker is a GitHub Actions workflow on a GitLab-only repository ⏳ unverified
OA-075 drift 11 of 29 packages and 18 core.* submodules carry no layer assignment — 26.5% of intra-project import edges ar… ✅ confirmed
OA-078 risk 134 src modules are reachable only from tests and no gate measures that condition ✅ confirmed
OA-079 debt 150 god objects hold 35% of all cyclomatic complexity in src; 1531 violations of the project's own published… ✅ confirmed
OA-088 drift 5 of SPEC-007's 10 core governance predicates have no Prolog clause head anywhere ⏳ unverified
OA-122 disconnection Four checked SPEC-001 kernel requirements are implemented only in a zero-production-importer router twin ⏳ unverified
OA-141 missing No gate in the 23-gate battery detects duplicate or divergent implementations, and the one that could is iner… ✅ confirmed
OA-146 false-green RTM marks the god-object/nesting/stub gate requirements VERIFIED against an unrelated class; the generated RT… ⏳ unverified
OA-160 contradiction SPEC-007's 11 constitutional articles and the 12 implemented ones share zero names; three authorities disagree ✅ confirmed
OA-161 missing SPEC-014 FR-001/FR-002/FR-009 connection-limit and transport controls are absent: no max_clients, no max_subs… ✅ confirmed
OA-162 missing SPEC-014's entire gateway PAM++ authorization layer was never built; scope enforcement is a hardcoded constant ✅ confirmed
OA-163 drift SPEC-015 FR-020's PAM++ plugin Prolog predicates were never built; plugin governance is pure Python by its ow… ⏳ unverified
OA-164 disconnection SPEC-015 plugin subsystem is gated on an env var set in no profile, no deploy file and no systemd unit ⏳ unverified
OA-165 missing SPEC-015's orchestrata plugins CLI (three P1 FRs) does not exist ✅ confirmed
OA-166 disconnection SPEC-020 stub/nesting/god-object gate is built, traced and registered in zero hook manifests; 443 blocking er… ✅ confirmed
OA-176 drift The 2026-08-21 atomic-write fix landed in the RTM copy nothing imports; the live copy still truncates in place ✅ confirmed
OA-187 false-green The architecture gate's exit code cannot express a violation — both callers report PASS on any number of them ❌ refuted
OA-202 false-green The generated-artifacts registry names the dead RTM copy as the generator of docs/rtm.{json,md} ⏳ unverified
OA-236 drift The vendored IRC listener fork broke the hook's liveness probe; every SessionStart spawns another listener ✅ confirmed
OA-238 false-green The wiring gate cannot detect the unwired quality gate: W1 covers only .claude/hooks/, and grades only the… ⏳ unverified
OA-247 debt Two deterministic code-review engines in src/, 15 of 25 shared checks logic-divergent, neither entrypoint cal… ❌ refuted
OA-263 disconnection claude/hooks/error_gate/ is a stale fork of verification/review/ that nothing registers and whose import targ… ⏳ unverified
OA-267 drift core/artifact_store.py eagerly imports memory (Layer 2) — a Layer-1 tree reaching up, invisible to the checker ⏳ unverified
OA-285 false-green plans/rtm.json grades REQ-014-101/102 CITED on a @traces decorator and a test docstring for a predicate that… ✅ confirmed
OA-302 disconnection src/orchestrata_ultimate/session/hooks/ is registered nowhere on this machine while SPEC-006 marks its requir… ⏳ unverified
OA-312 false-green who-imports defaults to a narrow --source and reports 0 importers for 167 of 868 live src modules ✅ confirmed

Unopened Surfaces (23)

ID Class Finding Verified
OA-054 drift Three documents in the claude-env chain still describe the bundle deleted 9 days ago; one prescribes a retire… ✅ confirmed
OA-064 contradiction --prefix is honoured by the file half of the config installer and ignored by the plugin half — a non-default… ✅ confirmed
OA-076 false-green 11 tests cover the fresh-machine installer and none of them executes it ✅ confirmed
OA-084 risk 27.1% of src/orchestrata_ultimate is outside the layer model, and the checker reports "Files checked: 868" wi… ✅ confirmed
OA-124 contradiction Four materialized requirement corpora disagree by up to 4,158 ids, and the gate that calls one of them 'the O… ✅ confirmed
OA-158 contradiction Round 1's "1,531 architecture violations" is not reproducible; the measured production value is 0 ✅ confirmed
OA-168 contradiction SPEC-033 §9 reads 'to-build' for twelve rows whose 32 deliverables all exist; no gate compares spec status to… ✅ confirmed
OA-189 drift The artifact registry attributes docs/rtm.json to a save_rtm() that no caller invokes; the caller uses a dive… ✅ confirmed
OA-200 drift The fresh-machine installer cannot complete on a fresh prefix — it reads a settings.json no installer creates ✅ confirmed
OA-210 disconnection The only behavioural test of template quality declares 9 BDD scenarios, binds 0, and has never been collected ✅ confirmed
OA-222 drift The published standard documents 2 of the 5 rule families the checker enforces, and misstates a third as revi… ✅ confirmed
OA-224 disconnection The registered project PreToolUse guards did not fire on my own foreground pytest — independent in-session re… ✅ confirmed
OA-232 drift The standard's layer table contradicts LAYER_ASSIGNMENTS on a renamed module and a missing package, in violat… ✅ confirmed
OA-243 contradiction Three tracked coverage briefs instruct banned practice; both live guards DENY the briefs' own verification co… ✅ confirmed
OA-253 contradiction architecture/layer-dependency-rules.md is a live second layer authority that contradicts the shipped model, w… ✅ confirmed
OA-258 false-green check_secret_leaks cannot see a markdown-formatted credential — its own name token CREDENTIALS is defeated by… ✅ confirmed
OA-259 disconnection check_secret_leaks.py has zero invokers — the tracked-tree secret scan never runs ⏳ unverified
OA-266 contradiction core.hooksPath is absolute, contradicting the installer's per-worktree invariant and re-creating the incident… ✅ confirmed
OA-280 false-green health_check.py's "Architecture rules" check returns True from an exit code that is always 0, and invokes bar… ✅ confirmed
OA-286 dead plans/rtm.json is a 2.08 MB tracked RTM corpus with no producer, no consumer, and no registry entry — and the… ✅ confirmed
OA-293 debt rtm/ is a frozen April-2026 handover tree with no runner, no spec, and no gate — yet three corpus-wide migrat… ✅ confirmed
OA-298 disconnection scripts/check_secret_leaks.py — written after a measured credential leak — is registered in zero gates, zero… ✅ confirmed
OA-304 risk templates/*.jinja2 are both the generator's input and its output; an on-disk-only fix is reverted by --force-… ✅ confirmed

Runtime & Deployment (22)

ID Class Finding Verified
OA-057 contradiction orchestrata-ast-live-sync watches the deployed tree, which only changes at deploy time ✅ confirmed
OA-058 false-green orchestrata-history-mining.service runs system python against ~/.local site-packages and is silently skipped… ✅ confirmed
OA-080 disconnection 169 MB of per-phase test timing is written and never read; SPEC-113 marks FR-002 BUILT with its acceptance qu… ✅ confirmed
OA-086 risk 3 of 7 prod unit templates omit ORCHESTRATA_ENV_PROFILE; the loader's "test" default would repoint a prod job… ✅ confirmed
OA-092 drift 81 of 267 sessions have no record in either session sink; SPEC-020's "never trimmed" guarantee is false as me… ✅ confirmed
OA-100 risk A container on the PROD bridge bind-mounts the DEV working tree read-write ✅ confirmed
OA-111 drift All 7 prod units log only to a journal capped at 50 MB — 17.6 hours of retained history against SPEC-100's 30… ✅ confirmed
OA-113 false-green All five running prod services carry SESSION_ROOT pointing at the DEV working tree, sourced from prod's own .… ✅ confirmed
OA-127 false-green Gate 12 (validate_ci RUL-003 scan) never visits claude/ — 91 production files outside the scan and outside th… ⏳ unverified
OA-140 missing No drift detection runs on any schedule; the only automatic guard detects unpushed commits, not deployed drift ✅ confirmed
OA-144 missing Prometheus scrapes the gateway with zero alert rules and zero alertmanagers; 4 of 5 running prod services exp… ✅ confirmed
OA-149 false-green RUL-019 gate passes while 6 of 10 production ExecStart targets are silently dropped, 3 of which reach a raisi… ✅ confirmed
OA-171 contradiction SPEC-113 mandates retaining every measurement; freshness_guard deletes rows at 7 days with no archive ✅ confirmed
OA-181 drift The DEV-tree paths are baked into the shipped unit templates, so every promotion re-installs the RUL-027 viol… ✅ confirmed
OA-183 false-green The Prolog infra_key_with_default rule cannot see the receiver form core/infra_env_rule.py exists to catch ⏳ unverified
OA-197 disconnection The declared systemd unit-drift guard has zero invokers ✅ confirmed
OA-204 false-green The installer's interpreter check passes on a one-entry file while 19 of 31 live hook registrations run syste… ✅ confirmed
OA-223 missing The readiness shim on 7 units' critical start path exists in no repository and no installer creates it ⏳ unverified
OA-250 false-green Widening the RUL-027 gate's unit glob would still leave 2 of 3 orchgraph-backup violations invisible ✅ confirmed
OA-281 missing install-tools.sh performs zero byte verification and has no --verify mode ⏳ unverified
OA-301 false-green ship.sh's "the running thing IS the deployed thing" check silently skips a prod unit ⏳ unverified
OA-303 false-green std_20 "Compliance audit exists and is current" passes on audits reporting 0/29 classes as 60.0% ✅ confirmed

Tests & Verification (21)

ID Class Finding Verified
OA-060 missing scripts/gates.py main() has zero test coverage — nothing asserts the battery exits 1 when a gate fails ✅ confirmed
OA-062 false-green test-review rule T3 is evaded by one AST node type: 0 issues over 1,074 assert-free tests, 2 ERRORs when `ret… ⏳ unverified
OA-065 false-green --strict-markers and --strict-config in pyproject addopts are inert under pytest 9.0.3; 12 unregistered xdist… ✅ confirmed
OA-067 false-green 1,074 confirmed exact: zero asserts across all of them, 1,967 blanket handlers, and it is not an undercount ⏳ unverified
OA-068 dead 1,254 tests in 88 modules are never collected, and are exempt from every gate that scans tests/ ⏳ unverified
OA-077 disconnection 12 pytest modules / 172 test functions live outside testpaths and are executed by neither entry point ⏳ unverified
OA-083 false-green 2686 session tests point at src/orchestrata_ultimate/session/; the deployed session CLI runs claude/tools/s… ✅ confirmed
OA-085 contradiction 29 commits titled "record the authoritative run" carry payloads that declare themselves non-authoritative; HE… ✅ confirmed
OA-096 false-green 887 collected tests cannot fail — proven by executing them against a fully sabotaged SUT ⏳ unverified
OA-098 false-green 98% line coverage of a module from tests proven to pass with every method raising ⏳ unverified
OA-110 false-green All 53 turn-capture tests drive scripts/claude_turn_capture.py; the registered hook is claude/tools/claude_tu… ✅ confirmed
OA-114 disconnection An entire test root, end2end/ with 100 tests, is outside testpaths — and one of its modules has been un-colle… ⏳ unverified
OA-145 missing REQ-033-T5 anti-gaming was never built for the standing test corpus; the one detector that exists is differen… ✅ confirmed
OA-174 drift Smoke tests stopped reporting SKIP and started reporting PASS on 2026-07-08, in a commit whose stated policy… ⏳ unverified
OA-198 missing The disconnection loss class has neither a gate nor a negative-corpus test — the SPEC-020 shape exits 0 from… ✅ confirmed
OA-234 false-green The test-purity gate passes on 8 deliberate RUL-002 violations: it never inspects class definitions and match… ✅ confirmed
OA-288 false-green prod-separation's 11-test corpus cannot detect the live false-green; the gate's scope parameter is asserted i… ✅ confirmed
OA-305 false-green test-purity — the only test-quality gate of the 24-gate battery — has no assertion check and reports ok=True… ⏳ unverified
OA-306 false-green test-review rule T3 matches the vocabulary pass instead of the mechanism, missing 1,074 exception swallows… ✅ confirmed
OA-307 disconnection test-review.py (T1-T16) is enforced by nothing: not a gate, not in GitLab CI, and its only hook wiring is bro… ⏳ unverified
OA-308 contradiction tests/generated_recovery is declared ignored by pyproject.toml yet runs in the authoritative suite, exempted… ✅ confirmed

Supply Chain & Payloads (20)

ID Class Finding Verified
OA-042 risk 26 tracked instructions bind the 23-gate battery to /usr/bin/python — a GIL-ENABLED, non-venv interpreter und… ⏳ unverified
OA-055 disconnection check_secret_leaks.py has never been wired to anything — 475 lines, 37 passing tests, zero invocation sites ⏳ unverified
OA-059 disconnection scripts/check_secret_leaks.py has zero automatic invokers and cannot run under the interpreter its sibling ho… ✅ confirmed
OA-101 missing A failed backup is silent, and 2026-08-17 has no backup at all ⏳ unverified
OA-118 false-green Every GIL guarantee in the project asserts a bare interpreter before the dependency set is exercised; the one… ⏳ unverified
OA-142 false-green No gate in this repository reads git history — the gate written for a history leak scans only the current ind… ✅ confirmed
OA-159 false-green Run for the first time, the secret-leak gate is RED: 1,276 violations, 350 tracked files, 0 waived ❌ refuted
OA-178 missing The 8.86 GiB archive has never been restore-verified with data, carries no checksums, and has no restore tool… ⏳ unverified
OA-188 risk The archive is single-copy and shares one NVMe device with the live graph containers it backs up ✅ confirmed
OA-190 missing The banned-libraries registry bans packages FOR GIL re-enablement but structurally cannot see the three that… ⏳ unverified
OA-194 false-green The check-deps gate scans 1 of 5 first-party source roots and reports green over the other four ✅ confirmed
OA-205 risk The leaked NEO4J_PASSWORD value is still in plaintext in two TRACKED files today ⏳ unverified
OA-215 false-green The prod-separation gate is cached on deploy/systemd and SKIPPED — the exact failure its own comment says it… ⏳ unverified
OA-218 risk The production secrets file is world-readable (mode 644) while its dev and user counterparts are 600 ✅ confirmed
OA-220 debt The prune block — the only code in the system that deletes backups — has no test ✅ confirmed
OA-248 false-green Two of the three dev-tree couplings in orchgraph-backup.service are invisible to the RUL-027 checker even wit… ⏳ unverified
OA-254 risk backups/ is 8.9 GB of production graph snapshots at rest inside the developer working tree ⏳ unverified
OA-261 risk claude-orchestrata bind-mounts the entire DEV checkout READ-WRITE and its root can read the credential-bearin… ✅ confirmed
OA-279 false-green health_check.py runs all 20 of its checks through bare python, which is /usr/bin/python — the native-build… ✅ confirmed
OA-297 contradiction run_tests.py and codebase_tools.py disagree on whether a GIL-on process is a flake or a fatal ⏳ unverified

Write Sinks, CI & Dating (17)

ID Class Finding Verified
OA-050 false-green The live CI executor runs out of the DEV working checkout, and RUL-027 reports PASS because its glob excludes… ⏳ unverified
OA-066 disconnection .github/workflows/ci.yml — 21 run steps carrying 14 gates absent from the real CI — has never had a platform… ⏳ unverified
OA-082 disconnection 2 of 39 registered artifacts have an automatic freshness oracle; the LEVEL0 drift gate is wired only to a CI… ⏳ unverified
OA-095 debt 88 of 99 recorded loss events in this project have no recorded rationale — the project's own history tool say… ⏳ unverified
OA-099 debt 980 MB of orphaned atomic-write temp files in .claude/run/codebase_kb/, growing during this run ⏳ unverified
OA-126 false-green Four tracked generated artifacts embed this machine's absolute checkout path 78,190 times, and RUL-030 never… ⏳ unverified
OA-130 contradiction HEAD's commit subject claims an authoritative test run; the artifact it commits declares itself non-authorita… ⏳ unverified
OA-173 missing Seven round-1 FATALs were never correct — the defect is present in the first commit of the file that carries… ⏳ unverified
OA-186 risk The always-@imported docs/CODEBASE_MAP.md carries a duplicated trailer, produced by an unlocked two-step write ⏳ unverified
OA-229 drift The session fork has been frozen since 2026-08-14 while its canonical twin moved three times — the divergence… ⏳ unverified
OA-239 disconnection The working-tree AST snapshot carries 0 runtime_calls; the PostToolUse hook destroys them on every edit ⏳ unverified
OA-265 disconnection core.hooksPath cutover on 2026-07-27 orphaned 19 pre-commit hooks and left four stale copies of the hook logi… ⏳ unverified
OA-274 drift docs/CODEBASE_MAP.md claims to be auto-generated at session start and is 2 days stale; its two tiers were las… ⏳ unverified
OA-290 disconnection reviews/ is a write-only sink: 2,372 files, and its only reader globs an extension the sink has never contain… ⏳ unverified
OA-291 debt reviews/ is an unconditional, unretained write sink since 2026-04-19, and the banner that write emits to stdo… ⏳ unverified
OA-310 false-green validate_ci.py gate 9 enforces the canonical-runner rule over one CI file while the other CI file in the same… ⏳ unverified
OA-311 missing volk_harness_nightly has never executed once in 89 days — the schedule it requires was never created ⏳ unverified

Contradictions (16)

ID Class Finding Verified
OA-061 contradiction settings.hooks.json is not read by the claude binary but has a verified consumer chain that produces the live… ✅ confirmed
OA-104 contradiction A user-scope PreToolUse hook DID deny inside this delegated subagent while a project-scope guard did not — th… ⏳ unverified
OA-123 contradiction Four in-repo authorities already answer this question in opposite directions, and the governing SPEC-020 neve… ⏳ unverified
OA-134 contradiction Is ~/.claude/settings.hooks.json read by Claude Code at all? Execution records show 0 fires of its unique com… ⏳ unverified
OA-138 contradiction Neither Side A nor Side B survives measurement: the discriminator is the session's PROJECT ROOT at launch, no… ✅ confirmed
OA-143 contradiction No recorded rationale anywhere for the audit trail's disappearance — the deletion left no commit, no ADR and… ✅ confirmed
OA-156 contradiction Re-wiring the writers today sends the audit trail to a different root than the spec names, and the split is a… ✅ confirmed
OA-157 contradiction Round 1 audited the enforcement layer from a session in which that layer was not loaded — and so did this gap… ⏳ unverified
OA-167 contradiction SPEC-020's requirements checklist reports 240/240 checked and was last committed 2026-08-03, three and a half… ✅ confirmed
OA-192 contradiction The bundle actually deployed into ~/.claude before the cutover registered 7 hooks and none was an audit write… ❌ refuted
OA-207 contradiction The live intercept_bash guard's ~/.claude protection matches only append redirects — a truncating redirect in… ✅ confirmed
OA-212 contradiction The only surviving copy of the never-delete audit data is on mseek:, the remote the user's own memory index r… ⏳ unverified
OA-213 contradiction The permissions half of settings.hooks.json has no deploy-path consumer, while all 9 of its rules happen to b… ✅ confirmed
OA-225 contradiction The registration that made the audit trail work exists nowhere in the repository's deploy path — it was hand-… ⏳ unverified
OA-292 contradiction rtm/ holds two more requirement corpora at 4,467 unique ids and a third count of 4,311, none of them in D-03'… ✅ confirmed
OA-294 contradiction rtm/scripts is a 36-file parallel toolchain: 30 files exist nowhere else, 5 diverge from scripts/, and one is… ✅ confirmed

Measurement Verification (11)

ID Class Finding Verified
OA-070 contradiction 1,531 reproduces exactly — it is the code-review-checklist threshold count, not an architecture-standard coun… ⏳ unverified
OA-081 disconnection 19 pre-commit hooks execute 0 times — confirmed — but core.hooksPath is not the mechanism; no framework shim… ⏳ unverified
OA-112 contradiction All five round-1 AST headline numbers reproduce exactly — and none of them came from the AST snapshot §7.4 bl… ⏳ unverified
OA-132 drift IMPORTS edges are MERGE-only: every import-graph error is permanent in orchkg — proven by a fix that did not… ⏳ unverified
OA-151 false-green RUL-027's PATH_DIRECTIVES omits StandardOutput/StandardError, hiding two more dev-tree couplings that predate… ⏳ unverified
OA-152 false-green RUL-027: exactly 2 installed units carry the dev-tree literal in a path directive, and both are outside the g… ⏳ unverified
OA-185 false-green The architecture gate in the 23-gate battery cannot fail — it invokes the checker without --strict, which r… ⏳ unverified
OA-206 contradiction The live gate guard denies step 4 of the deployed builder brief's definition of done ⏳ unverified
OA-226 false-green The regression test that states the violated invariant cannot detect its violation — no stdlib-named sibling… ⏳ unverified
OA-235 debt The unenforced standard's violation count grew 743 -> 1,531 in four months, and worsened per file ⏳ unverified
OA-289 risk prod-separation's cache fingerprint root is not the directory it reads, so drift in an installed unit cannot… ✅ confirmed

5. Refutation ledger — 22 findings a coordinator rejected

Kept deliberately. A rejected finding is evidence about the analysis, and a claim that gets re-raised later should meet its own refutation first.

ID Claim Why it was rejected
OA-040 The RUL-023 wiring gate has no rule for claude/hooks, the surface holding all 1… The gate-coverage lens's count of 14 unregistered claude/hooks scripts and the hook-registration lens's 13: neither is wrong, so neither is rejected — see cross_lens_contradictions. Reporte…
OA-089 50.1% of ratified requirement ids are cited by nothing; 8 Status:Complete specs… SPECS-REQID-004 (requirement-ids lens): '50.1% of ratified requirement ids are cited by nothing' as a coverage claim. NOT PROMOTED as a defect count. The lens itself falsified the naive rea…
OA-159 Run for the first time, the secret-leak gate is RED: 1,276 violations, 350 trac… REJECTED — 'check_secret_leaks.py reports 1,276 secret leaks' as a leak claim. It reports 1,276 FINDINGS. Every one of the 65 shape hits was triaged by character-class mask and is a BEM CSS…
OA-187 The architecture gate's exit code cannot express a violation — both callers rep… ARCH-001 as stated ('the architecture gate's exit code cannot express a violation — the layering rule is enforced nowhere', MAJOR false-green) — REJECTED at that severity. The claim that ne…
OA-192 The bundle actually deployed into ~/.claude before the cutover registered 7 hoo… REJECTED — GS-CON-02's CONCLUSION ('the audit writers were never registered on any surface that was ever installed', proposed as closing the audit question as a BUILD rather than a restore)…
OA-201 The gate cache is unsigned, untracked, and written without a lock by concurrent… GATES-BYPASS-009's claim that a hand-forged .cache/gates.json entry is sufficient to make any gate report SKIP-since-PASS: the reuse path is real and measured (gates.py:539-543 reuses on fi…
OA-247 Two deterministic code-review engines in src/, 15 of 25 shared checks logic-div… DUP-FORK-004's implied claim that the two review engines' 15 logic-divergent checks produce different verdicts — NOT SUBSTANTIATED. The lens compared normalized source, not executed output,…
OA-319 .claude/skills/ast-toolkit documents a warm daemon and health check that are de… DOCS-DEAD-011 ('.claude/skills/ast-toolkit documents a warm daemon that is dead in this checkout') — not promoted. The measurement is sound (socket absent, pid 2140319 dead, curl exit 7, lo…
OA-330 36 marker applications are deselected by every automated lane, so those tests n… PURITY-012 (36 llm_integration/incus_live marker applications never run in any lane) — accepted as accurate but downgraded out of the findings list: marker deselection is a declared, visibl…
OA-333 452 hand-written collected tests assert nothing TESTS-COV-007 (452 hand-written collected tests assert nothing) — accepted as accurate but not promoted as a separate finding. The lens's own measurement shows 0 of the 452 swallow exceptio…
OA-367 LEVEL0's Prolog endpoint renders a placeholder for every profile because PROLOG… DOCS-TRUTH-012 ('LEVEL0's Prolog endpoint renders a placeholder because PROLOG_HOSTS exists in no env file') — not promoted as a standalone finding. Verified as accurate but it is a single…
OA-374 Pre-edit checkpoint log is split across two paths, has no reader, and its refer… OBS-RUNTIME-009 (pre-edit checkpoint log split across two paths) — not promoted as a finding. The lens's own first pass reported 10 of 39 SHAs unresolvable and then CORRECTED itself: resolv…
OA-404 The KG retention job destroys production data under no spec and no traceability REJECTED — round 1's 'SPEC-113 retention destroying 448,630 of 1,060,927 rows' (plans/system-analysis-2026-08-23.md:194). False on every term and I verified each independently. (a) SPEC-113…
OA-477 health_check.py runs the RUL-013 gate with the system interpreter, where it cra… SPECS-GATE-008 (traceability lens): 'check_spec_authority.py is wired into nothing.' REJECTED as stated. It IS registered in scripts/health_check.py:629 as ('Spec authority (RUL-013)', chec…
OA-485 reports/code-intel-slo.json: registered generator has no recorded invocation th… DOCS-GENROT-010 ('reports/code-intel-slo.json: registered generator has no recorded invocation that writes it') — not promoted. The mechanism is real (the --json destination is caller-suppl…
OA-490 rulings_lint is absent from the 23-gate battery agents actually invoke GATES-COV-022 / RULING-MECH-009 framing that the battery's exclusion of rulings_lint is itself a defect: NOT rejected as false (I confirmed grep -c 'rulings' scripts/gates.py = 0 and that…
OA-502 tests/tools/ shadows the repo's top-level tools/ package at sys.path[0] inside… TESTS-ORACLE-005 (tests/tools shadows the repo tools/ package at sys.path[0]) — not independently re-measured, and the lens itself records zero current impact: no test imports the repo `too…
OA-505 uncovered-policies cannot fail by construction and the battery renders its find… GATE-TESTS-007 (uncovered-policies cannot fail by construction) — rejected as a defect. The lens's own evidence shows the advisory exit code is documented at scripts/gates.py:145-165 as del…
OA-520 ADR register status consistency is 37/38 — the one authority in this domain tha… SPECS-CONTRA-012 (spec-contradictions lens): 'ADR register status consistency is 37/38.' NOT PROMOTED — this is a negative result, not a finding. Recorded in cross_lens_contradictions as th…
OA-525 CONFIRMED CLEAN: vendored wheels are hash-pinned and every one matches uv.lock REJECTED — round-1's 'vendor/wheels/ | 4'. Measured: git ls-files vendor/ returns FIVE tracked cp314t wheels, uv.lock declares five path= sources with five sha256 hashes, and all five rec…
OA-534 Five of eight sampled canonical ADRs conform to code, verified by execution aga… ADR-CONF-013 ('Five of eight sampled canonical ADRs conform to code') — not rejected as false, but dropped from confirmed_findings because it records a PASS, not a defect. Its value is the…
OA-562 claude-env/install-infra.sh is clean, and the open backlog item calling its NEO… NOT PROMOTED AS A DEFECT — INFRA-01's subject, claude-env/install-infra.sh, is clean, and the analyst correctly reported it as a negative result. Folded into GAP-33 (control arm) rather tha…

6. Appendix — MINOR and INFO (254)

ID Sev Subsystem Finding
OA-349 🟡 Code & Architecture Concrete upward-shaped eager edges sit inside the unlayered blind spot: harness -> kernel (5) and tools -> co…
OA-355 🟡 Code & Architecture FactManager.on_request_start is an empty method whose docstring claims it initialises tracking; all four call…
OA-365 🟡 Code & Architecture LAYER_ASSIGNMENTS["prolog"] = 3 is dead config — no Python module can ever match it
OA-368 🟡 Code & Architecture LRUCache is implemented twice in src/, both live, annotated to two different requirement ids
OA-385 🟡 Code & Architecture SPEC-001's three Key Interfaces do not exist as specified in the kernel
OA-386 🟡 Code & Architecture SPEC-002's MessageEnvelope and DeliveryMode data models diverge from the shipped types
OA-387 🟡 Code & Architecture SPEC-014 FR-010 defines eight event topics; one was never implemented and one fires on a third of its spec'd…
OA-388 🟡 Code & Architecture SPEC-015 PluginContext registration methods drop three spec'd parameters
OA-400 🟡 Code & Architecture The AST toolkit and code-review.py disagree by 43% on the same long-parameter rule because one counts self/cls
OA-401 🟡 Code & Architecture The AST toolkit's nesting command counts elif chains as nesting: 55 of 121 depth>=5 results are artifacts,…
OA-403 🟡 Code & Architecture The D7 lazy-import carve-out holds 67 cross-layer edges with no ratchet, including a Layer-1 -> Layer-4 site
OA-411 🟡 Code & Architecture The SPEC-020 registration manifest points SessionStart at session_auto_start.py, a file deleted 2026-07-04 an…
OA-437 🟡 Code & Architecture Three implementations of the god-object/nesting/stub checks with three different thresholds; none reachable f…
OA-453 🟡 Code & Architecture unused cannot see dead methods; two private methods have zero references anywhere in the repository
OA-455 🟡 Code & Architecture architecture-standards.md contradicts LAYER_ASSIGNMENTS on three counts while claiming to mirror it
OA-463 🟡 Code & Architecture claude/hooks/context_graph/ is reachable only through a sys.path bare-name import inside an orphaned hook
OA-464 🟡 Code & Architecture claude/hooks/deception_detector.py is a dead byte-for-logic duplicate shipped to every project on the machine
OA-466 🟡 Code & Architecture claude/tools ships three unreferenced CLIs and a one-line debug leftover into every project on this machine
OA-468 🟡 Code & Architecture core/traceability_utils.py justifies its existence with a copy step that no code in the repo performs
OA-481 🟡 Code & Architecture plans/spec-audit/G-gateway-ui.md is stale in both directions and would mis-plan work today
OA-483 🟡 Code & Architecture refactor/codemod/_fast_fallback.py has never been imported by anything and duplicates the installed codemod_f…
OA-491 🟡 Code & Architecture run_conversation_consumer.py names the unregistered turn-capture copy as the live user-level hook
OA-514 ⬜ Code & Architecture .harness/worktrees is a seventh stale full checkout that the dossier's trap-1 exclusion list does not name
OA-517 ⬜ Code & Architecture 47% of requirements across the six Complete/Implemented specs are UNLINKED, in an RTM artifact that declares…
OA-539 ⬜ Code & Architecture PASS — absolute-import / no-relative-import rule is honoured across 3015 files and is backed by a fail-capabl…
OA-543 ⬜ Code & Architecture Stub-method debt is effectively nil: 482 of 502 stub bodies are Protocol/ABC/@abstractmethod declarations
OA-564 ⬜ Code & Architecture reviews/ has accumulated 2365 report files / 18MB; code-review.py writes one on every invocation including th…
OA-318 🟡 Contradictions "25 project PreToolUse/Stop guards" contradicts the file: 25 is ALL hook registrations across four events; Pr…
OA-379 🟡 Contradictions Round 1 claims 10 cross-domain contradictions with 7 resolved by measurement; only 3 are recorded anywhere an…
OA-382 🟡 Contradictions Round 1's cd "" short-circuit mechanism is disconfirmed as the operative cause, but survives as a latent fa…
OA-390 🟡 Contradictions SPEC-108 names five required tools for the fresh-machine preflight; the installer requires six
OA-426 🟡 Contradictions The project's own skill already answered this question in writing on 2026-08-21, two days before round 1 reco…
OA-465 🟡 Contradictions claude/settings.json holds 12 hook registrations, is copied by no installer and read by no code, and is the o…
OA-474 🟡 Contradictions gates.py's own comment about this file makes a dated claim its git history refutes, and that comment is one o…
OA-495 🟡 Contradictions settings.hooks.json carries a permissions block with "defaultMode": "auto" whose effect is untestable because…
OA-519 ⬜ Contradictions A synthetic audit directory created by another agent in this same swarm sits in the shared scratchpad and wil…
OA-313 🟡 Docs & Knowledge ADR-018's layer-1 enforcement attribution is false and the registry contradicts itself on the layer count
OA-314 🟡 Docs & Knowledge The always-loaded codebase map has not been regenerated in ~35 hours despite the "each session" claim
OA-319 🟡 Docs & Knowledge .claude/skills/ast-toolkit documents a warm daemon and health check that are dead in this checkout
OA-326 🟡 Docs & Knowledge 13 tracked generated documents have no writer anywhere and are unregistered under RUL-030
OA-327 🟡 Docs & Knowledge 21 agent definitions, 7 of them deployed and live, warn against reading a path that does not exist and overst…
OA-341 🟡 Docs & Knowledge ADR-007's named escaper is not the one used on the kernel/gateway governance path; three divergent copies exi…
OA-342 🟡 Docs & Knowledge ADR-010/ADR-011 and architecture-standards.md name core.neo4j_factory, which no longer exists
OA-343 🟡 Docs & Knowledge AGENTS.md's ≥90% coverage Definition of Done is enforced nowhere at 90 and at 92 in GitLab CI
OA-347 🟡 Docs & Knowledge CLAUDE.md's execution-plan step count is 7 short, inherited from the plan's own stale header
OA-348 🟡 Docs & Knowledge CLAUDE.md's suite figures are 15% and 16% low: 1454 modules / ~29.1K tests vs 1672 / 33,881
OA-359 🟡 Docs & Knowledge Four docs document a traceability pipeline of four scripts that moved to rtm/scripts/ and were never followed
OA-361 🟡 Docs & Knowledge Four stale or wrong references in the onboarding files: step count, test-module count, a non-existent enforce…
OA-366 🟡 Docs & Knowledge LEVEL0 names the wrong authority for its tool list, and claims orchkg holds ToolCall events it does not have
OA-367 🟡 Docs & Knowledge LEVEL0's Prolog endpoint renders a placeholder for every profile because PROLOG_HOSTS exists in no env file
OA-373 🟡 Docs & Knowledge Only 4 of 39 registered artifacts have any freshness check; RUL-030 proves a generator FILE exists, never tha…
OA-376 🟡 Docs & Knowledge README.md's component table names Neo4j as the Knowledge Graph; Neo4j was decommissioned 2026-07-27 and doc_l…
OA-378 🟡 Docs & Knowledge Registry consumer claim for tests/generated_* is false for 88 of 271 files
OA-447 🟡 Docs & Knowledge USE_PERPLEXITY.md is a top-level doc whose four documented invocations all fail
OA-472 🟡 Docs & Knowledge docs/architecture/learning.md documents an automated governance-rule cycle whose two scripts do not exist any…
OA-473 🟡 Docs & Knowledge docs/system-design-skill.md documents a sync CLI at a path renamed months ago; the live hook already uses the…
OA-485 🟡 Docs & Knowledge reports/code-intel-slo.json: registered generator has no recorded invocation that writes it
OA-534 ⬜ Docs & Knowledge Five of eight sampled canonical ADRs conform to code, verified by execution against falsifiable oracles
OA-545 ⬜ Docs & Knowledge The 2026-08-19 renumbering ruling is unexecuted four days later
OA-329 🟡 Enforcement & Gates 321 live # gate-ok: waiver markers suppress six checkers, and no gate audits them
OA-331 🟡 Enforcement & Gates 4 of 29 gate directives anchor on a comment or docstring, so a reformat silently un-enforces the ruling
OA-346 🟡 Enforcement & Gates CI and the battery run divergent invocations of the same checkers; fixes landed on one side only
OA-360 🟡 Enforcement & Gates Four passing gates declare their own blind spots in the output that reports PASS
OA-377 🟡 Enforcement & Gates RUL-008's live pre-commit mechanism runs on system python and writes into the repo on every invocation
OA-393 🟡 Enforcement & Gates Seven cached gates do not fingerprint their own gate script, so defanging a checker preserves its cached PASS
OA-414 🟡 Enforcement & Gates The battery clips every gate's output to 6 lines / 300 characters
OA-415 🟡 Enforcement & Gates The canonical run report records no skip flags, so a --skip-gates run is indistinguishable from a full one
OA-418 🟡 Enforcement & Gates The documented battery command fails 11 of 23 gates when python is not the project venv
OA-421 🟡 Enforcement & Gates The live deny message instructs an argument gates.py does not accept, and offers the bypass token as the alte…
OA-440 🟡 Enforcement & Gates Two PreToolUse guards fail OPEN in the exact construction _payload.sh was written to eliminate
OA-445 🟡 Enforcement & Gates Two live user-level hook delivery paths exist, not the one the cutover commit claims
OA-451 🟡 Enforcement & Gates gates.py --all --only X truncates .cache/gates.json to the selected gates, and concurrent runs clobber each…
OA-458 🟡 Enforcement & Gates architecture_checker drops class-body-level cross-layer imports from BOTH the violation set and the INFO coun…
OA-460 🟡 Enforcement & Gates check_external_tools prints 'PASS: ... no undeclared invocations' while skipping 80 subprocess call sites
OA-461 🟡 Enforcement & Gates check_secret_leaks.py has no invoker; gates/differential.py is imported only by its test
OA-462 🟡 Enforcement & Gates check_wiring.py's module docstring states the exact diff scope its own implementation records as a fixed fals…
OA-467 🟡 Enforcement & Gates convention_guard's deploy-in-place systemd rule cannot fire on a heredoc-written unit file
OA-480 🟡 Enforcement & Gates mypy is gated over src/ only in every runner; scripts/ and claude/ are never type-checked
OA-490 🟡 Enforcement & Gates rulings_lint is absent from the 23-gate battery agents actually invoke
OA-496 🟡 Enforcement & Gates ship.sh --no-verify on an already-pushed branch reaches master with no gate at all
OA-497 🟡 Enforcement & Gates single-gate-entrypoint.sh denies 9 of the 23 gate commands; the other 14 can be typed gate-by-gate with no de…
OA-499 🟡 Enforcement & Gates system-design@sufigeeks-marketplace is enabled in .claude/settings.json but has no install record
OA-551 ⬜ Enforcement & Gates The gate registry holds 23 gates, not the 24 the assignment and the surrounding docs state
OA-315 🟡 Knowledge Graphs Trap 8 is real but its cause is scripts/gates.py, not the ast-live-sync daemon — measured live, twice
OA-322 🟡 Knowledge Graphs 1,216 QwenChunk nodes from the DEV working tree sit on the PRODUCTION semantic database, 89.6% content-stale
OA-324 🟡 Knowledge Graphs 12 @property getters are silently overwritten by their setters — /code reports is_property=false for 11 real…
OA-336 🟡 Knowledge Graphs 753 of 881 :Project nodes are ephemeral one-conversation session ids, and every one is a BFS seed for the con…
OA-351 🟡 Knowledge Graphs ConversationTurn project identity is the working-directory basename — 955 distinct project values, including…
OA-352 🟡 Knowledge Graphs Cross-project pollution in the production operational KG
OA-375 🟡 Knowledge Graphs Project-identifier derivation writes junk into the shared production graph — 957 distinct project values, inc…
OA-402 🟡 Knowledge Graphs The ArchitectureChunk twin is invisible to every retrieval path despite sharing the codestral vector width
OA-404 🟡 Knowledge Graphs The KG retention job destroys production data under no spec and no traceability
OA-405 🟡 Knowledge Graphs The KG spec tier is modeled under four labels with three id conventions, and Spec.status is empty for all 61…
OA-417 🟡 Knowledge Graphs The documented KG connectivity command in AGENTS.md always reports 'KG: not connected' — sync_ast_to_graph.py…
OA-422 🟡 Knowledge Graphs The orphan-ConversationTurn leak closed on 2026-08-08 and has not recurred, but nothing has repaired the 7,15…
OA-428 🟡 Knowledge Graphs The semantic graph is a sixth requirement-corpus authority, carrying three incompatible spec-id forms
OA-432 🟡 Knowledge Graphs The wiki page index is current but carries 344 orphan Page nodes against 344 real wiki pages
OA-435 🟡 Knowledge Graphs Three always-loaded or configuration-bearing documents describe a chunk topology that does not exist, and one…
OA-526 ⬜ Knowledge Graphs CONTROL ARM — no credential material in either RAG corpus
OA-527 ⬜ Knowledge Graphs CONTROL ARM — the codestral code index is current, complete and byte-fresh; 5 of 6 real questions answered co…
OA-528 ⬜ Knowledge Graphs CONTROL ARM — the retention timer is live and its zero-deletion result today is correct; the exhaust half of…
OA-533 ⬜ Knowledge Graphs Even with the id-scheme bug fixed, 38% of @traces citations would have no target in the graph
OA-536 ⬜ Knowledge Graphs HEALTHY: the orchestrata-ultimate code layer agrees with the AST snapshot and with disk exactly, by set-diffe…
OA-552 ⬜ Knowledge Graphs The gateway is deployed, healthy and idle — 14 audit events in 18 days, zero WebSocket connections since rest…
OA-356 🟡 Measurement Verification Finding IDs in the live register renumbered mid-run: OA-064 -> OA-073, OA-100 -> OA-114, OA-133 -> OA-151
OA-358 🟡 Measurement Verification Four authorities invoke the architecture checker four different ways; only GitLab CI can fail, and health_che…
OA-364 🟡 Measurement Verification Gate count is 23, not 24 — the 24th cache key is __ast__, a fingerprint namespace, not a gate
OA-370 🟡 Measurement Verification Nothing asserts the battery's own size, and one doc's gate count has drifted +8 since the day it was written
OA-383 🟡 Measurement Verification Round 1's own self-critique is wrong about the 1,531: the method WAS recorded, in the finding register, and c…
OA-439 🟡 Measurement Verification Trap 7 reproduced on myself: a read-only who-imports run wrote a 182 MB gitignored sidecar into the repo
OA-457 🟡 Measurement Verification architecture_checker crashes with an unhandled ValueError on any path not literally under src/ relative to…
OA-508 🟡 Measurement Verification who-imports' narrow --source is NEVER-WIRED, not a regression — the dating round 1's OA-311 left blank
OA-512 ⬜ Measurement Verification TRAP 8 FIRED: all four AST snapshots were rewritten mid-run at 12:39, triggered by a peer agent editing src/o…
OA-530 ⬜ Measurement Verification Control arm — the AST snapshot's denominators are honest: 2,977 modules = 3,015 files minus 38 vendored/build…
OA-547 ⬜ Measurement Verification The architecture standard is genuinely at 0 and was driven there in July — a real control arm, not absence of…
OA-558 ⬜ Measurement Verification Trap 8 fired — but only AFTER my measurements: snapshot hash was constant b14644250a2dc72a for the whole meas…
OA-350 🟡 Runtime & Deployment Conversation turn capture drops turns silently — bounded queue and a fail-open except with no counter
OA-353 🟡 Runtime & Deployment Deployed claude/ hook builds a Neo4j driver from retired NEO4J_* keys defaulting to bolt://localhost:7687
OA-371 🟡 Runtime & Deployment ORCHESTRATA_ENV_PROFILE — the key that selects the fleet — is neither in INFRA_ENDPOINT_KEYS nor in that modu…
OA-374 🟡 Runtime & Deployment Pre-edit checkpoint log is split across two paths, has no reader, and its referents are prunable dangling obj…
OA-384 🟡 Runtime & Deployment Running package reports version 1.0.0 while the installed distribution and deployed plugin report 1.3.0
OA-416 🟡 Runtime & Deployment The deployment's own venv is verified at install time and used by zero hook registrations
OA-423 🟡 Runtime & Deployment The per-fixture cost instrument is never enabled in production and has no reader
OA-425 🟡 Runtime & Deployment The prod tree ships four developer artifacts that hardcode the DEV checkout path
OA-441 🟡 Runtime & Deployment Two bolt repository tests document a KG_DATABASE fallback to "neo4j" that production raises on
OA-449 🟡 Runtime & Deployment Unversioned stale ~/.local/bin/orchestrata-bot.py left behind, referenced by zero units
OA-476 🟡 Runtime & Deployment gitlab-runner.service executes a script out of the DEV working tree on every start and is outside both the ga…
OA-478 🟡 Runtime & Deployment install-tools.sh installs ship from the working tree, not the pinned ref, contradicting its own header
OA-506 🟡 Runtime & Deployment validate_env.py classifies KG_URI as OPTIONAL "with safe code-level defaults" while RUL-003 forbids any defau…
OA-509 🟡 Runtime & Deployment ~/.local/bin/orchgraph-ready hardcodes the DEV venv and a retired-subnet URI, with no caller anywhere
OA-513 ⬜ Runtime & Deployment .cache/gates.json records no timestamp, no failure detail and no commit — the gate battery has no verdict his…
OA-522 ⬜ Runtime & Deployment All four deployed surfaces are byte-identical to the recorded pin 143310ec
OA-532 ⬜ Runtime & Deployment Deployed artifacts are byte-identical to the committed source at 143310ec across all four deployment surfaces
OA-544 ⬜ Runtime & Deployment Surfaces verified clean: prod venv sys.path, prod process binding, prod tree symlinks, deployed ~/.claude hoo…
OA-560 ⬜ Runtime & Deployment What the env-profile contract gets right — verified positives
OA-328 🟡 Specs & Requirements 21 requirement ids cited from production src/ are defined nowhere under specs/, and all 21 sit outside the re…
OA-335 🟡 Specs & Requirements 66 production tooling modules carry no @traces and are named by no spec
OA-340 🟡 Specs & Requirements ADR-0038 and the ADR register describe the three-field restoration as 'in flight, uncommitted' in the commit…
OA-362 🟡 Specs & Requirements Four tracked RTM artifacts with irreconcilable totals; plans/rtm.{json,md} has no generator reference, no con…
OA-363 🟡 Specs & Requirements GHOST — documented as "a clean defect count" — is 4 rows and all 4 are test-fixture noise from the RTM toolin…
OA-391 🟡 Specs & Requirements SPEC_INVENTORY.md lists 27 of 71 specs and is read by nothing
OA-392 🟡 Specs & Requirements STORY_EXISTENCE_BASELINE: 79 of 80 entries are unreachable by the check they exempt
OA-395 🟡 Specs & Requirements Six requirement definitions in specs/009-volk-context-injection/requirements.md are absent from the RTM unive…
OA-397 🟡 Specs & Requirements Spec Status vocabulary: 24 of 71 specs use a status term SPEC_STANDARD.md does not define, and nothing checks…
OA-398 🟡 Specs & Requirements Spec metadata uses three incompatible formats, so a single-format parser silently loses three specs
OA-407 🟡 Specs & Requirements The RTM artifacts are four days stale and no mechanism asserts their freshness
OA-408 🟡 Specs & Requirements The RTM denominator carries 444 archived/deprecated requirements and 242 from specs with no Status field; 20…
OA-409 🟡 Specs & Requirements The RTM's own requirement-source scan misses two specs/*/requirements.md files that trace_intel reads
OA-424 🟡 Specs & Requirements The plan of record marks 'DELETE legacy docs/rtm.md generator' DONE while the generator exists in two copies…
OA-430 🟡 Specs & Requirements The two RTM artifacts are computed over different requirement universes and both are stale
OA-431 🟡 Specs & Requirements The two grades above UNLINKED rest on prose: 69% of CITED is a docstring mention, and DECLARED is self-docume…
OA-444 🟡 Specs & Requirements Two live ADR registers use colliding numbers for different decisions and nothing on either side records which…
OA-446 🟡 Specs & Requirements Two negative-test fixtures were never allowlisted, so the grammar ceiling is breached by 2
OA-477 🟡 Specs & Requirements health_check.py runs the RUL-013 gate with the system interpreter, where it crashes
OA-498 🟡 Specs & Requirements specs/SPEC_INVENTORY.md covers 27 of 71 specs and misidentifies SPEC-001
OA-515 ⬜ Specs & Requirements 222 orphan citations against the registry corpus, 68 of them naming a spec that does not exist
OA-520 ⬜ Specs & Requirements ADR register status consistency is 37/38 — the one authority in this domain that holds
OA-546 ⬜ Specs & Requirements The SPEC-063..072 tool wave verifies TRUE against the live registry
OA-317 🟡 Supply Chain & Payloads pyproject.toml states importing tree_sitter re-enables the GIL; measured false for the vendored wheels actual…
OA-320 🟡 Supply Chain & Payloads .github/workflows/ci.yml is dead config holding a leaked credential, and no gate validates it
OA-321 🟡 Supply Chain & Payloads .venv-ft is a 6.9 GB orphaned environment holding three banned distributions, and no check in the project can…
OA-344 🟡 Supply Chain & Payloads An untracked vendor/wheels/.gitignore containing * defeats the root .gitignore's wheel negation for any new…
OA-357 🟡 Supply Chain & Payloads Four authorities including one gate's exclusion reason state the vendored wheels are untracked; git says all…
OA-372 🟡 Supply Chain & Payloads One archived backup run has no entry in the archive's only durable log
OA-412 🟡 Supply Chain & Payloads The allowlist at check_secret_leaks.py:99 disables the four high-confidence SHAPE rules on the five files mos…
OA-433 🟡 Supply Chain & Payloads The wired staged-secrets gate fails open twice and runs on system python
OA-434 🟡 Supply Chain & Payloads The worktree-envs gate runs one of its three checks; a worktree with a branch checked out and no venv at all…
OA-459 🟡 Supply Chain & Payloads backup_orchgraph.sh hardcodes the coordinator endpoint, duplicating a value its own EnvironmentFile already c…
OA-469 🟡 Supply Chain & Payloads coverage is imported by first-party code, has never been declared in pyproject.toml, and the import line clai…
OA-479 🟡 Supply Chain & Payloads manifest.json does not carry the uuid-to-database mapping that both the script and the plan claim it does
OA-494 🟡 Supply Chain & Payloads sentence-transformers is a non-optional direct dependency that re-enables the GIL via tokenizers; the only pr…
OA-507 🟡 Supply Chain & Payloads vendor/wheels/.gitignore is *: a replaced supply-chain wheel is invisible to git status and to the generate…
OA-511 ⬜ Supply Chain & Payloads CONFIRMED CLEAN: secrets/env.sops.env leaks nothing
OA-521 ⬜ Supply Chain & Payloads All four contexts I was sent at measured GIL-off — gate battery, pytest collection, AST toolkit, session CLI
OA-524 ⬜ Supply Chain & Payloads CONFIRMED CLEAN: systemd units, env profiles, and the deployed plugin cache carry no credentials
OA-525 ⬜ Supply Chain & Payloads CONFIRMED CLEAN: vendored wheels are hash-pinned and every one matches uv.lock
OA-529 ⬜ Supply Chain & Payloads CONTROL ARM: uv.lock, the vendored wheel hashes, and the prod venv's isolation from the dev tree all hold und…
OA-540 ⬜ Supply Chain & Payloads Retention works and disk exhaustion is not the risk — 907-day horizon, measured
OA-541 ⬜ Supply Chain & Payloads Round 1's asserted 33,259 collected tests is confirmed — with the command it never had
OA-549 ⬜ Supply Chain & Payloads The dev tree is 62 GB against 30 MB of tracked content; 52 GB of it is three untracked payloads, one written…
OA-557 ⬜ Supply Chain & Payloads The uvicorn/httptools GIL hazard is fully mitigated at all five call sites and absent from every live product…
OA-559 ⬜ Supply Chain & Payloads Vendored free-threaded wheel supply chain is intact — all 5 hash-match uv.lock and are installed in the prod…
OA-561 ⬜ Supply Chain & Payloads app-settings-backup.json: 38 KB of unrelated desktop-app settings tracked at the repo root — and NOT a secret…
OA-323 🟡 Tests & Verification 110 non-test_*.py modules in tests/ — including all 19 conftest.py — are outside test-review's scope, holding…
OA-325 🟡 Tests & Verification 12 tests green-pass with zero assertions via bare return guards — conditional skips no purity checker detec…
OA-330 🟡 Tests & Verification 36 marker applications are deselected by every automated lane, so those tests never run anywhere
OA-332 🟡 Tests & Verification 45 assert len(x) >= 0 assertions cannot be false; 40 of them are in one signature-test module
OA-333 🟡 Tests & Verification 452 hand-written collected tests assert nothing
OA-334 🟡 Tests & Verification 59 tests assert only on the TEXT of repository files rather than on behaviour
OA-337 🟡 Tests & Verification 88 test modules in tests/generated_recovery/ are excluded from both pytest collection and the purity audit; t…
OA-338 🟡 Tests & Verification A 151-line pure-Python fallback module has no importer, no test, and the docstring that promises it is false
OA-339 🟡 Tests & Verification A performance test in the strict-targets module asserts no performance target
OA-369 🟡 Tests & Verification No oracle anywhere in the project checks that a test contains an assertion
OA-394 🟡 Tests & Verification Six assert <expr> or True assertions are unconditionally true; three are the whole test
OA-396 🟡 Tests & Verification Six requirements are graded CITED by test modules that can never run, and --verify cannot downgrade them
OA-399 🟡 Tests & Verification T16 and T6 are line-regex rules, not AST rules: 4 of 4 T16 errors in the whole suite are string-literal fixtu…
OA-420 🟡 Tests & Verification The generated-artifacts registry states the runner drives 268 generated test files; it drives 183
OA-436 🟡 Tests & Verification Three enforcement points disagree on whether monkeypatch.setenv/delenv is allowed, and the carve-out cites an…
OA-442 🟡 Tests & Verification Two divergent generate_pytest.py generators, neither wired to any gate, produce 2,735 collected tests
OA-443 🟡 Tests & Verification Two incompatible T-rule registers: AGENTS.md T1-T9 versus test-review.py T1-T16, with 964 test modules carryi…
OA-450 🟡 Tests & Verification --ignore=tests/_generated_broken names a directory that does not exist, and the phantom name is replicated…
OA-452 🟡 Tests & Verification pytest --collect-only starts infrastructure: a read-only measurement command has a service-mutating side ef…
OA-489 🟡 Tests & Verification ruff and mypy are the only gates with no test, and the battery's lint commands are not pinned to CI's
OA-502 🟡 Tests & Verification tests/tools/ shadows the repo's top-level tools/ package at sys.path[0] inside every pytest process
OA-505 🟡 Tests & Verification uncovered-policies cannot fail by construction and the battery renders its finding as OK / ALL GATES PASS
OA-516 ⬜ Tests & Verification 33,259 confirmed exact — round 1's denominator is correct, it was simply never measured
OA-548 ⬜ Tests & Verification The canonical run report proving the suite green covers 389 of 33,259 tests, at a commit that is not HEAD
OA-550 ⬜ Tests & Verification The four named critical subsystems are behaviourally proven; none depends on generated tests
OA-553 ⬜ Tests & Verification The no-skips rule holds across the whole suite
OA-554 ⬜ Tests & Verification The tests/ tree is genuinely clean on all five categories the purity gate names
OA-563 ⬜ Tests & Verification pyproject.toml ignores a test directory that does not exist
OA-565 ⬜ Tests & Verification tests/test_models.py, test_types.py, test_exceptions.py and test_interfaces.py test emptied umbrella namespac…
OA-345 🟡 Unopened Surfaces B25 Part 1 was completed, reverted by the 2026-07-27 branch hijack, then superseded — and tasks/ is still the…
OA-389 🟡 Unopened Surfaces SPEC-028's default model assignments contradict configs/spike-profiles.yaml on three unchecked test items, un…
OA-413 🟡 Unopened Surfaces The architecture gate's cache fingerprint excludes scripts/, so editing the checker keeps its stale PASS
OA-429 🟡 Unopened Surfaces The standard claims KNOWN_VIOLATIONS is the only exception mechanism; the checker carries three further undoc…
OA-448 🟡 Unopened Surfaces Undocumented TYPE_CHECKING carve-out hides 32 would-be violations from both the violation count and the INFO…
OA-454 🟡 Unopened Surfaces arch-canvas/ at the repo root is a dead v0.1.0 fork, 1,499 diff-lines behind the live v0.2.0 submodule that s…
OA-456 🟡 Unopened Surfaces architecture/ is outside every lint root and every AST root; ruff finds 11 errors nobody runs
OA-471 🟡 Unopened Surfaces design/ holds five 1-to-7-byte placeholder files that have never contained real content
OA-482 🟡 Unopened Surfaces prolog/multiagent.pl's justification cites a marker role core/paths.py had already retired 13 days earlier
OA-484 🟡 Unopened Surfaces reports/architecture_report.md is a tracked, stale, unregenerated verdict from 2026-05-17
OA-486 🟡 Unopened Surfaces research/kg-ontology.md is a pre-port ontology naming a decommissioned endpoint, a plaintext credential, and…
OA-488 🟡 Unopened Surfaces rtm/scripts/architecture_checker.py is a 534-line dead fork sharing the filename of the enforcement source of…
OA-492 🟡 Unopened Surfaces schema/ast-ultimate.schema.json has zero readers and the project has no JSON Schema validator dependency at a…
OA-493 🟡 Unopened Surfaces schema/ast-ultimate.schema.json is 13 emitted field-kinds behind its producer, including runtime_calls, which…
OA-500 🟡 Unopened Surfaces tasks/core-threadpool/review-report.json — a 387 KB tracked generated artifact, 124 days old, with no consumer
OA-501 🟡 Unopened Surfaces templates/instructions-fix-tests.md has zero references anywhere in the repository
OA-503 🟡 Unopened Surfaces tools/ is outside the AST snapshot's roots — the mandated toolkit is structurally blind to it
OA-504 🟡 Unopened Surfaces tools/analyze_ast.py and tools/extract_ast.py are dead — zero references, superseded by the mandated AST tool…
OA-518 ⬜ Unopened Surfaces A second stale-checkout sink, .harness/worktrees/, is not named in the dossier's trap 1
OA-523 ⬜ Unopened Surfaces All three live AST snapshots validate CLEAN against schema/ast-ultimate.schema.json — first validation ever r…
OA-535 ⬜ Unopened Surfaces HEALTHY: the layer rule itself is clean at HEAD and the standard's exception list matches the code verbatim
OA-555 ⬜ Unopened Surfaces The two 2026-07-27 branch hijacks that date every file in tasks/, and the one casualty nothing checked
OA-562 ⬜ Unopened Surfaces claude-env/install-infra.sh is clean, and the open backlog item calling its NEO4J_URI_GW keys 'dead refs' is…
OA-566 ⬜ Unopened Surfaces typings/ and configs/ are live, correct, and in sync — the healthy control arm for this domain
OA-316 🟡 Write Sinks, CI & Dating gates.py documents a --fix-ast flag that argparse rejects
OA-354 🟡 Write Sinks, CI & Dating Every reviews/*.json reports two different issue counts; 31.0% of the corpus disagrees with itself
OA-380 🟡 Write Sinks, CI & Dating Round 1 reported the CI surface as unrunnable while the live GitLab CI has run 623 times
OA-381 🟡 Write Sinks, CI & Dating Round 1's TOP-02 undercounts the GitHub workflow by 2.6x and omits that GitLab CI exists at all
OA-406 🟡 Write Sinks, CI & Dating The NOT_ARTIFACTS exclusion for reviews/ states a file count 27% below the measured one
OA-410 🟡 Write Sinks, CI & Dating The RUL-030 registry's spec-checklist glob covers 57 of 73 spec directories, and the 16 without a checklist a…
OA-419 🟡 Write Sinks, CI & Dating The generated-artifacts gate carries a hand-typed reviews/ file count that has drifted 37% in ten days
OA-427 🟡 Write Sinks, CI & Dating The reviews/ reader is traced to a requirement about deferred work items; SPEC-020 has no requirement for it…
OA-438 🟡 Write Sinks, CI & Dating Three review producers, zero invocations: the only .md emitters for the sink are dead, and one resolves its r…
OA-470 🟡 Write Sinks, CI & Dating deploy/gitlab-runner/README.md records the private-registry auth as verified; it has been false for 12 days
OA-475 🟡 Write Sinks, CI & Dating gates.py's own documented invocation crashes on this host because it propagates the invoking interpreter to s…
OA-487 🟡 Write Sinks, CI & Dating reviews/README.md is negated twice in .gitignore and has never existed in the repository's history
OA-510 ⬜ Write Sinks, CI & Dating My own write side effect, disclosed: one bytecode cache file
OA-531 ⬜ Write Sinks, CI & Dating Control arm: the parts of the artifact surface that are genuinely healthy, and how I know
OA-537 ⬜ Write Sinks, CI & Dating Measurement integrity: the working tree and the AST snapshots moved during this read-only run
OA-538 ⬜ Write Sinks, CI & Dating No retention mechanism exists for reviews/; 40.4% of the corpus is byte-identical duplicates and its only res…
OA-542 ⬜ Write Sinks, CI & Dating Staleness of the unguarded registry artifacts, measured in input commits since each was last written
OA-556 ⬜ Write Sinks, CI & Dating The two vizint CI jobs are a real, falsifiable control arm — the only CI in this project that works

7. Corrections ledger — 11 claims proven wrong

Claims this analysis made and then had to retract, including its own. Kept in the document because a corrections ledger is the only evidence that the verification layer works — an analysis that never corrects itself is not being checked.

R1 TOP-06 — FALSE

The deployed session CLI destroys goal.current_step and portfolio_goals on every write. Ranked step 1 of remediation.

Measured against the live 449,585-byte context.json, both fields appear 0 times. The round-trip that 'proved' the loss ran against state the analyst had seeded himself, then was reported as ongoing production loss.

Lesson. A proof executed against synthetic state is not a claim about production state. Every finding must declare which one it measured — this is why the round-2 schema made state_measured a required field.

R1 TOP-03 (prescribed fix) — NO-OP

Fix the assert-free smoke template by editing scripts/generate_pytest.py:1387-1441.

Rendering reads templates/smoke_test.jinja2 from disk via FileSystemLoader; the write-back is skipped when the file exists. The two copies are byte-identical today, but only the on-disk copy is ever read, so the prescribed edit would have changed nothing. The underlying defect (1,074 assert-free tests) is real and confirmed.

Lesson. Before prescribing a fix, prove the line you name is the line that executes.

R1 "1,531 architecture violations" — NOT REPRODUCIBLE

The codebase carries 1,531 violations of its own published architecture standard.

Measured at HEAD: 0 unwaived violations over 868 files (default root) and 934 (the CI root), with exactly 1 pre-waiver violation — the single documented KNOWN_VIOLATIONS entry. No configuration of the checker reproduces 1,531. The number was published with no method attached.

Lesson. A number without the command that produced it is not a measurement. The real architecture defect is not violation count — it is that the gate cannot fail (OA FATAL, --strict omitted) and the only strict runner has been dead 12 days.

R1 "the repo was left untouched" — FALSE

The read-only mandate held; git status shows the expected 14 entries.

11 files were written to reviews/, plus .cache/gates.json and .coverage. All are gitignored, so git status was structurally incapable of seeing them.

Lesson. git status cannot verify a read-only mandate. Use find -newermt. Round 2 adopted this and its own side-effect audit came back clean apart from expected cache writes.

R1 "gates.py is invoked by nothing" — FALSE

The 23-gate battery has no caller anywhere in the system.

.claude/hooks/single-gate-entrypoint.sh, registered at .claude/settings.json:51, is the live guard, and .cache/gates.json records 24 cached keys from a real run. The search that produced the claim covered deploy/, scripts/, .github/, pre-commit and pyproject.toml — and never .claude/hooks/.

Lesson. The defect is coverage and false-greens, not absent wiring. Searching every plausible location except one is indistinguishable from not searching.

R1 gate count (23 vs 24) — SETTLED — 23

The report used 23 and 24 interchangeably.

An AST parse of the GATES dict returns exactly 23 literal keys. The 24th key in .cache/gates.json is __ast__, the pre-gate AST-refresh fingerprint namespace — never a gate, never in selected.

Lesson. Two numbers for one thing is always a reader disagreement worth resolving; here it was benign, but the same shape is a real defect six times over in the requirement corpora.

R1 test-count and assert-free figures — CONFIRMED EXACT

33,259 collected tests, 1,074 of which cannot fail.

pytest --collect-only -q returns 33259/33399 tests collected (140 deselected) in 14.59s, exit 0, and independently reconstructs from a per-directory sum. The 1,074 figure is confirmed three ways and is not an undercount.

Lesson. Recorded because it is the control arm: round 2 was sent to break these numbers and could not. Asserting without measuring was still wrong, even where the assertion held.

This analysis — finding id space — FALSE

Agent-local finding ids are usable as report ids.

Two round-2 lenses independently minted GS-01 through GS-14 for entirely different defects; 15 ids collided in total. All findings were re-keyed to a global OA-NNN space with agent ids demoted to provenance.

Lesson. This is the same two registers, one id space defect the analysis found in the project's four ADR registers. A report that catalogues a defect while committing it has not understood it.

R1/R2 "the SPEC-020 audit trail was never built" — REFUTED

~/.claude/audit/ is absent at both candidate roots and every artifact capable of dating it points to never-created, so SPEC-020's audit trail was specified and never implemented.

The trail ran. An off-machine copy holds 2,890 objects totalling 235.534 MiB spanning 2025-12-28 to 2026-04-16, alongside a settings.json (ModTime 2026-04-16 18:45:14) that registers five audit writers. The directory vanished with the 2026-04-29 recreation of ~/.claude. Every local artifact pointed at 'never built' only because no local artifact can see before 2026-07-28 — the three tools that would normally date it are all structurally blind to claude/.

Lesson. Absence of evidence inside a bounded observation window is not evidence of absence. The analysis correctly flagged that its tools were blind rather than concluding from their silence — and the swarm sent to widen the window found the data. This is what the unverified state is for: it is not a soft 'probably wrong'.

This session — regenerating a committed generated artifact — FALSE — silently destructive

Running the generator command documented for plans/ast-ultimate.json reproduces it.

--source src/orchestrata_ultimate (the command in the file header and cited by ast_live_sync.py:101) produces 868 modules. The committed artifact has 2,976 across six roots, and carries 3,680 runtime_calls entries merged in afterwards by a separate tool. A naive regenerate narrowed the artifact by 70% and dropped every runtime edge — and freshness_guard.py:12 documents that exact incident ('derive_rtm fell 1055->575'). Recovered by reading root_path/extra_roots off the committed copy and re-running build_runtime_callgraph.py reaugment.

Lesson. A generated artifact whose documented command does not reproduce it is a defect in its own right — the header, ast_live_sync.py:101, and the artifact disagree. Before regenerating any committed artifact, read its own provenance fields and check for post-merge passes; the documented command is a claim, not an oracle.

This session — binary-file grep — FALSE

grep -rl <needle> backups/ returning nothing means the needle is absent.

GNU grep suppresses output on files it detects as binary, so the command printed nothing whether the answer was 'no' or 'I could not look'. grep -a on the same file returns 6 matches. A true FATAL was nearly rejected on that silence.

Lesson. The oracle-that-cannot-fail pattern is not only in the codebase under analysis — it caught the analysis itself. Prefer a method with no give-up path: the analysts used in-process bytes.count(), which has no binary heuristic.

8. Decisions reserved to the user — 6 curated + 27 raised by the swarms

Each of these changes what gets built. None is resolvable by measurement — the swarm that investigated them was given a schema with no verdict field, so it could gather evidence for both sides and nothing else. Final say is the user's.

D-01 — Are the project's PreToolUse/Stop guards dead everywhere, or is their inertness scoped to sessions rooted outside the project?

What would settle it. A controlled main-session invocation from the project root of a command the guard is known to match, with the hook's own stderr captured.

Consequence. Side A means the enforcement layer must be rebuilt and every 'guarded' claim in the docs is false. Side B means one scoping fix restores it and the docs are right for the normal case.

Why it is yours. It determines whether the enforcement layer is rebuilt or repaired — a scope call, not a fact.

D-02 — Which of the four ADR registers is authoritative?

What would settle it. Nothing measurable. All 25 overlapping ids carry different decisions in each register; a three-way detector returns 25 AMBIGUOUS_COLLISION + 13 MISSING_FROM_GRAPH.

Consequence. Whichever loses must be renumbered or namespaced. Ingesting the repo set as-is would either raise AdrImmutabilityError or silently overwrite a ratified wiki decision.

Why it is yours. Ratification is an authorship act. No amount of measurement decides which decision record binds the project.

D-03 — Which requirement corpus is authoritative, given six readers spanning 3,087 to 7,245 ids?

What would settle it. A decision, not a measurement. Both RTM artifacts declare "verified": false, and both disagree with their own declared row counts.

Consequence. Every requirement-coverage percentage in the project currently has an undeclared denominator. Until one corpus wins, no coverage number means anything.

Why it is yours. Choosing a corpus sets the denominator for every future traceability claim.

D-04 — Is architecture/layer-dependency-rules.md superseded, or is it the intended target model?

What would settle it. Your intent. Neither document references the other, so the tree records no supersession either way.

Consequence. Side A means add a supersession header (or delete and fix 3 inbound refs). Side B means the shipped model is the drift and the checker should be moved toward the document.

Why it is yours. The analyst explicitly declined to resolve it by deletion: it is a design record, and which model is 'right' is an architecture decision.

D-06 — Two formatters are declared on one tree and they disagree on 401 files. Which one is authoritative — black or ruff format?

What would settle it. Nothing measurable — both run correctly, they simply disagree (chiefly on collapsing implicit string concatenation). The tree is consistent under black only because the pre-commit hook that would run ruff format has never executed.

Consequence. Picking ruff format means a 401-file reformat commit and dropping black from gates.py:421. Picking black means deleting the ruff format pre-commit hook so it cannot churn the tree if pre-commit is ever repaired. Leaving both declared guarantees a 401-file diff the first time the dormant hook wakes up.

Why it is yours. Tooling choice, not a defect. NOT a new discovery: the user's own memory (feedback-push-deploy-wire-automatically, 2026-08-14) already records this exact split — 'orchestrata's arm asserted ruff format --check in a repo that formats with black... it demanded 439 files be reformatted, so it could only ever pass by breaking the repo.' The count is 401 today. It has been known and unfixed for 9 days, and it is recorded there as one of the two ways ship lies about being verified. That makes it a standing decision the user has already seen, not a finding.

D-05 — SPEC-020's ~/.claude/audit/ trail DID exist and was lost. Restore the 235.5 MiB of historical findings, or write them off and rebuild from today?

What would settle it. EXISTENCE IS NOW CLOSED — the swarm measured it, and round 1's premise that the trail was never built is refuted. What remains is a judgement only you can make about whether pre-2026-04-29 findings have value, plus one fact nobody here can measure: whether mseek: is scheduled for retirement.

Consequence. RESTORE costs days: re-register five writers on the current delivery path, settle the root-location question, and pull the data back before mseek: goes away. FRESH BUILD costs only the wiring, but REQ-020-208's never-delete guarantee is then knowingly broken once and re-baselined from today.

Why it is yours. The original question — did it ever exist — was answered by measurement, and the answer is YES. What is left is a value judgement about four-month-old data on a remote you have recorded as stale.

Additional questions the swarms raised

Surfaced by a coordinator or the gap consolidation rather than curated above. Same rule: evidence on both sides, no verdict.

S-01. What is rtm/ — a frozen historical record to be excluded from all future sweeps, or a retired tree to be deleted?

What would settle it. Whether anyone will ever need to read rtm/ as a record of what the port looked like. If yes it must be added to the migration-exclusion list the way frozen AST snapshots already are, and its 60 modules declared out of AST scope. If no it is 81 files of collision hazard. Only the owner of the porting history knows.

Consequence. FROZEN: sweeps stop rewriting 15k lines of a file nothing reads, but the six script forks and the third session_cli.py stay on disk and will be found again by the next agent grepping a bare filename. RETIRED: the collision hazard and the fork-then-diverge risk are gone permanently, and the April-2026 port record is gone with them — recoverable only from git history.

S-02. Which of the four materialized RTM corpora is authoritative — docs/rtm.json (3,087 ids), rtm/rtm.json (4,467), plans/rtm.json (5,121), or reports/rtm-evidence.json (7,245)?

What would settle it. Which corpus the project intends its requirement attribution to be computed FROM. Nothing in specs/ decides it — git grep 'rtm/' -- specs/ returns nothing, so the choice has no recorded owner. Note also that the harvester feeding one of them is blind to claude/ and scripts/ (607 requirement citations in unscanned roots, per the base dossier), so 'widest' is not automatically 'most complete'.

Consequence. Whichever is chosen, the other three must become derived or deleted, and the gate's 'the ONE' wording must either become true or be replaced by a line that prints which corpus was read and its id count. Choosing docs/rtm.json keeps every requirement attribution computed from the narrowest of four sets — 4,158 ids the system knows about will never appear in a Serves: clause. Choosing reports/rtm…

S-03. Is tasks/ a live work queue or a completed-work archive?

What would settle it. Whether new work will be dispatched from tasks/ again. Every finding on this surface flips with the answer: as an archive the banned -n auto and monkeypatch instructions in the three coverage briefs are harmless history and the dead review report can stay; as a queue those briefs are live instructions to violate the project's own bans, and 30 briefs need status markers.

Consequence. QUEUE: the three coverage briefs must be rewritten before any agent is pointed at them (GAP-17), all 30 briefs need STATUS fields, and the 8 unbriefed §9 rows are a real gap. ARCHIVE: it needs a dated README saying so, tasks/core-threadpool/review-report.json can go, and GAP-16's spec-status gate should read the tree rather than the briefs. Today it is neither, which is the worst state: live-look…

S-04. The 403 on the CI image has stopped all remote verification for 12 days. Restore the registry credentials, or move enforcement fully local and stop depending on remote CI?

What would settle it. Whether the GitLab account still needs a working pipeline for anything other than these jobs — and whether the registry access can be restored durably rather than re-breaking on the next token rotation. Note build-image is rules-gated on changes: docker/Dockerfile.ci, so it cannot self-heal the image.

Consequence. RESTORE: lint, test and architecture-check return, but nothing yet alerts on the next 160-pipeline silence, so the same 12-day blind window can recur unnoticed. LOCAL: enforcement becomes trigger-dependent on an agent invoking the battery — and the base dossier already records that gates.py has no automatic trigger — so the project would be trading a dead remote gate for a manually-invoked local…

S-05. What happens to .github/workflows/ci.yml — an actively-maintained GitHub Actions workflow on a repository whose only remote is GitLab?

What would settle it. An inventory of which of its 8 checks exist in .gitlab-ci.yml or scripts/gates.py. I verified only the pyright path (absent from both). The other 6 are unexamined and that inventory is a prerequisite either way.

Consequence. PORT: 8 checks gain a real runner, but they land on the GitLab pipeline that is currently 100% red (see the previous decision), so they will not execute until that is fixed. DELETE without the inventory first: any check unique to it is silently lost, and check_feature_loss.py detects loss-by-deletion only for FILES, not for capabilities. Leaving it is the status quo that produced GAP-07.

S-06. architecture/layer-dependency-rules.md contradicts the shipped layer model on memory, cli, integrations and four packages that do not exist. Mark it superseded, or delete it?

What would settle it. Whether the document's layer reasoning still has value independent of its now-wrong package names. Only whoever owns the design record can say. Either answer requires fixing the 3 inbound references.

Consequence. SUPERSEDED: the contradiction stops misleading readers but two layer tables remain in the tree, and the 2026-07-06 review shows that a stale document survives a formal review when the reviewer measures the wrong thing. DELETE: one authority remains — but architecture/modular-monolith.md contains a full Layer 0-5 narrative that was NOT diffed against the shipped model, so a fourth authority may al…

S-07. SPEC-028's checklist and configs/spike-profiles.yaml disagree on three default model assignments. Amend the spec to the operational values, or move the config back to the spec'd Claude models?

What would settle it. Which models the user actually wants running behind U:Cx, U:Ar and J:Junior today. That is a cost and capability call nobody but the user can make, and the 402 that forced the original substitution may or may not still apply.

Consequence. AMEND: the operational values become the record and TEST-028-017/018/019 can be checked and enforced. MOVE BACK: the models change under live agents and the 402 that triggered the substitution must be resolved first. Doing neither continues a 48-day-old contradiction that has already been re-measured twice, with the one test that could have failed on it written to describe the divergence instead…

S-08. The SPEC-020 audit trail demonstrably ran (2,890 objects / 235.534 MiB, 2025-12-28 to 2026-04-16) and vanished with the 2026-04-29 recreation of ~/.claude. Is this a RESTORE of a lost capability or a fresh BUILD that writes off the historical data?

What would settle it. Two read-only commands already re-run and reproducible in under two minutes: rclone size mseek:Workspace/sync/.claude/audit and rclone lsl mseek:Workspace/sync/.claude/audit. Those settle EXISTENCE, which is now closed. What settles the choice is a judgement only you can make about whether the pre-2026-04-29 findings have value, plus one fact I cannot measure: whether mseek: is scheduled for…

Consequence. RESTORE costs days, not hours: re-register the five writers on the current delivery path, settle the root question (decision #2), and pull 235.5 MiB back before mseek: goes away — landing recovered data beside new data with a four-month gap between them. FRESH BUILD costs only the wiring, but REQ-020-208's only never-delete guarantee is then knowingly broken once and re-baselined from today, whic…

S-09. When the audit writers are re-wired, does the trail live at ~/.claude/audit/ (what SPEC-020 says in 12 places and what the 2025-12→2026-04 data used) or at ~/.claude/plugins/data/orchestrata-orchestrata/audit/ (where the CLAUDE_PLUGIN_DATA branch sends it under the current plugin delivery path)?

What would settle it. The factual half is already settled — intercept_edit.py ran this experiment for you on 2026-08-22 and the answer is plugin-data. Only the policy half is open, and nothing measurable decides it: it is a choice about whether never-delete data may live adjacent to a directory the writers' own comment describes as replaced wholesale on update. If you want confirmation for the audit writers specifical…

Consequence. ~/.claude/audit/ contradicts the stated rationale for the CLAUDE_PLUGIN_DATA branch and requires an audit-specific exception in five files. Plugin-data requires amending SPEC-020 at all 12 locations and rewriting REQ-020-124/200/204/205, and places REQ-020-208's NEVER-deleted guarantee inside a plugin data directory — which then needs an explicit statement of why plugins/data survives a plugin up…

S-10. The project enforcement layer fires in BOTH main sessions and delegated subagents when the session is launched inside the repo, and in NEITHER when launched from $HOME. Should TOP-04 be reclassified as a launch-practice failure, or should the guards be re-anchored so they arm regardless of launch directory?

What would settle it. One controlled pair, which only you can run because it requires a top-level interactive session: launch claude with cwd = /home/mohamed/workspace/orchestrata-ultimate-architecture and issue : pytest -n 4; then repeat from /home/mohamed. Deny-then-allow confirms the scope explanation; allow-then-allow means a second independent failure exists. CAUTION: launching from the repo root fires 7 Sess…

Consequence. RECLASSIFY: every round-1 finding phrased as 'the guard did not fire' must be re-read as 'this session was $HOME-rooted', and every finding derived from that must be re-taken from a repo-rooted control run before it is acted on — the whole round-1 swarm and this one ran unguarded from /home/mohamed. RE-ANCHOR: the guards' blast radius changes from this repo to every project on the machine, so eac…

S-11. Is claude/settings.json the intended source of truth for user-surface hook registration, or is it dead config to be deleted?

What would settle it. The installer already carries the oracle at lines 458-459: register_hooks.py "$PREFIX/settings.hooks.json" "$PREFIX/settings.json" --check --plugin auto || fail 'a declared hook is not registered in settings.json — deployed but not wired'. Whether that gate turns red when the five writers are declared is a one-command experiment that decides whether they are in scope for the current delivery pa…

Consequence. SOURCE OF TRUTH: a fresh machine would be seeded with a 2026-07-27 hook set that duplicates 31 plugin registrations and re-registers hooks the cutover deliberately dropped — so its 12 entries must be reconciled against settings.hooks.json's 31 FIRST or every event double-fires. DEAD CONFIG: the fresh-machine bootstrap still needs a seed from somewhere, the five audit registrations must be authore…

S-12. Which document is authoritative about where hooks are registered: SPEC-020 (~/.claude/settings.json, zero mentions of the plugin) or claude/README.md + register_hooks.py + gates.py (the plugin's hooks/hooks.json, with settings.hooks.json as a compile-time declaration)?

What would settle it. For the factual half — whether the binary reads settings.hooks.json at all — one probe closes both loopholes my passive measurement leaves open: add a uniquely-named marker hook (SessionStart running sh -c 'date >> /tmp/shj-probe.log') to ~/.claude/settings.hooks.json ONLY, present in neither ~/.claude/settings.json nor the plugin manifest, then start one fresh claude session. Zero lines = not…

Consequence. SPEC-020 AUTHORITATIVE: the spec must be amended to describe plugin delivery with requirement IDs pinning it, or registration moves back into settings.json — and until then no statement in specs/ about hooks can be trusted. CODE AUTHORITIES: SPEC-020 §36 and §231 are stale and must be corrected along with a supersession note in plans/spec-020-drift-ledger.md:37, whose 'claude/settings.hooks.json…

S-13. Is the permissions block inside claude/settings.hooks.json a DECLARATION the deploy is meant to apply, or inert documentation of a hand-maintained file?

What would settle it. Add one assertion to register_hooks.py --check comparing declared permissions against $PREFIX/settings.json and observe that it passes today (all 9 declared rules are a strict subset of the live 26 — set difference is []), then break one rule by hand and confirm the assertion CAN fail. Alternatively, temporarily remove one rule (e.g. Bash(docker version *)) from both live files while leaving it i…

Consequence. DECLARATION: the block is silently failing to grant Bash(incus *) and defaultMode='auto' on any machine the installer touches other than this one, and the fix is to extend patch_settings.py to merge declared permissions and give register_hooks.py --check an oracle that can fail. INERT: the key must be deleted or moved out of the declaration, because leaving a permissions/defaultMode key in a file…

S-14. Is a SPEC checklist a record of what was BUILT, or a record of what is CURRENTLY TRUE?

What would settle it. Whether any gate in scripts/gates.py consumes the checkbox state. If none does, the boxes are decoration and only the 'record of what was built' reading is available; if one does, the 'currently true' reading is forced. That is a grep over gates.py against the checklist paths, and it settles the question mechanically.

Consequence. BUILT: nothing in specs/ can ever be cited as evidence of live behaviour, and plans/spec-020-drift-ledger.md becomes the only current-state authority — which must be stated in the checklist header so the next reader does not repeat round 1's inference. CURRENTLY TRUE: the nine entries must be unchecked today and the checklist needs a re-validation trigger, because it survived a 2026-08-03 edit wi…

S-15. Is rtm/ a live surface or a retired staging area? It holds two more requirement corpora (4,467 unique ids, plus a third framing at 4,311) and a 36-file parallel toolchain of which 30 files exist nowhere else and 5 diverge from scripts/.

What would settle it. For each of the 30 only-in-rtm scripts, an execution-provenance check: does any tracked output artifact carry its signature, and does any hook, gate, CI stage or ship stage invoke it? Anything with neither is answerable by deletion; anything with either must be wired to a single copy. Separately, run the generator rtm/rtm.json and rtm/requirements.json claim and diff its output against the commit…

Consequence. LIVE: the authoritative-corpus choice widens from two candidates to four, the 4,467-vs-4,311 disagreement inside rtm/ must be reconciled first, and the 291 duplicate rows in rtm/requirements.json point at a producer that is still producing them. RETIRED: 30 files including three unique RTM tools are deleted — verify their outputs are reproducible elsewhere first. EITHER WAY, resolve the 5 diverge…

S-16. Is the claude CLI a hard requirement of the fresh-machine bootstrap, or an over-restriction the installer should relax?

What would settle it. Run the preflight on a container that has git, rsync, cmp, uv and python3 but no claude, and record whether anything useful could still have been deployed. SPEC-108 FR-002 already notes that a clean Ubuntu 24.04 container reproduces this path.

Consequence. HARD REQUIREMENT: two spec edits, no behaviour change. OVER-RESTRICTION: the installer changes and so does ordering step 1 of claude-env/README.md's bootstrap — which is itself stale (it still documents the claude-env/global/ bundle deleted 2026-08-14) and would need rewriting in the same pass.

S-17. Round 1 section 6 states '10 recorded; the coordinators resolved 7 by measurement' and names only 3. Should the 7 claimed resolutions be reconstructed and re-verified before the remediation sequence is acted on, or should section 6 be formally superseded by the master register's contradiction rows?

What would settle it. The round-1 domain-coordinator transcripts, if they were retained. If they were not, side A is not executable and side B is forced by default.

Consequence. RECONSTRUCT: costs a transcript pass and delays remediation, but no round-1 conclusion is acted on while resting on an unrecorded resolution. SUPERSEDE: section 6 must be struck or annotated, because leaving '7 resolved by measurement' standing makes a future reader believe seven contradictions were closed with evidence that does not exist.

S-18. Rotate DEEPSEEK_API_KEY only, or also purge the leaked blob from git history with a force-push?

What would settle it. Whether this history will ever leave the current trust boundary — additional collaborators, a public mirror, a CI runner outside this host, or an artifact-sharing workflow. If the answer is never, rotation alone closes it. Also: whether any of the four historical values is reused anywhere outside this repo, which only the user can know.

Consequence. Rotate-only leaves four historical credential values permanently readable by anyone who ever gains repo read access; if the trust boundary widens later, purging then is far more expensive and the values will have been exposed in the interval. Purging now costs a coordinated force-push and re-cloning of six worktrees, the prod checkout and the plugin marketplace clone — and a botched rewrite on a…

S-19. How should the 1,276 findings be driven to zero before check_secret_leaks.py is wired: narrow the [name-pattern] rule, or bulk-waive with # gate-ok: reasons?

What would settle it. A sample: take 50 random [name-pattern] hits across tests/, specs/ and plans/ (the 879 in non-shipping trees) and count how many would survive a value-shaped-literal requirement. If near zero, narrowing is free. If a meaningful fraction survives, narrowing is deleting real detection and waivers are the honest choice. Nobody has run that sample.

Consequence. Narrowing wrongly permanently blinds the gate to a whole leak shape and the loss is invisible — the gate stays green. Waiving wrongly leaves 1,200+ waiver comments across the tree that decay into noise, and the next author copies a waived pattern. Either way the ordering is fixed: wiring the gate before triage lands it permanently red and trains --no-verify, which is the exact failure 9454e2dc…

S-20. Does RUL-027 forbid production writing DATA into the dev tree, or only production EXECUTING from it?

What would settle it. The user's intent for RUL-027, which exists nowhere in the record: the ruling text enumerates four execution directives and never addresses data or logs, and history_intel.py why check_prod_tree_separation returns no_loss_on_record. The unit that decides where 9.5 GB of production state lands is not under version control in this repo, so there is no supersession trail to read.

Consequence. Execution-only means the gate needs an explicit data-path exemption and the 9.5 GB stays one git clean -xdf from destruction inside a checkout that a running container can also write to. Any-coupling means the archive must move (a one-time mv plus three literals in two tracked copies, preserving the retention window the rationale was protecting) and the gate's directive list, glob and fingerp…

S-21. Should the workspace bind-mount into the running claude-orchestrata container become read-only?

What would settle it. What actually runs inside it. incus exec claude-orchestrata -- ps plus an inspection of what those processes write under /workspace would answer it in one command — I deliberately did not exec into it under the read-only mandate. If nothing writes, read-only is free.

Consequence. Leaving it writable keeps a path by which a process in a container can destroy the only production backup and the git object store, with no gate, no ruling and no IaC covering it. Setting it read-only without checking may break a live agent workflow silently — and because the container is absent from infra/, whichever way it is set, the setting is undocumented and will not survive a rebuild.

S-22. Should sentence-transformers remain an unconditional [project].dependencies entry?

What would settle it. Whether any production code path constructs a local SentenceTransformer embedder. The RAG/semantic-graph configuration for the prod profile answers it; the analysts established only that the import is lazy and that no daemon has it mapped today, which is consistent with either answer.

Consequence. Keeping it unconditional leaves a GIL-flipping extension one refactor away from being imported at module scope in a SPEC-023 free-threaded system, with no mechanism to catch that. Moving it to an extra risks a production import error at first use if a prod path does need local embeddings and the extra is not installed — a failure that would appear only when the embedder is first constructed, not…

S-23. Which tree is the production knowledge graph's code layer supposed to describe — the deployed prod checkout, or the dev working tree?

What would settle it. Your ruling on who the graph's primary consumer is. The measurement that informs it: today the graph describes a state that exists in NO commit (uncommitted analyzer edits reached production before they reached git), and there are two writers owning the same Module node ids with different file_path roots and no supersession rule — whichever ran last wins. If KG-F7 is fixed without settling this,…

Consequence. Choosing prod means the graph stops answering questions about uncommitted work in progress — /code deps and the context injector describe what is deployed, not what you are editing. Choosing dev means production services consult a graph describing a tree they do not execute, and a dirty worktree is permanently part of the production oracle. Either is defensible; the current state is neither, and…

S-24. Which database is the authority for the code->requirement traceability layer: operational orchkg under the canonical vocabulary, or semantic memgraph under the retired one?

What would settle it. Your ruling, plus one measurement I deliberately did not take: whether the TEST orchkg graph (10.53.2.10) holds TRACES_TO edges. If it does, the writer works and was simply never re-pointed at prod after the 2026-07-26 migration, and side A costs one command. If it does not, the writer itself is broken and side A costs a debugging session. That single query changes the price of A but not the prin…

Consequence. Under A, the semantic database's roughly 39,000 traceability edges become orphaned duplicates that will drift silently — they already speak a vocabulary the canon retires. Under B, fourteen production modules including the live context injector are pointed at the wrong database and must be rewired, and the canonical schema's authority over traceability ends. Leaving it unsettled is the current st…

S-25. Which register owns the ADR id space — the repo's docs/adr/ (38 decisions) or the wiki decisions register (25, which the graph currently holds)?

What would settle it. Your ruling. The measurement is unambiguous and does not favour either side: all 25 overlapping ids ADR-0001..0025 name DIFFERENT decisions in the two corpora, both registers write the same key {project}:ADR-{number:04d} via the same writer, and the graph holds the wiki decision in all 25 cases. There is also an uncompared fourth surface — 38 :ADR nodes in the semantic database, matching docs/adr…

Consequence. Whichever way it goes, a renumbering breaks every existing citation of the losing register's ids across plans, commits and session history. Not deciding costs more each week: the two registers keep growing into the same key space through the same writer, and the only detector that would report it runs in zero automated contexts.

S-26. Should the 34,506-node ConversationTurn corpus be aged out, archived, or left to grow — and what should happen to the 118 orphan conversations holding 7,150 turns?

What would settle it. Your ruling on the value of old conversation history. The orphan disposition is a separate call within it: of the 118, five carry pytest test-function names (test_execute_returns_tuple0/1/2) and are unambiguous test pollution to sweep; around 70 are ephemeral claude-cli-adapter-* ids holding 140 turns; and 43 carry real slugs (mohamed, knowledge-wiki, orchestrata-handover, dr-hannah) holding 6,99…

Consequence. Aging it out bounds the graph and closes 5,319 of the 67,665 unreachable nodes, at the cost of history you cannot recover. Archiving keeps the memory but leaves the largest uncovered exhaust label growing indefinitely. Deleting the 43 real orphan conversations wholesale would destroy 6,997 turns; linking them requires minting :Project nodes for slugs like mohamed that are directory basenames, n…

S-27. May a controlled WRITE probe be driven through the deployed gateway to settle whether the kernel/orchestrator graph writers are disconnected or production is simply idle?

What would settle it. Your authorisation. What is already measured and is not in dispute: CXPPacket, Intent and PipelineRun all stop at 2026-08-05T09:36:51; GatewayAuditEvent collapses on the same day and has 14 events since (last 2026-08-19); kernel-shaped ToolCall, Run and PolicyDecision stop at 2026-07-26; and both daemons are active 8h at 0 restarts on the prod venv with correct exe and cwd binding. The 2026-08-05…

Consequence. Running it resolves the highest-uncertainty question in this domain in one command, at the cost of a small permanent write to the production graph and audit trail. Not running it leaves the status of five production write paths unknown indefinitely, because nothing else in the exhaust can answer it — and if they ARE disconnected, every day that passes is a day of governance decisions with no audi…

9. What is healthy — 13 claims attacked that survived

Recorded because a report of only defects cannot be checked. Where a control arm exists — a probe proven able to fail — it is stated; absence of evidence is not.

10. Still unexamined after two rounds

11. Method — measurement traps this analysis fell into

Every entry cost a wrong finding at least once. Any later round inherits them.

  1. Generated inventories name every module that exists (CODEBASE_MAP*, ast-*.json, rtm.json, facts.pl). A grep hit inside one is not evidence of use.
  2. .claude/worktrees/ holds stale checkouts with their own site-packages; including them inflates any repo-wide count several-fold.
  3. Stem-matching module names conflates unrelated files (models.py matched 295 importers). Use exact dotted paths.
  4. A proof run against seeded state is not a claim about production state.
  5. A fix must be prescribed against the line that executes, not the line that looks authoritative.
  6. Success asserted against the wrong oracle: a batch that matches zero rows increments a counter by zero and is logged OK.
  7. git status cannot see gitignored writes; verify read-only mandates with find -newermt.
  8. Generated artifacts move mid-analysis — orchestrata-ast-live-sync.service rewrote all four AST snapshots at 09:16 during round 1. Hash the snapshot before and after.
  9. grep on binary files prints nothing whether the answer is 'absent' or 'could not read'. Use grep -a, or an in-process byte count.
  10. A generated artifact's documented regeneration command may not reproduce it. Read the artifact's own provenance fields (root_path, extra_roots) and check for post-merge passes first — plans/ast-ultimate.json loses 70% of its modules and every runtime_calls edge to its own documented command.
  11. Absence of evidence inside a bounded observation window is not evidence of absence. Three tools reported nothing about claude/ because all three are structurally blind to it; the correct conclusion was 'my instruments cannot see', not 'it never existed'.
  12. A resumed workflow appends re-run results beside the originals, so one agent slot appears twice with different content. Deduplicate on the assigned lens key — agent-authored lens/domain prose drifts between a run and its re-run and cannot be keyed on.