Orchestrata Ultimate › Sessions › Session 264
Session 264
| Field | Value |
|---|---|
| Session | 264 |
| Date | 2026-08-12 20:23 |
| Model | Claude Opus 4.6 |
| Length | 23h 43m |
| Tag | session-264-2026-08-12-2023 |
| Source | archive (context.history.md) |
‹ previous · next › · timeline
Prose pending.
Purpose
Document driver-provenance and parallel-safety (Gate 0.4) contracts as specification
Objectives
- Amend SPEC-001 addendum with driver-provenance contract
- Create Gate 0.4 redis-key-namespacing spec addendum
Work log
- Documented driver-provenance contract (SPEC-001 addendum, REQ-006-034..037)
- PipelineEvent.driver: default empty is legal/unattributed, never an error
- resolve-not-mutate: payload['driver'] = payload['driver'] or self._driver on the OUTPUT dict only, event.driver never mutated
- exactly two production producers (PipelineEventBus.emit, PipelineKernelClient._emit_event) enforced by an AST structural guard over every to_payload() call site under src/
- cli_watch.py render_event_line omits driver/volk when empty rather than rendering a placeholder
- grounded every citation via serialize_codebase_ast.py source/refs + a live 91/91 pytest run across the 4 referencing test modules; caught and corrected a residue-mode line-arithmetic error against my own first draft
- Created SPEC-097 addendum for Gate 0.4 parallel-safety (REQ-097-101..105)
- Why the gate exists: tests/conftest.py redis_client fixture has no db=, lands on REDIS_DB=0 (env/test.env), the same DB the live test-fleet kernel/gateway use; teardown only deletes test_id:* keys
- What Gate 0.4 flags: AST Call whose verb is in REDIS_WRITE_VERBS (67 verbs) and whose receiver resolves Redis-tainted and whose key is not test_id-derived, per gate_04_redis_keys
- The two dispositions: (A) rewrite the key test_id-derived, (B) a reasoned # gate-ok: waiver read via core.gate_waivers (bare marker waives nothing)
- Per-call-site requirement: WAIVER_REACH=1 covers only the marker's own line + one below, never a function/class/file — the exact shape of the defect the old presence-check rule had (test_id anywhere in the enclosing function)
- Verified rc=0/PASS via scripts/gates.py --only parallel-safety --all, and 76/76 on the gate's own test suite this session
- Fixed the concurrent-write defect that shredded plans/ast-ultimate.json and took the review battery down at gate 1
- Battery run 1 died at ast-refresh: the serializer WROTE the 73MB snapshot then could not json.loads the file it had just written — 'Extra data' at char 73,507,696.
- Measured shape: 75,563,054 chars total; valid JSON document ends at 73,507,683; followed by 2,055,371 bytes of a LONGER previous run's tail.
- Cause: _cmd_serialize used open(output,'w') + streaming json.dump. 'w' truncates at OPEN, then the doc streams across many writes holding an independent offset, so two concurrent serializers (the battery fans out; the AST daemon re-serializes) interleave — shorter doc at 0..N, longer doc's tail surviving past it.
- RED-FIRST: a 3MB two-process control reproduced 0/12 and proved NOTHING — too small, the write completes inside the stdio buffer. I had asserted the mechanism before that control ran. Rebuilt at real scale (100MB docs, barrier-released): RED 2/5 rounds produced 'Extra data' with the identical prefix+tail signature; GREEN (atomic temp + os.replace) 0/8.
- The identical fix already existed IN THE SAME FILE for the pickle sidecar, with a comment describing this exact incident — applied to the cache, not to the JSON artifact every consumer reads.
- Converted all 4 json.dump sites (_cmd_serialize, _cmd_compare, _cmd_deep_compare, _cmd_trace_audit) to one sink. AST invariant now holds: 1 json.dump in the file, 0 outside it.
- A swarm agent independently found the same defect 7 min later and wrote a shared src/orchestrata_ultimate/core/atomic_json.py (mkstemp in dest dir, mode preserved, fsync before replace, BaseException cleanup) with 8 passing tests — strictly better than my PID-unique-temp version, which could collide across threads in one process. Deleted mine, delegated to theirs, staged both.
- Closed both real suite failures: the RTM golden-number pin and an untested gate check that silently broke 7 worktree fixtures
- Full observed suite (kernel STARTED and gRPC-verified, so authoritative): 32,821 passed / 8 failed / 0 errors / 0 skipped, 1616/1618 modules, 858s. Solo-retry: 4 batch failures -> 2 recovered as load/order flakes, 2 genuinely failed.
- FAILURE 1 tests/scripts/test_derive_rtm.py: assert 786 == 777. The test carries an explicit protocol in its own comments — identify the cause, re-validate the structural invariants, and READ the numbers from derive_rtm's output, never compute them — with a recorded incident where someone computed a pin and left it 2 low for days. My first reading blamed the two new atomic_json modules because +9 matched a runtime_calls delta; that was a DERIVATION and it was REFUTED by measurement: neither module carries @traces, so both attribute zero. Real cause, measured: src/orchestrata_ultimate/kernel/cli_watch.py had ZERO @traces at HEAD and now carries @traces(spec='000', story='US-006', reqs=['REQ-000-097']), pulling its module closure into spec 000 — exactly 9 symbols. Pins now 786/580; invariants re-validated unchanged (48 specs with anchors, spec_006 36, three named anchors present, no scanner leakage). Verified: 12 passed.
- FAILURE 2 tests/scripts/test_check_worktree_envs.py, 7 failures: scripts/check_worktree_envs.py gained a NEW check_env_missing (HEAD had 0 mentions of .env, worktree has 3) as part of the SOPS migration, enforcing RUL-021's full-env requirement. The gate is CORRECT; the 7 tests asserted the pre-change contract by building worktrees with only .venv. Fixed the fixture (_add_worktree now provisions .env, with the reason recorded) rather than weakening the gate.
- SECOND DEFECT found underneath FAILURE 2: check_env_missing shipped with NO test of its own — every env-named test in that module is about .venv. That is why a new check silently broke 7 unrelated fixtures instead of being caught by its own coverage. Added 3 tests (violation when missing, None when present, None when no branch). They FAILED red first on my own errors — I invented WorktreeInfo(path,branch,head) when it requires 4 fields including detached, and asserted Violation.kind/.detail when the fields are check/message — corrected against the real dataclasses. Module now 37 passed, rc=0.
- Clean full-suite verification at HEAD 5eb80769: 32857 passed / 0 failed — the first suite result that actually describes the delivered branch
- Ran ast-sync -> gate battery -> full observed suite sequentially on a quiet machine (load 1.52, one claude process, tree clean). ASTSYNC_RC=0, GATES_RC=0, SUITE_RC=0. 32,857 passed / 0 failed / 0 errors / 0 skipped, 1619/1619 modules, 472s. Kernel started and gRPC-verified, so authoritative. git-sentinel mutations 0, GIL assertions 0.
- This was needed because my PREVIOUS suite run was invalid and I caused it: I ran the full suite concurrently with a 7-agent opus review workflow in the same live repo at load 21 on 6 cores. Four failures carried 'LIVE-REPO MUTATION DETECTED (git-sentinel)' and one was 'assert not sys._is_gil_enabled()' -> assert not True. Those were collision artifacts, not regressions. Clean run is 406s faster (878s -> 472s), which measures the contention cost.
- The swarm's own verify phase independently reached the same conclusion as majors #4 and #6: reports/run-tests-latest.json recorded head_commit 5a34c8ce while 5eb80769 afterwards changed core/env_bootstrap.py and core/infra_config.py, so the 32853-passed figure quoted in the promotion report did not certify the delivered branch.
- MASKED FLAKE to track: tests/agents/test_runtime_real.py failed in batch and recovered on solo retry. Same class as the existing masked-flake backlog items (conversation consumer flush, test_lsp_transport, test_session_facts).
- A green suite does NOT clear either blocker. Blocker 1 is deployment wiring — the suite starts its own services, so it cannot observe that the DEPLOYED gateway fell back to the in-process client. Blocker 2's regression tests were deleted, so no test exists to fail.
- Blocker 1 fixed: gateway↔kernel wiring made ordered, observable, live-checked and detectable
- Verified the blocker independently before changing anything: 58 fallback events vs 3 successful connects on the deployed fleet, current boot in fallback, both units active. Found it is THREE defects, not one — (a) boot race: kernel unit is Type=simple so After= orders SPAWN not READINESS, gateway probes 385ms early; (b) _init_kernel has one call site and one attempt, so the fallback is permanent; (c) on fallback self._kernel_client is set to the PIPELINE client, so '_kernel_client is not None' is true in BOTH states and nothing in the process could tell them apart. handle_info also advertised 'cxp' in capabilities unconditionally. A detector was impossible to write, not merely absent.
- Dispatched 3 builders against a contract I pinned first (kernel block in gateway.info). ALL THREE came back sound=false from their opus verifiers — 11 defects, every one reproduced by command. Two were blocking: a helper named _fake_gateway_with_info tripped audit_test_purity's 'fake' prefix rule and turned the RUL-008 purity gate red repo-wide (9 violations, rc=1 -> rc=0 after rename); and GatewayConfig is a frozen dataclass so two new retry fields broke the generated ordered-param interface test, which the builder never ran (incomplete-scope green).
- THE DEFECT THAT WOULD HAVE RECREATED THE BLOCKER: _kernel_mode was latched at boot and never refreshed, so gateway.info would answer wired:true forever after a kernel death and the detector passed on that stale value. Extended the contract rather than pretend it covered this: kernel block now carries live (probed at request time, bounded 2s) and wired = mode=='grpc' AND live. Detector fails with 'wired at boot but does NOT answer now'; a build omitting 'wired' is UNKNOWN, not OK.
- Also closed: tautological 'assert rc == 0 or rc != 0'; a non-discriminating assertion using the REAL configured endpoint 10.93.53.13:50053 as its sentinel (now sentinel-kernel-host:59999); untested unit wiring (verifier proved deleting ExecStartPre AND TimeoutStartSec left the module 8/8 green — the same hole that cost this repo a boot failure on 2026-08-11) — added 5 guards asserting the probe is wired, fatal (no '-' prefix), and present on disk; the untested exit-0 path (fatal ExecStartPre, so a defect there stops the gateway starting) — added a real DirectCXPServer success test with a paired negative control; and stop() calling disconnect() on a PipelineKernelClient that only has close(), AttributeError swallowed by a blanket handler whose message named nothing.
- MY OWN ERRORS, all caught by targeted runs: prepended 'import pathlib' above 'from future'; invented a fixture parameter that does not exist; used '--timeout' when the probe takes a positional; put StartLimitIntervalSec/StartLimitBurst in [Service] where systemd ignores them (moved to [Unit], systemd-analyze verify silent); and introduced a REAL regression — gating the first attempt on room for a worst-case 3x attempt_timeout made a short deadline run ZERO attempts and report 'not ready' without ever looking. Retry budget now uses MEASURED attempt cost: closed port polls the full budget (1.93s of 2.0s), a wedged endpoint's own 3s measurement stops the loop. Default timeout 55->45 so 45 + 3x3 = 54 <= the 60s outer wrapper; the documented '5s margin' was arithmetically negative before.
- Targeted verification: 5 modules, 170 tests, rc=0. Full battery + full suite running now; deployment and live link proof still to come.
- Blocker 2 closed: non-Python evidence restored AND made non-silent
- Restored .js/.jsx/.mjs/.ts/.tsx/.html/.css evidence lost in 29bbf088, via _non_python_scan.py + serialize_js_ts_ast.py
- Parity vs master on master's own fixture: 10 facts vs 8 — strict superset (AST also finds methods render/connect the regex missed)
- All 3 swarm packets FAILED adversarial verification first: js_ts_diagnostic was write-only (attr-refs: 0 production readers in src/ and scripts/)
- Two proof tests stayed green with node deliberately broken — fixture basenames spelled the identifiers, so only the basename tier was load-bearing; renamed both fixtures to panel.tsx
- Fixed 3 defective tests: one asserted stdout=='' + rc==0 as correct, one named '_with_facts_exits_zero' never asserted a fact, one used a brittle 'Found' not in stdout substring that false-fails on class FoundationModel
- Two live Prolog defects found and fixed while proving the blocker-2 consumer
- JOIN KEY: match_requirements_to_evidence emitted implemented(Spec, Description) but spec_completeness.pl unifies implemented(Spec, ReqId) — they can never unify, so implementation_coverage/3 returned implemented_count=0 for EVERY spec in EVERY language regardless of evidence. Measured: exact-matching fact -> {'implemented_count': 0, 'spec_complete': False}. Fixed on the producer side (contract forbids touching the .pl).
- ACCUMULATION: _run_prolog_evaluation asserted dynamic facts without retracting, so re-evaluating one 1-requirement spec in one process reported total_count=2 — the denominator grew with how many times the process had been asked. Fixed with a scoped retractall.
- The guarding test asserted only isinstance(result, dict), so it stayed green through both. Replaced with 3 real regression tests.
- RUL-030 mechanized: generated artifacts belong in git
- scripts/check_generated_artifacts.py + 14 tests against a real temp git repo (no monkeypatch; repo_root/artifacts injection seams)
- Wired as the 'generated-artifacts' gate in scripts/gates.py, fingerprinted on .gitignore + its own registry rather than _SRC — index state is not a content tree, so caching on _SRC would let one .gitignore line drop an artifact silently
- Live violation found and fixed: docs/CODEBASE_MAP_FULL.md was gitignored (.gitignore:223, 'too big to track/import') — the exclusion conflated tracking it with @importing it; 1.6 MB, now tracked
- Ruling published as wiki page 573; rulings_lint now checks 30 rulings, all mechanisms verified
- Unified the RTM-evidence artifact on reports/ (commit 735eec58)
- ca71ec06 moved the .md to reports/ but left generate_rtm_evidence.py argparse defaults and project_status.get_rtm_summary on docs/. For 10 days the session rtm: line summarised a stale docs/ copy (5284 rows, CITED=216) while the fresh matrix sat unread in reports/. Named DEFAULT_JSON_OUT/DEFAULT_MD_OUT, repointed the consumer, deleted+untracked the docs/ duplicate, pinned producer+consumer+RUL-030 gate together in tests/scripts/test_rtm_evidence_paths.py. Regenerated: 5497 reqs / 5558 rows, CITED 282 DECLARED 2957 GHOST 61 UNLINKED 2258.
- CORRECTION to the RTM-denominator work item: no checklist GENERATOR exists
- I filed the 16-missing-checklists item saying the fix was 'generate via scripts/parse_spec_requirements.py'. That is wrong — parse_spec_requirements.py PARSES an existing checklist into Prolog facts (openspec/requirements_parser.parse_requirements raises FileNotFoundError when the checklist is absent). Checklists are hand-authored; SPEC-110's header states it 'uses the authoritative REQ-id numbering from spec.md (RUL-013)'. So closing the 16 gaps means AUTHORING each checklist from its spec.md requirement headings, or extending load_requirements() to read spec.md directly. The RUL-030 registration half of that item still stands.
- Fixed all 21 production dangling @traces at the root: the RTM loader read a narrower corpus than the repo's ratified one
- Root cause was NOT 21 bad decorators and NOT missing checklists. serialize_codebase_ast._requirement_source_files already ratified the 3-shape corpus (checklist + spec.md + *-addendum.md) after finding a checklist-only scan made 43 @traces look dangling; generate_rtm_evidence.load_requirements never received that fix. Two readers of one corpus, nobody asserting they agree: trace-lint called the 21 citations clean while the RTM graded them GHOST, and 68 requirement ids across 6 files (033 spec.md 10, 034 spec.md 22, 110 spec.md 22, 001-kernel addendum 7, 097 addendum 5, 024 spec.md 2) were absent from the denominator so every coverage percentage was computed against the wrong total. Fix: load_requirements now delegates to requirement_source_files() which loads the toolkit's canonical scanner by path (ast_report._load_tool pattern), plus a spec_name derivation fix (parent.parent unconditionally would have mislabelled all 68 ids as spec 'specs'). Measured: universe 5497->5565 (+68, 0 lost), GHOST 61->39, production dangling 21->0. Verified by a 3-family/21-id adversarial workflow whose verifiers independently REFUTED the DEFINE-the-checklist dispositions in favour of TOOLING.
- Fixed the staged-secrets gate that forced --no-verify on every spec edit (9454e2dc)
- run_check scanned the whole staged blob rather than the added lines, so touching any file re-flagged its pre-existing content. Blocked b2dc82cd with 12 findings, all verified in HEAD and absent from the diff, none a credential. Added staged_added_lines() parsing git diff --cached -U0 hunk headers; None (new file / no HEAD) means scan everything. Proven both directions: old line no longer blocks, newly-added secret still does, new file scanned in full, first commit scanned in full. 25 tests pass (4 new), pyright clean, and the commit went through the gate it fixes without --no-verify.
- ship-final failure triage: all 3 failing modules fixed
- durations header broke raw-line readers in test_live_observer — added _duration_rows() mirroring the real consumer skip-rule (5 tests)
- gen_level0 baked the SPEC-023 goal from context.json into committed drift-gated LEVEL0.md — goal removed from generator, injected live via project_context.sh get-goal; structural test pins CONTEXT_JSON/_goal gone
- test_run_context heavy-deny asserted the fixture pid; under ship the tree collapses into the real run — now asserts any authoritative pid
- runtime_input split in the RUL-030 registry
- uv.lock AND cxp_pb2.py were certified inert by affected_tests — dependency bump or codec regen would have smoke-floored green
- Artifact.runtime_input=True on uv.lock, cxp_pb2.py/.pyi, intent_lexicon.gen.pl, generated-tests glob; selector filters; pinned against the REAL registry
- plugin-drift gate wired into gates.py battery
- gen_plugin.py --check is now a blocking gate (roots claude/ plugins/ .claude-plugin/ pyproject.toml)
- _interesting widened to .json/.md/.sh so the fingerprint sees the plugin tree
- gen_plugin built: 24 tests, 31 hook commands, 124 components mirrored
- installer hardening from the migration audit
- restored pre-overwrite backup (dropped in 836f56b7 with the duplicate-installer deletion; verification is post-hoc so a failed deploy destroyed the previous tree) — .backup-<ts>, 3 retained
- statusline-command.sh added to installer copies (was in no SUBTREE and no cp; live copy dated Jul 4 from the deleted claude-env bundle — fresh machine lost the statusline silently)
- byte-exact drift verify extended to the top-level cp'd files (statusline, settings.hooks.json, .envrc, patch_settings, register_hooks) — 129 files verified vs 124
- claude/README.md inactive-hooks table replaced with derived queries; it named 8 files that do not exist
- swarm builders complete; composed selection previewed at 13 modules
- B: extractor basename-literal rule, edges 124->670, claude/ directory fallback, 77 tests
- C: manifest 4->12 rules (prolog phantom fixed, specs/hooks-sh/installer/orchestrata-test/settings/gitlab-ci bound), phantom-guard over whole manifest, 10 tests, negatives preserved
- D: env/*.env + tests/**/conftest.py always-escalate with reasons, submodule import map (72 modules), .md stem restriction, 79 tests
- composed preview: 24-file pending diff -> escalate False, 13 modules (was 1635); adversarial verifier attacking 8 vectors now
- Adversarial verifier refuted 2 of 8 claims on the selection fixes
- 4 confirmed defects: exclusive if/elif let one partial edge drop tests/deploy/test_ship.py
- basename collisions (utils.py, init.py in 75 modules) suppressed the tests/claude fallback for 10/96 claude files
- plans/affected-tests-manifest.json falsely registry-certified generated-inert via inverted Artifact entry, guard module unreachable
- referrer-derived phantom expansions bypassed the phantom filter, wrongly escalating 2 files
- Re-verifier REFUTED round 1 on 3 findings; builder resumed for round 2
- All 5 fixes reproduce at runtime (6/6 probes verbatim, edge map identical to fresh extractor run, composed acceptance 16 modules escalate=False)
- F1: all three fix-4 tests pass under simulated revert (defect manifests only via CLI _drop_absent_tests; tests stop at compute_affected) + 2 vacuous assertions
- F2: existence filter marks phantom-only-referrer files resolved with zero contributed tests (latent, probed with synthetic edge)
- F3: pre-existing silent fall-through - 7 src modules + 62 init inside closure resolve to zero import hits with escalate=False reasons=[]; now escalating loudly per charter
- Builder round 2 closed all 3 re-verify findings; 136 tests green; verify pass 3 dispatched
- F1: Defect-4 tests re-homed to the CLI layer (_drop_absent_tests + a main()/argparse test); revert-detection argument supplied and named
- F2: referrer_contributed gating - referrer counts only if test module, src-routed, or filtered expansion non-empty; phantom-only referrer now escalates with honest reason; .gitignore pinned unchanged
- F3: zero-import-hit src modules escalate loudly (uniform incl init); the old test encoding the bug flipped+renamed; real-repo pin on signal_extraction.py
- Composed acceptance still escalate=False 16 modules, proven genuine (0 of 27 pending files are uncovered src)
- Plugin cutover complete: orchestrata plugin is the live hook delivery path, enforced current on every deploy
- installed+enabled orchestrata@orchestrata at user scope from the repo marketplace
- register_hooks.py --plugin auto + --cutover-to-plugin: 31 direct registrations removed, 1 machine extra kept, 5 subprocess tests
- fresh-session verification: plugin-only hooks fired (BOOT HEALTH, PLATFORM CONVENTIONS, TEST RUN CONTEXT x2, PROJECT CONTEXT)
- installer enforces installed plugin gitCommitSha == deployed commit, reinstalling when version-blind claude plugin update no-ops; exercised both refusal and heal live
- Ship day closure: 16 commits landed via 3 promotes; bot unit convention violation found by verification battery and fixed
- install-tools verify greped the WORD workspace not paths - gate now matches the mechanism
- user ruling: uncovered deploy scripts self-verified by the pipeline are NOT a reason to escalate
- graphs stage ran 15 min silent - _run_streaming pumps bootstrap substeps through the progress callback
- post-deploy battery found orchestrata-bot on SYSTEM python via unversioned ~/.local/bin script - repo-homed, unit runs prod venv; 5/5 units live
Artifacts
- specs/001-kernel/pipeline-event-type-addendum.md (100 lines)
- specs/097-testing-standards/redis-key-namespacing-addendum.md (202 lines)
- knowledge-wiki/projects/orchestrata-ultimate/starting-context.md (300 lines) - Wiki page 572 'Starting context' — the project-context artifact published to Wiki.js, re-measured before publication (rulings 25->29, factory-is-largest -> core 83 > agents 76 > factory 74, 'four measured instances' -> three confirmed + one uncorroborated, linked from index + TOC, both of which had a stale '26 packages' corrected to 29)
- tests/scripts/test_rtm_evidence_paths.py (160 lines)
- scripts/check_requirement_corpus.py (200 lines)
Decisions
- Surface scan degradation via exit code + stderr + consumer keys, never an internal field: The first fix computed js_ts_diagnostic correctly and left it with ZERO production readers, so the operator-visible silent zero survived behind a green test. A diagnostic nobody reads is not a fix. Now: CLI exits 2 (EXIT_DEGRADED) with a DEGRADED stderr line and an always-printed scan summary; MatchReport/ScanOutcome carry .diagnostics + .degraded; evaluate_spec_completeness returns scan_degraded/scan_diagnostics — because a degraded scan's gaps describe a missing SOURCE, not missing work. Tests assert only the surfaced signal.
- RUL-030 boundary: an artifact is derived + read + a function of the commit — all three: The user ruled 'generated artifacts belong in git'. Taken literally that includes reports/test-durations.ndjson (282 MB append-only telemetry) and *.warmcache (machine-specific pickle), which would bloat the repo without describing it. Property 3 (regenerating at the same commit on another machine yields the same content) is the mechanical test that separates artifact from cache/telemetry/lock. Exclusions live in NOT_ARTIFACTS with reasons so the boundary is visible where it is enforced, not implicit in a .gitignore line. Gate exits 2 (INVALID) on an empty or unresolvable registry so a pass can never mean 'nothing examined'.
- reports/ is the canonical RTM-evidence location, not docs/: reports/ holds generated run output (run-tests-latest.json, derived-rtm.md, code-intel-slo.json); the RUL-030 gate already registered it; ca71ec06 deliberately moved the .md there. docs/ is @import-able documentation and a 2.3MB machine-written matrix is not.
- The RTM loader delegates to the AST toolkit's ratified requirement corpus rather than re-implementing it: Re-implementing the 3-shape scan would recreate the exact divergence that caused this: two readers of one corpus that can disagree. One definition, loaded by the repo's existing _load_tool pattern. The gate then asserts agreement against @traces harvested from the AST, which is computed independently of both and can genuinely disagree — comparing load_requirements against its own source function is a tautology that always passes.
- Union resolution replaces exclusive if/elif in affected_tests.py; referrer edges count only when they contribute coverage: Two defects shared one root (a partial signal consuming the whole resolution); union of edges+stem+manifest+claude-fallback dissolves the class. Round 2: heuristic referrer sources additionally require non-empty contribution (test-module referrer, or filtered expansion with >=1 existing test) so the phantom filter cannot convert loud escalation into silent under-selection; explicit manifest declarations (e.g. .gitignore->floor) remain resolution sources as-is.
Achievements
- Blocker 1 closed and PROVEN on the deployed test fleet. Boot before: kernel Started 02:46:15.260 / gateway 'unreachable -> falling back to in-process' 02:46:16.880 / kernel actually listening 02:46:17.266 (385ms too late), never retried — 58 fallbacks vs 3 connects container-wide. After the ExecStartPre readiness gate: kernel Started 04:40:30.052, LISTENING 04:40:30.941, gateway Started 04:40:31.350, 'CXP gRPC kernel connected (attempt 1/3)' 04:40:31.977 — no fallback line at all. BEHAVIOURAL PROOF (same measurement that condemned the old deploy, where counters sat at 4 = its own probes): kernel packet counters 0/0 -> 1/1 after driving orchestrator.intent through the DEPLOYED gateway. gateway.info answers {mode: grpc, endpoint: 10.93.53.13:50053, live: true, wired: true}, 'live' probed per request (bounded 2s) so a kernel dying after boot cannot keep reporting wired. The reporter that printed ALL SERVICES READY while kernel-less now carries a Link line: it FAILED with 'no kernel block — wiring is UNKNOWN, not verified OK' against the stale deployment and aborted the suite, then passed with 'wired to kernel via grpc at 10.93.53.13:50053 (live)' after redeploy. systemd confirms: StartLimitIntervalUSec=10min, StartLimitBurst=5, TimeoutStartUSec=1min30s, ExecStartPre present.
- Selection-fix series shipped to prod and verified: escalations 1635->16 modules, under-selections closed, 3 adversarial verification rounds, full suite 1636 green, 5/5 units bound to the deployed tree
Upcoming
- #38 bound zero-hit init.py to package subtree tests; #39 linking-step inner progress; #36 fold services+terraform into the plugin
Handoff
- Key decisions: Union resolution + contribution-gated referrers in affected_tests.py; plugin is THE hook delivery path; deploy refuses success unless installed plugin sha == deployed commit
- Blockers: None
- In-progress: #38 bound zero-hit init.py to package subtree tests, #39 ingest linking-step inner progress, #36 residue: services+terraform into the plugin, workflow docs decision
- Important files: scripts/affected_tests.py, claude/scripts/register_hooks.py, deploy/install-claude-config.sh, src/orchestrata_ultimate/promotion/stages.py
- Commands: None
- Warnings: Prod at a22455f3, 5/5 units exe+cwd verified; settings.json holds ONLY unshipped_guard, everything else via orchestrata@orchestrata plugin (sha-synced per deploy), never run session CLI from the prod checkout - cwd persistence dirtied the deploy target and blocked a tree advance, vestigial ~/.local/bin/orchestrata-bot.py awaits user deletion