Research — CI Suite Stability & Test-Isolation (#4017 + #4015)

Decision 1 — #4017 fix = re-assess-under-lock (core) + observe() role-tag (enabler), generic scope

  • Decision: On the cold/effects path, after acquiring the existing anchor flock (asset_preparation.py:516-522), re-assess effects against the now-warm home; the loser finds effects==[] and returns via the warm fast-path (bootstrap.py:200-201). Tag observe() entries source-read vs destination-probe and filter destinations at the compare site (check_assets). Land both at the generic check_assets/ensure_runtime seam (all owners). Do NOT strip PreparedAssets.observations.
  • Rationale: The flock already serializes; the bug is the post-lock re-check validating a stale plan + non-idempotent apply (mkdir/open("x") at :545/:617). Narrowing alone converts "Global asset input changed" → "global_asset_write_failed: File exists" (post-spec squad BLOCKER). Re-assess is the minimal correct fix; role-tagging removes the conceptual "HOME-is-an-input" error and keeps the race from re-manifesting. Generic scope because all owners race identically on the shared home (HiC-confirmed).
  • Alternatives: narrowing-only (rejected — converts the crash, doesn't fix it); per-worker-home isolation (rejected — dodge, abandons the shared-home property); geographic strip of observations (rejected — sources share the HOME prefix under test layouts → source-drift undetected; also breaks the fingerprint/cross-family invariants).

Decision 2 — #4017 operator signal (OPERATOR_SIGNAL_CONTRACT)

  • Decision: The re-assess/defer outcome emits a human sentence + machine signal on an existing operator-visible surface (CLI/log/exit); the red-first asserts on the emitted signal, not just the machine shape.
  • Rationale: A deciding path (loser converged to no-op vs winner applied) must be operator-observable, not silently swallowed (epics #3410/#3549).

Decision 3 — #4015 enabler = shared assert_timing_budget helper

  • Decision: New tests/_perf_helpers.py::assert_timing_budget(measured, budget) whose call-site text is guard-clean (contains a vocabulary token like budget), used by vocab-blocked timing tests instead of widening TIMING_ASSERTION_VOCABULARY or per-var renames.
  • Rationale: Uniform across all 9, no vocabulary widening (which risks a functional assert passing the guard), no bespoke renames. Deletion remains an evidence-gated option for low-value pure-timing gates.

Decision 4 — #4015 split + delete discipline

  • Decision: 74 mixed → split (functional assert stays per-PR unmarked; timing assert → @performance nightly, budget preserved, collected+green); 9 vocab-blocked → helper/rename/delete. DELETE is evidence-gated (flake-rate + AST zero-functional-assert + operator sign-off). Per-split coverage-mapping table makes no-coverage-loss diffable.
  • Rationale: Keeps functional coverage on the per-PR path, enforces budgets nightly, and makes deletion auditable rather than judgment-only.

Adversarial Evidence (pre-mission grounding + post-spec squads — dispositions)

Per contracts/adversarial-evidence-contract.md. No finding dropped.

Pre-mission grounding squad

#LensFindingDispositionLanded
G1debugger (#4017)Real TOCTOU race, not test-isolation; flock taken too late; ensure_runtime aborts instead of re-assessingacceptedDecision 1; spec Context + FR-001
G2researcher (#4015)74+9 lists still accurate in commit 1d59ed2ca6; chore-class; shared-helper recommendedacceptedDecision 3/4; C-005
G3researcher (flaky census)Scary flaky gates already off blocking path; residual = #4015; fold, add delete disposition; #4017 separateacceptedfolded into #4015 (comment); FR-011 delete disposition

Post-spec squad

#LensSevFindingDispositionLanded
P1architectblockerNarrow-scope alone converts crash → "File exists" (non-idempotent apply); re-assess-under-lock is mandatory, not optionalaccepted (reversed operator's narrow-only choice; re-confirmed)FR-001 core; C-001; Decision 1
P2architectmajorcheck_assets is generic (all owners race) — scope must be decidedaccepted → HiC = GENERICFR-004; plan decision 01M22NKW
P3architectmajor"asset input" not cleanly source/destination separable — role-tag, don't stripacceptedFR-002; C-002
P4architectminorre-assess gated to cold path; warm = 1 assess, no lockacceptedFR-005; NFR-002; SC-004
P5architectminor#4082 uses separate charter_yaml_io recheck (insulated) — pin with regressionacceptedFR-007; SC-005
P6architectminorplace fix once (triple-nested recheck); test the real global_assets pathacceptedFR-004; SC-006
P7renatahighFR-002(apply-safety) un-gated — no SC proves apply safeacceptedSC-002 deterministic interleave/convergence
P8renatahighSC-001 "100% of 40 iters" green-by-luck + e2e nightly-onlyacceptedSC-002 deterministic structural test (not dice-roll)
P9renatahighNo requirement that genuine SOURCE drift still caught (over-narrowing)acceptedFR-003; SC-003
P10renatamediumNo SC proves relocated budgets run nightlyacceptedNFR-004; SC-008
P11renatamediumDELETE boundary subjective — evidence-gate itacceptedFR-011; SC-010
P12renatamediumNFR-003 not verifiable — per-split mappingacceptedFR-013; NFR-003; SC-009

All accepted/changed; none deferred-without-rationale, none dropped.

Post-plan brownfield squad

All accepted; none dropped.

#LensSevFindingDispositionLanded
BP1paula—Premise correction: #4082 did NOT touch asset_preparation/bootstrap/merge — coordinates + flock diagnosis intactaccepted (confirms plan)no change; noted
BP2paulamajor_recheck_command_completion (managed_skills.py:165, #4082-modified) is a SEPARATE recheck not reached by check_assetsacceptedFR-004 verify-or-exclude; WP-A3
BP3paulamajorFR-007 must drive the LIVE managed_skills composition interplay, not just dry-run previewacceptedFR-007 rewritten
BP4paulalowNo open PR/parallel session/foldable on the seamaccepted (no action)—
SP1plannermajorA1→A2 order erases the FR-006 exact signal ("File exists" after role-tag)acceptedWP-A0 red-first-first; FR-006 rewritten
SP2plannermajorFR-004/SC-006 generic+triple-nested has no WP owneracceptedWP-A3
SP3plannermajorLane B ~23-WP fan-out disproportionateacceptedgroup by effort, collapse 1-2-file subsystems
SP4plannermajorCoverage-mapping has no owneracceptedWP-B1 owns master table; splits append
SP5plannermediumtests/_next_shard_map.py cross-lane conflict pointacceptedCoordination Points
SP6plannermediumDelete sign-off scattered across ~25 WPsacceptedfront-loaded to WP-B1 one consolidated sign-off

Post-tasks brownfield squad (WP-DoD tightenings)

All accepted/noted; none dropped.

#LensSevFindingDispositionLanded
RT1renatahighNFR-003 coverage invariant enforced nowhere (prose only)acceptedWP05 T016a: AST functional-assert baseline + tests/architectural/test_timing_coverage_invariant.py; WP06-09 DoD
RT2renatahighNFR-004 nightly-collection fakeable (local -m performance ≠ nightly shard-map)acceptedWP06-09 DoD: prove collected by nightly lane's own selection
RT3renatamedFR-007 clause (a) byte-unchanged unassignedacceptedWP03 T011b
RT4renatamedWP03 "driven green" satisfiable by skip/xfailacceptedWP03 T008: 2 passed/0 skipped/0 xfailed, no xfail/skipif
RT5renatamedred-first not bound to production path / witnessacceptedWP01 DoD: organic emission, text pinned to T002 witness
RT6renatalow-medwarm-path not instrumentedacceptedWP03 T011: spy (assess count==1, lock==0)
SP1plannerhigh~7 timing-test dirs unowned by WP06-09acceptedWP09 owned_files +agent/post_merge/core/next/release; scope-completeness note; architectural/upgrade as recorded out-of-map
SP2plannermedWP01/03/04 new tests/runtime files under shard-map root, no registration noteacceptedshard-map note added WP01/03/04
SP3plannermedtests/_next_shard_map.py multi-owner silent-merge hazardacceptedWP05 sole owner; others record filenames in Activity Log
SP4plannerlowauthoritative_surface undersells WP07-09noted (cosmetic; reporting only)—
SP5plannerlowWP05 sign-off gate reviewer-discipline-onlyacceptedpromoted to WP05 DoD (blocking)
SP6planner—dep chain/lanes.json/globs/create_intent confirmed soundaccepted (no action)—