Skip to content

feat(engine): refuse work-unit-level fields that shadow the phases tree#520

Merged
leeovery merged 1 commit into
mainfrom
feat/wu-field-shadow-guard
Jul 23, 2026
Merged

feat(engine): refuse work-unit-level fields that shadow the phases tree#520
leeovery merged 1 commit into
mainfrom
feat/wu-field-shadow-guard

Conversation

@leeovery

@leeovery leeovery commented Jul 23, 2026

Copy link
Copy Markdown
Owner

Summary

  • Verified live: manifest set pay specification.foo bar succeeded and created a root specification: {foo: "bar"} object beside phases — an unvalidated shadow tree invisible to every phase-level read. The typo class ({wu} specification.x for {wu}.specification.{topic} x) landed garbage silently.
  • set (both grammars), push, and apply set-ops now refuse work-unit-level fields whose first segment is a phase name, with a pointer to the canonical dot-path. Reads and delete stay free so a stray tree can be inspected and repaired.
  • phases.*-headed fields stay permitted — they resolve into the real tree through full validation (and the contract suite pins that for fixture setup).

Test plan

  • New suite in test-engine-manifest-fields.cjs: refusal in both set grammars + push + apply (nothing persisted), repair paths free, phase/topic-level and legit root fields untouched.
  • npm test 1575 pass; test:cli, typecheck green.

🤖 Generated with Claude Code

Stack

  1. feat(engine): discovery-map add-batch — the harvest persists in one call (D7) #505
  2. feat(engine): manifest apply — batched set/delete across one work unit (D7) #506
  3. refactor(prose): task-map family folds onto existing batch forms (D7, stage 3) #507
  4. feat(engine): manifest set — two grammars, never mixed #508
  5. refactor(prose): dump/read folds — subtree gets replace per-topic loops (D7, stage 5) #509
  6. feat(engine): commit --plan — plan storage stages from recorded state (D7, stage 6) #510
  7. fix: batching-stack review round — re-resolve rewired, guards symmetric, hardening pinned #512
  8. fix: deep-dive round 2 — backbone rule flipped, pre-upgrade paths routed, flow bugs closed #513
  9. fix(review-r3): engine hardening + crash-resume seams #514
  10. feat(scoping): promotion routes through first-phase choice + bridge #515
  11. fix(spec): pin the bugfix source name to the topic #516
  12. fix(skills): gate-skip sentence accurate in gate-less phases #517
  13. fix(review-entry): name the real upstream — specification and plan #518
  14. fix(shared): strip triage-landing's unreachable superseded-research arm #519
  15. feat(engine): refuse work-unit-level fields that shadow the phases tree #520 👈 current
  16. fix(discovery): first-written briefs join the full brief lifecycle #521
  17. test(sim): pipeline simulation — engine driven end-to-end as a black box #522
  18. fix(round-4): review findings — backfill keying, ratchet evasion, pull guard #523

@leeovery
leeovery force-pushed the fix/triage-superseded-strip branch from ea49972 to 0b5fde8 Compare July 23, 2026 10:58
@leeovery
leeovery force-pushed the feat/wu-field-shadow-guard branch from 6f3c0f8 to ff08a02 Compare July 23, 2026 10:58
@leeovery
leeovery force-pushed the fix/triage-superseded-strip branch from 0b5fde8 to c91eb0a Compare July 23, 2026 11:05
@leeovery
leeovery force-pushed the feat/wu-field-shadow-guard branch from ff08a02 to 13cda6c Compare July 23, 2026 11:05
@leeovery
leeovery force-pushed the fix/triage-superseded-strip branch from c91eb0a to b9e62e6 Compare July 23, 2026 12:29
@leeovery
leeovery force-pushed the feat/wu-field-shadow-guard branch from 13cda6c to ae55a70 Compare July 23, 2026 12:29
@leeovery
leeovery force-pushed the fix/triage-superseded-strip branch from b9e62e6 to 3bb9cd7 Compare July 23, 2026 12:30
@leeovery
leeovery force-pushed the feat/wu-field-shadow-guard branch from ae55a70 to 213feca Compare July 23, 2026 12:30
@leeovery
leeovery force-pushed the fix/triage-superseded-strip branch from 3bb9cd7 to fe451bc Compare July 23, 2026 12:31
@leeovery
leeovery force-pushed the feat/wu-field-shadow-guard branch from 213feca to 7f90ec4 Compare July 23, 2026 12:31
@leeovery
leeovery force-pushed the fix/triage-superseded-strip branch from fe451bc to 820ae9c Compare July 23, 2026 12:32
@leeovery
leeovery force-pushed the feat/wu-field-shadow-guard branch from 7f90ec4 to 98df577 Compare July 23, 2026 12:32
@leeovery
leeovery force-pushed the fix/triage-superseded-strip branch from 820ae9c to 354c6f9 Compare July 23, 2026 12:33
@leeovery
leeovery force-pushed the feat/wu-field-shadow-guard branch from 98df577 to 6e3eb31 Compare July 23, 2026 12:33
@leeovery
leeovery force-pushed the fix/triage-superseded-strip branch from 354c6f9 to 42860f1 Compare July 23, 2026 12:33
@leeovery
leeovery force-pushed the feat/wu-field-shadow-guard branch from 6e3eb31 to 638c7ca Compare July 23, 2026 12:33
@leeovery
leeovery force-pushed the fix/triage-superseded-strip branch from 42860f1 to 29e19da Compare July 23, 2026 12:34
@leeovery
leeovery force-pushed the feat/wu-field-shadow-guard branch from 638c7ca to b869699 Compare July 23, 2026 12:34
@leeovery
leeovery force-pushed the fix/triage-superseded-strip branch from 29e19da to a400c27 Compare July 23, 2026 12:35
@leeovery
leeovery force-pushed the feat/wu-field-shadow-guard branch from b869699 to bcc92d9 Compare July 23, 2026 12:35
@leeovery
leeovery force-pushed the fix/triage-superseded-strip branch from a400c27 to 72a24c7 Compare July 23, 2026 12:35
@leeovery
leeovery force-pushed the feat/wu-field-shadow-guard branch from bcc92d9 to cff9f0f Compare July 23, 2026 12:35
@leeovery
leeovery force-pushed the fix/triage-superseded-strip branch from 72a24c7 to 3bde245 Compare July 23, 2026 12:36
@leeovery
leeovery force-pushed the feat/wu-field-shadow-guard branch from cff9f0f to b1c6df6 Compare July 23, 2026 12:36
@leeovery
leeovery force-pushed the fix/triage-superseded-strip branch from 3bde245 to 43a5184 Compare July 23, 2026 12:36
@leeovery
leeovery force-pushed the feat/wu-field-shadow-guard branch from b1c6df6 to af74feb Compare July 23, 2026 12:36
@leeovery
leeovery force-pushed the fix/triage-superseded-strip branch from 43a5184 to 8a8ed23 Compare July 23, 2026 12:37
@leeovery
leeovery force-pushed the feat/wu-field-shadow-guard branch from af74feb to a7e576e Compare July 23, 2026 12:37
@leeovery
leeovery force-pushed the fix/triage-superseded-strip branch from 8a8ed23 to 03237e5 Compare July 23, 2026 12:37
@leeovery
leeovery force-pushed the feat/wu-field-shadow-guard branch from a7e576e to 4243045 Compare July 23, 2026 12:37
@leeovery
leeovery changed the base branch from fix/triage-superseded-strip to main July 23, 2026 12:38
set/push/apply accepted a work-unit-level field whose first segment
names a phase — `set wu specification.foo bar` built a root
specification object beside phases that no read ever joins, silently.
The mutation surface now refuses phase-name-headed fields at work-unit
level with a pointer to the canonical dot-path; reads and delete stay
free so a stray tree can still be inspected and repaired.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@leeovery
leeovery force-pushed the feat/wu-field-shadow-guard branch from 4243045 to 651ee61 Compare July 23, 2026 12:38
@leeovery
leeovery merged commit 93998b6 into main Jul 23, 2026
@leeovery
leeovery deleted the feat/wu-field-shadow-guard branch July 23, 2026 12:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant