poodr-implementation map: code-probe fails greenfield tickets whose target classes do not exist yet #524

Closed
opened 2026-09-03 12:33:52 +00:00 by jared · 3 comments
Owner

Session: jared/hyperthrive-websites#19 ("Slice 0 of #17: Site::Page/Media/Term domain model and WpRest::SiteBuilder")

Issue: os-sdlc-runner implementation-open <session> 19 maps/poodr-implementation.yaml flow: change-interpreter passed (dispatch 1), code-probe passed (2), message-tracer requested re-probe (3), second code-probe (dispatch 4) returned verdict:fail — Migrator::Site lacks #pages/#media/#terms, WpRest::SiteBuilder doesn't exist (CLI classified PHANTOM), no migrator/lib/migrator/site/ dir exists.

Problem: For greenfield tickets that CREATE new classes, absent artifacts are expected starting state, not a failed probe. The map's fail edge from code-probe conflates "claim about existing code is false" with "target doesn't exist yet."

Expected: Probe distinguishes PHANTOM-because-new from PHANTOM-because-wrong-claim (interpreted behavior names artifact as to-be-created), OR map's fail edge from re-probe routes to seam-designer/test-writer instead of implementation-failed.

Workaround used: Hand-rolled TDD outside pipeline.


Discoverer: jared/hyperthrive-websites, session 01WczDUXXTYSuFuZNRQQLf49, 2026-09-03. code-probe verdict logic conflates absent new-class artifacts with probe failures.

Decision

VERDICT: CREATE (ticket-skeptic, 2026-09-03: user-requested work, hard floor). Option A chosen by the user on 2026-09-03: the change-interpreter names artifacts the ticket will create, and the evidence CLI and code-probe treat their absence as expected. Option B (route the re-probe fail edge to seam-designer) rejected: it lets false claims about existing code flow forward and does not cover the first probe's fail edge.

Context

Evidence (plugins/os-sdlc, 2026-09-03):

  • Handoff item kinds BEHAVIOR / EXCLUSION / UNKNOWN exist only in agent prose (agents/change-interpreter.md ~29-38). No Ruby validator rejects an unknown prefix (lib/os_sdlc/runner/handoff.rb, handoff_content.rb, gate_handoff.rb have no kind check).
  • PHANTOM entries are built by phantom_entry in lib/os_sdlc/evidence/report.rb:174-179. all_phantom? (report.rb:140) sets the CLI exit code in lib/os_sdlc/evidence/cli.rb:20. The collect command accepts only --root and --explain.
  • code-probe's pass/fail rubric is prose only (agents/code-probe.md:30-33). code-probe receives the interpreted-behavior handoff (code-probe.md:11).
  • message-tracer, seam-designer, behavior-verifier, and code-probe read BEHAVIOR/UNKNOWN items by prefix in prose. None says what to do with an unknown prefix.
  • Tests: tests/evidence/report_test.rb, tests/evidence_bin_test.rb, tests/runner/handoff_content_test.rb.

Tasks

  • Evidence CLI: add a --expect-new TOKEN[,TOKEN...] option to collect (lib/os_sdlc/evidence/cli.rb). A token in that list that resolves to nothing renders as NEW: <token> — expected absent (ticket creates it) instead of PHANTOM, and does not count in all_phantom?. Tests in tests/evidence/report_test.rb and tests/evidence_bin_test.rb.
  • Evidence CLI: a token in --expect-new that DOES resolve renders as CLAIMED-NEW-BUT-EXISTS: <token> — <where> so a wrong CREATES claim cannot skip a real probe. Test alongside the above.
  • change-interpreter prompt (agents/change-interpreter.md): add item kind CREATES: <token> for each class, module, or method the ticket introduces; emit it only when the ticket text names the artifact as new. Update the handoff schema block.
  • code-probe prompt (agents/code-probe.md): collect CREATES tokens from the handoff and pass them as --expect-new; NEW lines are evidence of expected absence and never justify verdict fail; PHANTOM and CLAIMED-NEW-BUT-EXISTS lines keep their current fail weight; carry CREATES items forward in the handoff.
  • message-tracer and seam-designer prompts: one line each stating CREATES items pass through unchanged and name artifacts that do not exist yet.
  • Run /os-adr:find on the touched paths before the first edit; record the handoff-vocabulary and CLI-flag decision with /os-adr:create if no ADR covers it.
  • Riders: bin/refresh-plugins; one History row in the os-sdlc implementation-status leaf.

Acceptance criteria

  • os-sdlc-evidence collect --expect-new WpRest::SiteBuilder on a tree without that constant prints a NEW line, not PHANTOM, and exits 0 when every unresolved token is expected-new.
  • The same command on a tree that defines the constant prints CLAIMED-NEW-BUT-EXISTS for it.
  • A handoff with CREATES items for absent artifacts, and no other false claims, lets code-probe return verdict pass under its rubric text.
  • Full os-sdlc test suite green.

Out of scope

  • Map edge changes in maps/poodr-implementation.yaml.
  • A Ruby validator for handoff item kinds.
  • Retroactive re-run of hyperthrive-websites#19.
**Session:** jared/hyperthrive-websites#19 ("Slice 0 of #17: Site::Page/Media/Term domain model and WpRest::SiteBuilder") **Issue:** `os-sdlc-runner implementation-open <session> 19 maps/poodr-implementation.yaml` flow: change-interpreter passed (dispatch 1), code-probe passed (2), message-tracer requested re-probe (3), second code-probe (dispatch 4) returned verdict:fail — Migrator::Site lacks #pages/#media/#terms, WpRest::SiteBuilder doesn't exist (CLI classified PHANTOM), no migrator/lib/migrator/site/ dir exists. **Problem:** For greenfield tickets that CREATE new classes, absent artifacts are expected starting state, not a failed probe. The map's fail edge from code-probe conflates "claim about existing code is false" with "target doesn't exist yet." **Expected:** Probe distinguishes PHANTOM-because-new from PHANTOM-because-wrong-claim (interpreted behavior names artifact as to-be-created), OR map's fail edge from re-probe routes to seam-designer/test-writer instead of implementation-failed. **Workaround used:** Hand-rolled TDD outside pipeline. -------- **Discoverer:** jared/hyperthrive-websites, session 01WczDUXXTYSuFuZNRQQLf49, 2026-09-03. code-probe verdict logic conflates absent new-class artifacts with probe failures. ## Decision VERDICT: CREATE (ticket-skeptic, 2026-09-03: user-requested work, hard floor). Option A chosen by the user on 2026-09-03: the change-interpreter names artifacts the ticket will create, and the evidence CLI and code-probe treat their absence as expected. Option B (route the re-probe fail edge to seam-designer) rejected: it lets false claims about existing code flow forward and does not cover the first probe's fail edge. ## Context Evidence (plugins/os-sdlc, 2026-09-03): - Handoff item kinds BEHAVIOR / EXCLUSION / UNKNOWN exist only in agent prose (agents/change-interpreter.md ~29-38). No Ruby validator rejects an unknown prefix (lib/os_sdlc/runner/handoff.rb, handoff_content.rb, gate_handoff.rb have no kind check). - PHANTOM entries are built by `phantom_entry` in lib/os_sdlc/evidence/report.rb:174-179. `all_phantom?` (report.rb:140) sets the CLI exit code in lib/os_sdlc/evidence/cli.rb:20. The `collect` command accepts only `--root` and `--explain`. - code-probe's pass/fail rubric is prose only (agents/code-probe.md:30-33). code-probe receives the interpreted-behavior handoff (code-probe.md:11). - message-tracer, seam-designer, behavior-verifier, and code-probe read BEHAVIOR/UNKNOWN items by prefix in prose. None says what to do with an unknown prefix. - Tests: tests/evidence/report_test.rb, tests/evidence_bin_test.rb, tests/runner/handoff_content_test.rb. ## Tasks - [ ] Evidence CLI: add a `--expect-new TOKEN[,TOKEN...]` option to `collect` (lib/os_sdlc/evidence/cli.rb). A token in that list that resolves to nothing renders as `NEW: <token> — expected absent (ticket creates it)` instead of PHANTOM, and does not count in `all_phantom?`. Tests in tests/evidence/report_test.rb and tests/evidence_bin_test.rb. - [ ] Evidence CLI: a token in `--expect-new` that DOES resolve renders as `CLAIMED-NEW-BUT-EXISTS: <token> — <where>` so a wrong CREATES claim cannot skip a real probe. Test alongside the above. - [ ] change-interpreter prompt (agents/change-interpreter.md): add item kind `CREATES: <token>` for each class, module, or method the ticket introduces; emit it only when the ticket text names the artifact as new. Update the handoff schema block. - [ ] code-probe prompt (agents/code-probe.md): collect CREATES tokens from the handoff and pass them as `--expect-new`; NEW lines are evidence of expected absence and never justify verdict fail; PHANTOM and CLAIMED-NEW-BUT-EXISTS lines keep their current fail weight; carry CREATES items forward in the handoff. - [ ] message-tracer and seam-designer prompts: one line each stating CREATES items pass through unchanged and name artifacts that do not exist yet. - [ ] Run /os-adr:find on the touched paths before the first edit; record the handoff-vocabulary and CLI-flag decision with /os-adr:create if no ADR covers it. - [ ] Riders: `bin/refresh-plugins`; one History row in the os-sdlc implementation-status leaf. ## Acceptance criteria - [ ] `os-sdlc-evidence collect --expect-new WpRest::SiteBuilder` on a tree without that constant prints a NEW line, not PHANTOM, and exits 0 when every unresolved token is expected-new. - [ ] The same command on a tree that defines the constant prints CLAIMED-NEW-BUT-EXISTS for it. - [ ] A handoff with CREATES items for absent artifacts, and no other false claims, lets code-probe return verdict pass under its rubric text. - [ ] Full os-sdlc test suite green. ## Out of scope - Map edge changes in maps/poodr-implementation.yaml. - A Ruby validator for handoff item kinds. - Retroactive re-run of hyperthrive-websites#19.
Author
Owner

Work started via /os-sdlc:implement on branch ticket-524 (worktree .claude/worktrees/ticket-524), 2026-09-03.

Work started via /os-sdlc:implement on branch ticket-524 (worktree .claude/worktrees/ticket-524), 2026-09-03.
Author
Owner

Pipeline run (implementation 4) ended implementation_failed at node refactorer, reason verdict:error. Cause: refactorer dispatch 31 died on an Anthropic API 529 before settlement; a harness resume of the finished test-writer created stray dispatch 32 bound to the refactorer node; settling it recorded gate_skip -> error. Code state: test-writer (27) red-for-right-reason, programmer (29 fail, 30 pass), gate 31 re-run green (test+lint). Work is intact on branch ticket-524. Recovery decision pending with the user.

Pipeline run (implementation 4) ended implementation_failed at node refactorer, reason verdict:error. Cause: refactorer dispatch 31 died on an Anthropic API 529 before settlement; a harness resume of the finished test-writer created stray dispatch 32 bound to the refactorer node; settling it recorded gate_skip -> error. Code state: test-writer (27) red-for-right-reason, programmer (29 fail, 30 pass), gate 31 re-run green (test+lint). Work is intact on branch ticket-524. Recovery decision pending with the user.
Author
Owner

Resolution

Done: Option A built: evidence CLI --expect-new flag renders NEW (expected absent) instead of PHANTOM and CLAIMED-NEW-BUT-EXISTS when the token resolves; change-interpreter emits CREATES items; code-probe passes them as --expect-new and its rubric treats NEW as never-fail; message-tracer and seam-designer pass CREATES through. ADR-0159 recorded; history row added to docs/implementation-status/os-sdlc.md.

Evidence: Merged to main at 3c804b3 (commits d3ee259, 2df55e5, 81f9b64, 51b03ea, d76d7e2, 3c804b3). os-sdlc suite 1232 runs, 0 failures. rubocop: 0 offenses on touched files; 74 pre-existing offenses on main unchanged. Slice 1 came through the pipeline (implementation 4, dispatches 27-31); the refactorer node died on Anthropic API 529 twice, the run was marked implementation_failed by a stray dispatch row, and the remaining tasks were built by direct TDD agents by user decision (option A).

Follow-ups: #527 filed with skeptic CREATE verdict for the runner's no-abandon-path crash gap (user has questioned it; may close as not-local). Dropped: --expect-new cannot carry a token containing a comma; no test covers --expect-new combined with --explain.

## Resolution **Done:** Option A built: evidence CLI --expect-new flag renders NEW (expected absent) instead of PHANTOM and CLAIMED-NEW-BUT-EXISTS when the token resolves; change-interpreter emits CREATES items; code-probe passes them as --expect-new and its rubric treats NEW as never-fail; message-tracer and seam-designer pass CREATES through. ADR-0159 recorded; history row added to docs/implementation-status/os-sdlc.md. **Evidence:** Merged to main at 3c804b3 (commits d3ee259, 2df55e5, 81f9b64, 51b03ea, d76d7e2, 3c804b3). os-sdlc suite 1232 runs, 0 failures. rubocop: 0 offenses on touched files; 74 pre-existing offenses on main unchanged. Slice 1 came through the pipeline (implementation 4, dispatches 27-31); the refactorer node died on Anthropic API 529 twice, the run was marked implementation_failed by a stray dispatch row, and the remaining tasks were built by direct TDD agents by user decision (option A). **Follow-ups:** #527 filed with skeptic CREATE verdict for the runner's no-abandon-path crash gap (user has questioned it; may close as not-local). Dropped: --expect-new cannot carry a token containing a comma; no test covers --expect-new combined with --explain.
jared 2026-09-03 14:23:43 +00:00
  • closed this issue
  • removed the
    waiting
    label
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
jared/cc-os#524
No description provided.