From 6d7450c46579ba3d1a4e74a061400e760deb8b7b Mon Sep 17 00:00:00 2001 From: Dave Date: Thu, 2 Jul 2026 18:17:24 -0400 Subject: [PATCH] feat(#1867): lift UI Considerations into plan-phase must_haves (LIFT-01) Separate *-UI-SPEC.md glob (edge-coverage glob exclusion at :746 left intact - Hyrum/D-08); a terse lift bullet reusing the ## Edge Coverage rule verbatim (covered -> truths string, backstop -> flat scalar {statement, verification: backstop}, unresolved -> assumption; no new verb - ADR-550 #1278/#1154); and a no-silent-drop checklist line. Lift logic lives ONLY in the plan-phase workflow, never gsd-planner.md (D-10, agent-size cap). NOTE: this grows plan-phase.md +862B, over the #1168 PRE_PHASE6 ceiling (94519) by ~802B, so the workflow-size gates are RED until #1852's lazy-split lands the -21KB headroom. Deliberately does NOT raise the ceiling constant (would collide with #1820/#1835's in-flight raise). #1867 sequences after #1852; rebase + regenerate the size baseline then. --- gsd-core/workflows/plan-phase.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/gsd-core/workflows/plan-phase.md b/gsd-core/workflows/plan-phase.md index 329b9eb57..28cc487dd 100644 --- a/gsd-core/workflows/plan-phase.md +++ b/gsd-core/workflows/plan-phase.md @@ -610,6 +610,10 @@ SKETCH_FINDINGS_PATH=$(ls ./.claude/skills/sketch-findings-*/SKILL.md 2>/dev/nul PHASE_DIR_FOR_SPEC=$(_gsd_field "$INIT" phase_dir) SPEC_FILE=$(ls "${PHASE_DIR_FOR_SPEC}"/*-SPEC.md 2>/dev/null | grep -Ev -- '-(AI|UI)-SPEC\.md$' | head -1) SPEC_PATH="${SPEC_FILE}" +# Resolve the phase UI-SPEC separately (the glob above excludes -UI-SPEC.md); it carries the +# ## UI Considerations section the planner lifts by the same rule as ## Edge Coverage (#1867). +UI_SPEC_FILE=$(ls "${PHASE_DIR_FOR_SPEC}"/*-UI-SPEC.md 2>/dev/null | head -1) +UI_SPEC_PATH="${UI_SPEC_FILE}" ``` ## 7.5. Verify Nyquist Artifacts @@ -808,6 +812,7 @@ Output consumed by /gsd:execute-phase. Plans need: - must_haves for goal-backward verification - If the SPEC has an `## Edge Coverage` section, lift every `covered` edge's acceptance criterion into `must_haves.truths` as a plain string, and every `backstop` edge **as a structured flat-scalar marker** — an object item `{ statement: , verification: backstop }`, NOT a prose note (the verifier branches deterministically on the `verification: backstop` field; a parenthetical is unparseable — the #1110 fragility). Use a flat scalar `verification:` continuation key, never a nested object (ADR-550 #1278). At verify time a `backstop` truth the verifier cannot confirm with explicit evidence abstains → `human_needed` (reason `insufficient_spec`), never a silent pass (#1154; see `references/honest-verifier.md`). `unresolved` edges are explicit assumptions — surface them in the plan, do not silently drop them. **Otherwise** (`EDGE_ABSENT`): apply the SAME lift to the fallback report `{COVERAGE}` (per §C of `references/specless-probe-fallback.md`); a SPEC-supplied section is never re-run. - If the SPEC has a `## Prohibitions` section, lift every resolved prohibition into the `must_haves.prohibitions:` sibling block (NOT `truths` — ADR-550 D3) with `statement`+`status`+`verification`, via the single `projectProhibitions` serializer (Hyrum — no second serializer); unresolved -> flagged assumptions, don't drop; never put a must-NOT under `truths`. **Otherwise** (`PROHIB_ABSENT`), author the recalled prohibitions into the SAME block via the SAME `projectProhibitions` contract but **descriptor-less** (no `check_*`) so each disposes flagged-unverified; never auto-dismiss. Section-level precedence + no-silent-drop equality apply (§C). +- If a `-UI-SPEC.md` exists (resolved above as `UI_SPEC_PATH`) with a `## UI Considerations` section, lift it by the **identical rule** as `## Edge Coverage` above — `covered` → `must_haves.truths` string, `backstop` → flat scalar `{ statement, verification: backstop }`, `unresolved` → explicit planner assumption (no new verb — ADR-550 #1278/#1154; #1867). Read it from `UI_SPEC_PATH` (the SPEC glob excludes `-UI-SPEC.md`). - **"Artifacts this phase produces" section (MANDATORY)** — list every symbol this phase creates: decorators, classes, functions, CLI flags, struct/dataclass fields, new file paths. The plan-review-convergence source-grounding pass reads this section to exclude newly-created symbols from drift verification; omitting it causes new symbols to be flagged for acknowledgement. @@ -854,6 +859,7 @@ Every task MUST include these fields — they are NOT optional: - [ ] must_haves derived from phase goal - [ ] Every PLAN.md includes an "Artifacts this phase produces" section listing symbols created by this phase (decorators, classes, functions, CLI flags, struct/dataclass fields, new file paths) - [ ] Every SPEC ## Edge Coverage covered/backstop edge is represented in a plan's must_haves (no silent drops) +- [ ] Every UI-SPEC ## UI Considerations covered/backstop consideration is represented in a plan's must_haves (no silent drops) - [ ] Every SPEC ## Prohibitions resolved item is represented in a plan's must_haves.prohibitions (no silent drops) ```