UAT scratch (Scenario 4): coexistence /dev:requirements run — disposable #53
Labels
No labels
component:adapters
component:lifecycle
component:qa
component:setup
component:shared
component:worktrees
phase/accepted
phase/backlog
phase/deployed
phase/developing
phase/integrating
phase/planning
phase/qa
phase/requirements
phase/uat
priority:critical
priority:critical
priority:high
priority:high
priority:low
priority:low
priority:medium
priority:medium
type:bug
type:chore
type:docs
type:feature
type:infra
type:tech-debt
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
jbr870/devwork-skills#53
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
PREQ: Feature-issue digest view
Created: 2026-08-16
Problem
Anyone reading a feature issue struggles to tell what is currently true when the issue has
accumulated a long thread of records. Phase Outcomes, deliverables, decisions and resolutions are
interleaved in posting order, and later records supersede earlier ones — so the reader must replay
the whole thread and apply the lookup rule by hand to answer even basic questions.
Users:
what is it waiting on?" before doing anything else.
/dev:resolve's discovery)needing the same answer programmatically rather than by eye.
Current state: Scroll the issue thread and reconstruct the current state mentally, or call the
per-record read helpers one at a time. Both are manual, and both get slower and less reliable the
longer the feature has run.
Proposed Solution
A read-only view over a single feature issue. It resolves that issue's records once into one
canonical current state, then renders that same state two ways: a human-readable digest by
default, and the identical resolved state in machine-readable form on request.
Both renderings come from one resolution pass, so a human reading the digest and a gate reading
the machine form cannot disagree about what is current.
What the view reports — exactly three record types, and no others:
Anything the view could not parse is reported as an anomaly alongside the three (see AC9); it is
never silently dropped.
Scope: Standard — serves both consumers the problem named, without touching existing consumers.
The Minimal option (digest only) would leave the gate consumer unserved; the Full option
(refactoring existing gates onto the new resolver) was declined because it puts new code in the
pipeline's decision gates rather than in a read-only view. Consequently the machine rendering's
deliverable is availability and correctness — adopting it in an existing gate is a separate
feature (see Out of Scope).
User Stories
and decisions that are currently true, so that I can tell where it stands without replaying the
comment thread.
act on them directly instead of hunting for which ones were already answered.
machine-readable form, so that when a gate is later wired to it, its decision matches what a human
reading the digest would conclude. (This feature delivers the machine form; wiring a gate to it is
out of scope.)
Acceptance Criteria
requested, then it reports the feature's current phase as the
next_stateof the most recentPhase Outcome.
digest is requested, then only the most recent value is presented as current and the
superseded one is not.
with no resolution is listed as open together with its decision ID.
reported as resolved with the option that was chosen, and does not appear in the open list.
are compared, then they report the same state in full — same current phase, same current
deliverables, same open decisions with their IDs, same resolved decisions with their chosen
options, and the same reported anomalies. Any difference other than presentation format is a
failure.
then it reports that the feature has not started a phase; and given an issue carrying none of
the three reported record types, then every reported section is still present and explicitly
shown as empty, never omitted.
reports that the issue was not found and produces no digest.
fails part-way through resolution — when the digest is requested, then the view reports a read
failure distinctly from "issue not found", never presents a partial digest as if it were
complete, and signals the failure in whichever rendering was requested.
never raised, when the digest is requested, then that record is reported as an anomaly rather
than silently omitted.
afterwards, then no comment, label, or body content on it has been added or changed.
Out of Scope
phase, or posts a record.
machine form exists and is correct. Adopting it in the decisions-settled gate or
/dev:resolve'sdiscovery is a separate feature — the "Full" scope option was explicitly declined.
or queue view.
already dictates about supersession; it does not introduce a second notion of "current". AC2–AC4
are restatements for readability, not definitions — see Dependencies.
Dependencies
forge-contract.md§9) — the definition of supersession thisview reports against. §9 is authoritative on any divergence: AC2, AC3 and AC4 restate its
behaviour for readability, and where the restatement and §9 differ — an edited comment, a decision
resolved more than once, any tie in ordering — §9 governs and the view follows it.
work wherever the suite works, via the normal adapter dispatch — not against one adapter's
storage shape.
feature issue.
Timeline
Notes
Backlog-shaped.
pass so the two renderings cannot disagree.
code in the pipeline's decision gates).
exhaustive parity rather than a three-field spot-check; §9 governs over AC2–AC4 on conflict;
error behaviour is specified as one class (AC8) covering the machine form, read failure and
partial reads; the machine rendering's deliverable is availability, not adoption; "current
phase" is pinned to
next_state; the reported record types are enumerated and the empty issuerenders empty sections rather than omitting them; unparseable and dangling records are surfaced
as anomalies.
choice deferred to
/dev:technical-plan.observability: mode: none, so the applicability testyields no intersection and this PREQ carries no observability or audit criteria.
Test Plan: issue-digest-view
Scenarios derived from the PREQ alone, blind to any design. Lanes are deliberately absent — an
absent lane means
e2e-browser;/dev:technical-plan2.6b assigns the real lanes once the designexists.
Prerequisites
The scenarios need states of a feature issue, not an environment. Concrete environment details
(instance, credentials, invocation surface) belong to the UAT card generated at the end of QA.
feature issue through it.
that cannot read a given issue (needed by Scenarios 9 and 10).
Required Test Data
Six feature issues in distinct states:
deliverable kind posted twice with different values; at least two decisions, one still
open and one that was later resolved with a recorded chosen option.
Outcome, no deliverable, no decision.
parsed.
raised on that issue.
Test Scenarios
Scenario 1: Current phase is reported
Acceptance criterion: AC1 — Given a feature issue carrying at least one Phase Outcome, when the
digest is requested, then it reports the feature's current phase as the
next_stateof the mostrecent Phase Outcome.
next_statesays.that outcome reports as completed, and not the
next_stateof any earlier outcome.Expected outcome: A reader learns where the feature is now from the digest alone, without
opening the issue.
Scenario 2: A superseded deliverable is not presented as current
Acceptance criterion: AC2 — only the most recent value of a deliverable kind is presented as
current, and the superseded one is not.
later.
Expected outcome: The digest shows one current value per deliverable kind, and it is the newest.
Scenario 3: Open decisions are listed with their IDs
Acceptance criterion: AC3 — every decision with no resolution is listed as open together with
its decision ID.
Expected outcome: The reader can act on an open decision straight from the digest, without
searching the thread for its ID.
Scenario 4: A resolved decision shows its chosen option and leaves the open list
Acceptance criterion: AC4 — a resolved decision is reported as resolved with the option that was
chosen, and does not appear in the open list.
Expected outcome: Open and settled decisions are unambiguously separated.
Scenario 5: The two renderings agree in full
Acceptance criterion: AC5 — both renderings, produced from a single invocation for one issue,
report the same state in full; any difference other than presentation format is a failure.
values; the set of open decisions and their IDs; the set of resolved decisions and their chosen
options; and any reported anomalies.
Expected outcome: A human reading the digest and a consumer reading the machine form reach
identical conclusions about what is current.
Scenario 6: A feature that has not started a phase
Acceptance criterion: AC6 (first half) — an issue with no Phase Outcome reports that the feature
has not started a phase.
outcome removed).
mistake for a real one.
Expected outcome: "Not started" is reported as a real state, not as an error or a gap.
Scenario 7: A wholly empty issue shows empty sections, not missing ones
Acceptance criterion: AC6 (second half) — for an issue carrying none of the three reported
record types, every reported section is still present and explicitly shown as empty.
was not reported".
Expected outcome: Emptiness is stated, never implied by omission.
Scenario 8: A nonexistent issue
Acceptance criterion: AC7 — the view reports that the issue was not found and produces no
digest.
otherwise.
Expected outcome: A wrong issue number is unmistakable and produces nothing that could be read
as a real digest.
Scenario 9: A read failure is distinguished from "not found"
Acceptance criterion: AC8 — the view reports a read failure distinctly from "issue not found".
programmatic consumer) can tell "this issue does not exist" from "I could not reach the forge".
Expected outcome: The two failure causes are never conflated — one means the issue is wrong, the
other means the environment is.
Scenario 10: Access denied
Acceptance criterion: AC8 — read failure covers access denial as well as unreachability.
Expected outcome: An issue you are not allowed to read never masquerades as an issue with no
records.
Scenario 11: A partial read is never presented as complete
Acceptance criterion: AC8 — the view never presents a partial digest as if it were complete.
and others have not.
incomplete.
Expected outcome: An incomplete answer is always labelled as one — the reader is never given a
short digest they would take for the whole picture.
Scenario 12: An unparseable record is surfaced
Acceptance criterion: AC9 — a record that cannot be parsed is reported as an anomaly rather than
silently omitted.
and points to it well enough to go find it.
Expected outcome: A corrupt record is visible in the very view whose job is "what is current".
Scenario 13: A resolution naming an unknown decision is surfaced
Acceptance criterion: AC9 — a resolution naming a decision ID that was never raised is reported
as an anomaly.
refers to.
disappear.
Expected outcome: A record that cannot be attached to anything is reported, not dropped.
Scenario 14: The view changes nothing
Acceptance criterion: AC10 — after requesting the digest, no comment, label, or body content on
the issue has been added or changed.
Expected outcome: The view is safe to run at any point in a feature's life, including mid-run.
Traceability
Forward — every acceptance criterion has at least one scenario:
Backward — every scenario names its parent criterion above; there are no orphans.
Notes
requirement-derived, not design-derived: AC8 states the behaviour, and how it is exercised is for
/dev:technical-planto lane.not named. The PREQ does not decide it; naming it here would be testing a guessed design.
only.