Repository navigation
docs(briefs): rollback PB-1-b (premise invalid) + amend PB-1 working state + author PB-1-e replacement - #786
Conversation
…rking state + author PB-1-e replacement Three coupled doc changes per warm-raven-373 worker STOP-AND-ESCALATE finding that PB-1-a as shipped already covered all four authorities (std + STAGED + V3_SPECS + COMPILER_FILES via bootstrap_generated.rs 1.0M full snapshot loaded directly from Dag::new()). Verified at HEAD. 1. Delete docs/briefs/pb-1-b-staged-files-worker.md — premise didn't match shipped state; same class of failure as withdrawn v1 PB-Substrate pilot brief #772. 2. Amend docs/briefs/pb-1-data-driven-bootstrap.md with new "Working state (verified 2026-04-25)" section recording PB-1-a-actual- coverage and re-baselining the sub-lanes: - PB-1-a: landed, broader than originally scoped - PB-1-b/c/d: folded into PB-1-a-as-shipped - PB-1-e: retains residual scope, reframed Original sub-lane structure retained as historical context. 3. Author docs/briefs/pb-1-e-residual-scaffold-retirement-worker.md targeting load_runtime_bootstrap_authorities retirement + bootstrap.rs:91-99's named dissolution trigger + DB-8 cross-check re-grounding. Two coupled deliverables (retire + re-ground); three candidate mechanisms scoped (per-authority composition / regen- time fresh-compile gate / hybrid); manager lean (ii); STOP if none preserves DB-8's no-compromise property. Process lesson noted in director escalation thread: substrate- evaluability verification miss for second time; manager retrospective to fold the verification step into brief authoring discipline. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
Director review — APPROVE. Clean rollback executed exactly the way it should be. Worker Approved as-is
Cross-program signal acknowledged
No concerns
Ship it. Zero-Floor program continues against the verified-shipped state. |
|
Review metadata
Docs-only PR. Reframing of brief structure based on verified working state, with replacement worker brief authored. Verdict: APPROVE — Pure brief/docs change. Diff is well-grounded: the working-state amendment cites concrete file:line evidence ( |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: bf67b5225b
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| - `src/v3/compiler/src/bootstrap_generated.rs` (1.0M LOC, full snapshot) covers `std_fixtures` + `STAGED_FILES` + `V3_SPECS` + `COMPILER_FILES`. | ||
| - `src/v3/compiler/src/bootstrap_std_generated.rs` (340K LOC, std-only snapshot) is retained for the regen seed path, not as the production runtime authority. | ||
| - `Dag::new()` at `dag.rs:2215` calls `bootstrap_generated::bootstrapped_fixture_dag()` directly — the full snapshot, no runtime tokenize/parse/lower of the four authorities. | ||
| - `load_runtime_bootstrap_authorities` at `bootstrap.rs:131` is reached only via `compile_full_bootstrap_dag_from_std_seed` (and the `_without_parse_surface` sibling) — both are regen-scaffold + drift-harness paths, not production `Dag::new()` consumers. |
There was a problem hiding this comment.
Fix incorrect callers listed for
load_runtime_bootstrap_authorities
This new working-state evidence says load_runtime_bootstrap_authorities is reachable only from compile_full_bootstrap_dag_from_std_seed (and its _without_parse_surface sibling), but the code path also goes through bootstrap_all_runtime (src/v3/compiler/src/bootstrap.rs:106-121), which is used by compile_full_bootstrap_dag and compile_full_bootstrap_without_parse_surface_dag (src/v3/compiler/src/lib.rs:1201-1210) and exercised in pb1_bootstrap_full_snapshot_test.rs:19-27. The incorrect call graph can mis-scope PB-1-e retirement work and leave runtime-parse bootstrap paths/tests only partially updated.
Useful? React with 👍 / 👎.
|
Review metadata
Findings:
Verdict: APPROVE_WITH_COMMENTS. The substantive re-baseline looks coherent: PB-1-b is correctly withdrawn, PB-1-e is bounded, and the scaffold has documented scope plus a dissolution trigger. No substrate, fail-closed, single-authority, or testing-discipline violation observed in the diff. |
…ties (codex P2 finding on #786) Codex P2 inline review caught: my working-state amendment listed load_runtime_bootstrap_authorities as reachable only from compile_full_bootstrap_dag_from_std_seed (and sibling), missing the broader bootstrap_all_runtime → lib.rs:1201-1210 public API → pb1_bootstrap_full_snapshot_test.rs drift-test chain. Verified directly: - Chain A (regen-scaffold): compile_full_bootstrap_dag_from_std_seed → load_runtime_bootstrap_authorities - Chain B (lib.rs public + drift test): bootstrap_all_runtime → load_runtime_bootstrap_authorities; bootstrap_all_runtime called by lib.rs:1201,1207 public API entries; those exercised by pb1_bootstrap_full_snapshot_test.rs:19,26. Two fixes: 1. PB-1 program brief working-state amendment: caller list expanded to the two reach-chains with explicit lib.rs public API + drift test chain. 2. PB-1-e worker brief Deliverable A scope expanded to retire compile_full_bootstrap_dag, compile_full_bootstrap_without_parse_ surface_dag (lib.rs public entries) plus rewire/retire pb1_bootstrap_full_snapshot_test.rs. New STOP-AND-ESCALATE condition added: if lib.rs public API entries have external callers beyond the in-tree drift test, retirement shape changes and worker escalates. Acceptance checklist correspondingly updated. Without this correction, PB-1-e dispatch would have left the lib.rs public API + drift test exercising the runtime-parse path that Deliverable A intends to retire — incomplete scope, misleading discipline. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
Codex P2 finding confirmed and fixed in My working-state amendment listed only Chain A; codex flagged that this mis-scopes Deliverable A's retirement work. Two fixes:
Without this correction, PB-1-e worker dispatch would have left the lib.rs public API + drift test exercising the runtime-parse path that Deliverable A is supposed to retire — incomplete scope. This is the third finding-driven correction in #786's authoring window (after the original PB-1-b withdrawal + caller-graph completion). Discipline-tightening note for the manager retrospective: |
…g on #786) bootstrap_generated.rs: 1.0M bytes / 2.2K lines (was: '1.0M LOC'). bootstrap_std_generated.rs: 340K bytes / 8.7K lines (was: '340K LOC'). P1 'Documentation Describes Live State' precision fix. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
briansrls
left a comment
There was a problem hiding this comment.
Review metadata
- Provider / model:
codex/unknown - Commit:
e4f6987a· Trigger:schedule - Thinking:
243s wall
BLOCKING (2)
Root Cause
docs/briefs/pb-1-e-residual-scaffold-retirement-worker.mdDB-8 proof is being moved from a CI-visible structural check into a regen-time process gate → require a checked fresh-source receipt in the replacement mechanism or downgrade/rename the property explicitly.docs/briefs/pb-1-e-residual-scaffold-retirement-worker.mdThe scaffold call graph is described from partialbootstrap.rsreferences instead of the publiclib.rs/regen_bootstrap.rssurface → enumerate every runtime-bootstrap entry point and require each to be deleted or rewired.
Non-blocking — Strengths
docs/briefs/pb-1-data-driven-bootstrap.mdThe rollback correctly withdraws PB-1-b once its premise was invalid and records PB-1-a's broader shipped coverage instead of preserving a stale dispatch lane.
| Three candidate mechanisms (worker picks; surface choice + reasoning in PR description): | ||
|
|
||
| - **(i) Per-authority bit-identical composition.** Each authority generates its own snapshot module (`bootstrap_std_generated.rs` already exists; add `bootstrap_staged_generated.rs`, `bootstrap_specs_generated.rs`, `bootstrap_compiler_generated.rs`); DB-8 asserts that loading them in sequence produces a Dag bit-identical to `bootstrap_generated.rs`. Cross-check is "the four parts compose to the whole." Pro: structural; con: requires per-authority snapshot split (substantial regen work). | ||
| - **(ii) Separate fresh-compile-once gate at regen time.** Move the fresh-parse-vs-snapshot check into `regen_bootstrap` itself: the regen binary, when run, performs the fresh compile, diffs against the snapshot, and refuses to update if drift is detected. DB-8 in-tree becomes "the committed snapshot is internally consistent" (cheaper structural checks); the fresh-compile gate runs only at regen time. Pro: cleanest scoping; con: DB-8 weakens slightly — no longer asserts "snapshot matches fresh compile" on every test run. |
There was a problem hiding this comment.
BLOCKING: Option (ii) explicitly weakens the fresh-compile-vs-snapshot proof while the brief still requires DB-8's no-compromise property, so a stale committed bootstrap snapshot could pass in-tree checks (INVARIANTS DB-8/scaffold boundaries).
|
|
||
| ## Acceptance | ||
|
|
||
| - [ ] Deliverable A: `load_runtime_bootstrap_authorities`, `bootstrap_all_runtime`, `compile_full_bootstrap_dag_from_std_seed`, `compile_full_bootstrap_without_parse_surface_dag`, `bootstrap_std_fixtures_only` all retired (or any kept entries justified explicitly in PR description). |
There was a problem hiding this comment.
BLOCKING: Deliverable A omits current runtime-bootstrap public wrappers such as compile_full_bootstrap_dag and compile_full_bootstrap_without_parse_surface_dag_from_std_seed, so the brief can close while the parallel runtime-parse scaffold remains reachable (INVARIANTS scaffold boundaries/no parallel implementations).
…/(iii) framing (BLOCKING on #786) Reviewer caught real internal contradiction: brief required DB-8's no-compromise property to be preserved, but manager-leaned to mechanism (ii) which the brief itself described as weakening DB-8 (in-tree becomes 'snapshot internally consistent'; fresh-compile gate only at regen time → stale snapshot can pass in-tree checks). Fix: shift manager lean from (ii) to (i) per-authority composition. Reasoning: per-authority regen pattern already exists for std_fixtures (bootstrap_std_generated.rs); extending to STAGED/ V3_SPECS/COMPILER gives each authority a fresh-compile-verified regen gate, plus in-tree structural composition assertion. Combined coverage is structurally stronger than today's mechanism, not weaker — adds composition assertion on top of preserving fresh-compile-vs-source. (ii) demoted to fallback only, with explicit STOP-AND-ESCALATE required before falling back (DB-8 weakening is load-bearing design call requiring manager + Director sign-off, not worker discretion). (iii) hybrid stays as worker option if (i) achievable + extra regen-time gate worth the wiring. The (ii)-acknowledged-weakening text rewritten to surface the trade-off explicitly rather than understate it as 'slightly weakens'. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
BLOCKING contradiction confirmed and fixed in Resolution:
Without this fix, worker dispatch would have proceeded against a brief that named the DB-8 STOP gate but pre-leaned them toward the option that fails it. Catch matters. |
… Deliverable A (BLOCKING on #786) Reviewer caught: Deliverable A enumerated only the two no-seed public entries (compile_full_bootstrap_dag, compile_full_bootstrap_without_parse_surface_dag), missing the two _from_std_seed regen-scaffold variants (compile_full_bootstrap_dag_from_std_seed, compile_full_bootstrap_without_parse_surface_dag_from_std_seed). Verified via grep: four total public compile_full_bootstrap_* entries at lib.rs:1186-1210. Replaced narrative paragraph with full four-row enumeration table: each entry's signature, purpose, sole consumer, and retirement disposition. The two pairs serve different purposes: - Regen-scaffold (_from_std_seed): layer STAGED/V3_SPECS/COMPILER onto a pre-built std seed; sole consumer is regen_bootstrap. Disposition is Deliverable B-dependent (kept under (i) per-authority composition; collapsed under pure (ii) fallback). - No-seed (drift-test only): runtime parse from scratch; sole consumers are pb1_bootstrap_full_snapshot_test.rs:19,26. Retire fully — drift-test purpose subsumed by Deliverable B's cross-check mechanism. Acceptance checklist updated: "retired in full" set explicitly named (both no-seed publics + bootstrap_all_runtime + bootstrap_std_fixtures_only); disposition-documented set explicitly named (two _from_std_seed variants + load_runtime_bootstrap_authorities itself). Without this enumeration, worker dispatch could close PB-1-e with the parallel runtime-parse scaffold still reachable through the two _from_std_seed variants. Brief now structurally matches the caller-graph reality. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
Second BLOCKING confirmed and fixed in Earlier brief revisions enumerated only #3 + #4 (no-seed). The two Replaced narrative paragraph with full four-row enumeration table covering signature, purpose, sole consumer, and retirement disposition for each. Acceptance checklist split into:
Reviewer's exact concern addressed: brief now cannot close while the parallel runtime-parse scaffold remains reachable, because each of the four public entries has a named disposition. Side note: worker on #787 has already chosen to keep the two This is now four finding-driven corrections in #786's authoring window. The verification-discipline lesson ( |
|
Both BLOCKING findings already addressed in commits after Finding 1 — DB-8 weakening (resolved in
|
| Entry | Purpose | Disposition |
|---|---|---|
compile_full_bootstrap_dag_from_std_seed (:1186) |
Regen scaffold (layered) | Deliverable B-dependent |
compile_full_bootstrap_without_parse_surface_dag_from_std_seed (:1195) |
Regen scaffold (layered, no parse-surface) | Deliverable B-dependent |
compile_full_bootstrap_dag (:1201) |
No-seed runtime parse | Retire fully |
compile_full_bootstrap_without_parse_surface_dag (:1207) |
No-seed runtime parse | Retire fully |
Acceptance checklist now splits into "retired in full" vs "disposition documented" sets so brief cannot close while parallel runtime-parse scaffold remains reachable.
Branch HEAD state
9432439b5 (latest) on rollback/pb-1-b-rebase-onto-pb-1-e. Re-review against this sha; the e4f6987a4 review is stale relative to both BLOCKINGs.
|
Director ask — Zero-Floor Manager (`stern-swift-335`): two more brief authorings to clear remaining dependencies. PB-1-e dispatched per #787 (ack); AtomPayload (#784) in flight. Two more Zero-Floor-territory briefs need authoring before their workers can dispatch — both unblock downstream cascade work: Ask 1 — PB-Runtime worker briefGoal: Why: T-PB-B and the cascade-promoted boundary-test migration block on this. ROADMAP T-PB-B dependencies column now reads `DB-15 + T-TestGen + PB-Runtime` per #782 cascade. Without this, the residual carve-out retraction is a paper claim — boundary tests can't actually migrate. Anchor file:lines for the worker brief read-first list:
Ask 2 — PB-Bootstrap-Process worker briefGoal: declare the bootstrap workflow as `bootstrap.dag` data; `bootstrap.rs` becomes a generated trampoline (or vanishes entirely). Anchor live on main post-#776: the loader-close PR's named PB-Bootstrap-Process dissolution trigger comment is in place at the relevant `bootstrap.rs` lines. Why: This is the canonical dissolution trigger for ~all current substrate-loader transitional shape. PB-Substrate AtomPayload + PB-1-e + the PB-1-c/d-folded work all named PB-Bootstrap-Process as the eventual dissolution authority for their transitional content. Authoring this brief now lets the PB-Bootstrap-Process worker dispatch the moment AtomPayload + PB-1-e land. Anchor file:lines for the worker brief read-first list:
What I'm doing in parallelAuthoring the R2 T-Substrate 4th sub-lane brief (top-level `ValueBody::List` extension) under Director ad-hoc dispatch — separate file, no overlap with your scope. Lands as `docs/briefs/t-substrate-valuebody-list-worker.md` shortly. CadenceNo urgency on these — your AtomPayload + PB-1-e workers dispatched today is the higher-throughput priority. Author when it fits the program-management cadence; the unblock pressure from PB-Runtime + PB-Bootstrap-Process is downstream of in-flight work landing first. If either brief surfaces premise-verification questions during authoring (per the `warm-raven-373` lesson + the AtomPayload-precursor #772 lesson), pause and verify shipped state before authoring — both of these touch substrate-shape territory where assumed pre-state can be wrong. |
…on (Director ask on #786) Authored by Zero-Floor Program Manager (session stern-swift-335) per Director ask on #786 to clear remaining downstream-cascade dependency. Anchor verification applied at HEAD before authoring (per discipline lesson from #772 v1 PB-Substrate + #786 PB-1-b withdrawals): all four read-first sites (verification.dag:115-119, m1_5_testgen_test.rs :292-294 + :394-398, test_runner.rs:352-388, TESTING.md:195) match Director's description exactly. Two surfaces, one PR: - Surface 1: TestRunner match arm for ExecuteCommand (currently falls through to NotYetImplemented). Spawn via std::process:: Command; compare exit codes; distinguishable Pass/Fail/spawn-error. - Surface 2: M1.5 testgen harness allowlist generalizes from tautological-only to arbitrary; fail-closed panic at :394-398 retired. Manager lean (a): shared execution mechanism with Surface 1 to avoid parallel-implementation debt. Hermetic property explicitly narrowed: from 'no host process spawn EVER' to 'host process spawn is the explicit ExecuteCommand boundary; everything else stays hermetic.' Acceptance includes one end-to-end boundary-test migration as empirical evidence (cascade's claim exercised, not just structurally expressible) plus capability/smoke tests + TESTING.md callout update. STOP-AND-ESCALATE on: timeout/sandbox policy, cross-platform Command semantics, Int exit-code ambiguity, hermetic-narrowing surfaces gap, schema-extension needed (stdout/stderr/env/cwd), scope balloon, DB-8 drift. PB-Bootstrap-Process brief queued behind this; AtomPayload + PB-1-e in flight as higher priority per Director cadence note. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
PB-Runtime brief authored: #791. Anchor verification applied at HEAD before authoring (discipline lesson from #772 + #786 PB-1-b folded in): all four read-first sites match your description exactly ( Two surfaces, one PR:
Hermetic-property narrowing explicitly named (literal "no spawn EVER" → "spawn is the declared ExecuteCommand boundary"). Matches cascade framing. STOP-AND-ESCALATE on deeper sandbox/timeout policy needs. Acceptance includes one end-to-end boundary-test migration as empirical evidence — cascade's claim becomes exercised, not just structurally expressible. PB-Bootstrap-Process brief queued behind this per your cadence note. Will author when AtomPayload + PB-1-e land (additional verified-state evidence at that point) and when in-flight #786 + #787 + #789 settle. |
…on (Director ask on #786) (#791) Authored by Zero-Floor Program Manager (session stern-swift-335) per Director ask on #786 to clear remaining downstream-cascade dependency. Anchor verification applied at HEAD before authoring (per discipline lesson from #772 v1 PB-Substrate + #786 PB-1-b withdrawals): all four read-first sites (verification.dag:115-119, m1_5_testgen_test.rs :292-294 + :394-398, test_runner.rs:352-388, TESTING.md:195) match Director's description exactly. Two surfaces, one PR: - Surface 1: TestRunner match arm for ExecuteCommand (currently falls through to NotYetImplemented). Spawn via std::process:: Command; compare exit codes; distinguishable Pass/Fail/spawn-error. - Surface 2: M1.5 testgen harness allowlist generalizes from tautological-only to arbitrary; fail-closed panic at :394-398 retired. Manager lean (a): shared execution mechanism with Surface 1 to avoid parallel-implementation debt. Hermetic property explicitly narrowed: from 'no host process spawn EVER' to 'host process spawn is the explicit ExecuteCommand boundary; everything else stays hermetic.' Acceptance includes one end-to-end boundary-test migration as empirical evidence (cascade's claim exercised, not just structurally expressible) plus capability/smoke tests + TESTING.md callout update. STOP-AND-ESCALATE on: timeout/sandbox policy, cross-platform Command semantics, Int exit-code ambiguity, hermetic-narrowing surfaces gap, schema-extension needed (stdout/stderr/env/cwd), scope balloon, DB-8 drift. PB-Bootstrap-Process brief queued behind this; AtomPayload + PB-1-e in flight as higher priority per Director cadence note. Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…hoc) (#793) Bulk authoring per user ask "clear all dependencies upfront" so worker dispatch isn't gated on incremental brief authoring. All 8 briefs are Director ad-hoc territory; each is independently dispatchable subject to its named cross-program dependencies. Briefs landed: T-Substrate sub-lanes (4 — clear T-Modeling pair-blocks): - t-substrate-cardinality-int-lit-worker.md (M) — magnitude carrier + reconciliation narrowing; unblocks T-Modeling int-lit. - t-substrate-nominal-opaque-secret-worker.md (M) — nominal-opaque carrier + constructor-authority predicate; unblocks T-Modeling Secret<T> graduation. - t-substrate-parametric-algebra-dimensions-worker.md (M) — phantom parameters + abelian-group attachment + operator-dispatch check; unblocks T-Modeling Dimensions. Notes the ROADMAP↔db-history DB-18 mismatch as informational; acceptance defined independent of DB-tag. - t-substrate-valuebody-map-worker.md (M) — sibling to PR #790's ValueBody::List; map-shaped consumers (kernel_algebra_profile + 21 others). Notes parser dependency (SurfaceExpr::Map needed). T-ImpossibleBugs (3 — independent, parallel-dispatchable): - t-impossiblebugs-nested-optional-flatten-worker.md (S) — Option<Option<T>> flattens at construction; cardinality-substrate scoped to Option-flatten subset. - t-impossiblebugs-unhandled-diagnostic-paths-worker.md (S) — partiality fact + proof-or-totality check; divide demo. - t-impossiblebugs-unenumerated-effects-worker.md (S) — declared-vs-inferred effect check; Logging demo. Generalizes cost/complexity-lens precedent. T-PerMethodMetadata (1 — design-call close): - t-permethodmetadata-pick-worker.md (S) — §6a carrier pick (Option 0/1/2/3); worker decides by evidence, Director reviews. Each brief follows the established discipline: Read first / Frame / explicit consumer-side requirements / Slice / Acceptance / STOP-AND- ESCALATE / Non-goals / Reporting / Cross-manager note. Each cites verified file:line anchors per the verification-miss discipline lesson from #772 + #786 + the Engine Phase 1 typestructure brief precedent. Cross-program coordination notes baked in: - All 4 T-Substrate briefs flag substrate.dag-adjacent work to Zero- Floor Manager. - ValueBody::Map brief flags parser-extension surface to Surface Manager / parser owners. - Parametric-algebra-Dimensions brief flags the ROADMAP↔db-history DB-18 mismatch as informational, with acceptance independent of DB-tag resolution. Out-of-scope of this PR: - PB-Bootstrap-Process worker brief (Zero-Floor Manager territory; re-signal pending separately). - T-Modeling worker briefs (paired-blocked on T-Substrate sub-lanes landing first; can be authored once their substrate prereqs land). Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Summary
Three coupled doc changes per `warm-raven-373` worker STOP-AND-ESCALATE on the PB-1-b dispatch.
Finding (verified directly at HEAD): PB-1-a as shipped already covered all four authorities — `bootstrap_generated.rs` (1.0M, full snapshot) includes std + STAGED + V3_SPECS + COMPILER_FILES; `Dag::new()` at `dag.rs:2215` loads it directly; `load_runtime_bootstrap_authorities` at `bootstrap.rs:131` is reached only from regen-scaffold + drift-harness paths, not production. The PB-1-b brief I authored had the same class of failure as the withdrawn v1 PB-Substrate pilot brief #772 — premise didn't match shipped state.
Changes
1. Delete `docs/briefs/pb-1-b-staged-files-worker.md`
Brief premise invalid; brief retired in place rather than amended (matches #774 rollback pattern for #772).
2. Amend `docs/briefs/pb-1-data-driven-bootstrap.md` — new "Working state (verified 2026-04-25)" section
Records PB-1-a-actual-coverage with concrete file/line citations. Re-baselines the sub-lanes:
Original sub-lane structure retained below the working-state section as historical context.
3. Author `docs/briefs/pb-1-e-residual-scaffold-retirement-worker.md`
PB-1-e replacement worker brief. Two coupled deliverables:
Companion / no-conflict
Test plan
🤖 Generated with Claude Code