Skip to content

Commit cd354fd

Browse files
claude[bot]claude
andauthored
fix(qa): drop the rotting :NNN source-line citations from the platform checklist (#13786)
* wip: strip rotting :NNN source-line citations from the platform checklist * feat(qa): refuse source-line citations in the platform checklist --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 6207c9e commit cd354fd

20 files changed

Lines changed: 1038 additions & 895 deletions

docs/qa/platform-checklist/FOLLOW-UPS.md

Lines changed: 74 additions & 74 deletions
Large diffs are not rendered by default.

docs/qa/platform-checklist/README.md

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ copy its shape rather than inventing a second one.
127127
"call": "POST /api/v1/packages",
128128
"body": { "": "" }, // optional; omit for a non-body step
129129
"expect": "what a correct response looks like — and the re-run/409 caveat",
130-
"source": "framework file:line that grounds the call and its shape" }
130+
"source": "framework file + symbol that grounds the call and its shape" }
131131
],
132132
"teardown": "the one call (or the cheaper discard-the-DB path) that undoes it",
133133
"knownGaps": ["where the recipe is known to be sharp — e.g. an SDK helper that drops ?package="]
@@ -157,8 +157,14 @@ Why this shape:
157157
the only cleanup is the `teardown` line. That is what makes a recipe safe to replay on
158158
a live boot — and why `requires` must name the capability the recipe itself needs
159159
(e.g. a session holding `manage_metadata`) rather than assuming a bare admin session.
160-
- **Every call cites framework source at `file:line`.** Replay them literally; if one
161-
4xxs, re-read the citation before assuming the recipe rotted.
160+
- **Every call cites framework source as `file` plus the symbol it lands in.** Replay
161+
them literally; if one 4xxs, re-read the citation before assuming the recipe rotted.
162+
**Never pin a source LINE NUMBER** (`file.ts:NNN`, or a bare `:NNN` continuing an
163+
earlier citation — both spellings are refused). A line number is the only part of a
164+
citation that rots on an edit the citation has nothing to do with, and nothing can
165+
tell a rotted one from a fresh one — so it keeps reading as "verified against source"
166+
while pointing somewhere else. The file plus the symbol name is already the
167+
load-bearing half. `check:platform-checklist` fails on any that reappear.
162168
- **`why` is the debt marker.** A recipe exists because stock fixtures cannot demonstrate
163169
something — the same discipline as a coverage waiver. Landing the fixture in the
164170
showcase seeds proper retires the recipe; until then `why` says what is missing and

docs/qa/platform-checklist/RUNNER.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,15 +201,15 @@ contradicts it, and correct it here when it does.
201201
proving it was an address problem by putting a TCP forwarder on 3000, and #7538 fixed
202202
the resolution but could not fix a boot that never exports the variable. **Check:**
203203
before scoring any connector clause, `GET /api/v1/automation/connectors` and read the
204-
instance `baseUrl` — if it says `:3000` and your server does not listen there, the
204+
instance `baseUrl` — if it says `` and your server does not listen there, the
205205
fixture is misconfigured, not blocked. **Fix:** boot with `OS_PORT=<port>` exported (or
206206
`SHOWCASE_SELF_URL=http://127.0.0.1:<port>`) *in addition to* `-p <port>`. ⛔ Do not
207207
record a connector clause as `blocked(environment)` on the strength of `fetch failed`
208208
alone.
209209

210210
- **`ss` is not installed in these containers — read liveness with `curl`, never a socket
211211
table.** `ss` and `netstat` are both absent (`command not found`); `lsof` and `fuser`
212-
are present. The trap is that the usual spelling hides the cause: `ss -ltn | grep :3000`
212+
are present. The trap is that the usual spelling hides the cause: `ss -ltn | grep`
213213
sends the error to stderr and prints nothing, so a **live** server is indistinguishable
214214
from a dead one — empty stdout, exit 1, no clue why. **Check instead:**
215215
`curl -s -o /dev/null -w '%{http_code}' http://localhost:PORT/api/v1/health` (substitute

docs/qa/platform-checklist/SWEEP.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ value a matrix item was pinned against (`enumSource` freshness ratchet).
1212

1313
⚠️ Those ratchets are **NOT wired into per-PR CI** — by maintainer decision they run on a
1414
periodic **manual** cadence (see this dir's [README.md](./README.md) "Operating cadence",
15-
and the recorded note at `.github/workflows/lint.yml:426`). So they do **not** catch drift
15+
and the recorded note at `.github/workflows/lint.yml`). So they do **not** catch drift
1616
on the PR that causes it; they catch it at the **next manual run**. Do not read a green
1717
ledger as "drift is already gated" — between runs, an unmapped kind or a grown enum sits
1818
undetected on `main`, which is precisely why a sweep must re-derive from source rather

docs/qa/platform-checklist/areas/access-security.json

Lines changed: 70 additions & 70 deletions
Large diffs are not rendered by default.

docs/qa/platform-checklist/areas/ai.json

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -605,7 +605,7 @@
605605
"sweep the gated affordances on the settled shell: floating chatbot FAB, the right-docked chat rail, the AppHeader AI/assistant entry, the Home layout's AI CTAs — screenshot each region, THEN read the DOM to confirm absence",
606606
"press ⌘⇧I (the chat-dock toggle) and confirm nothing mounts — ConsoleLayout only arms the listener when dockEnabled",
607607
"navigate directly to /ai (the stale-bookmark path): capture that a loading fallback holds while the catalog resolves, then the redirect to home lands with the splash preserved — record whether any frame of chat UI flashed",
608-
"as admin open the System hub (SystemHubPage): screenshot the admin card cluster and record whether the 'AI Approvals' card renders on this agent-less boot (expected at head: it DOES — the card is built unconditionally, SystemHubPage.tsx:258-265)",
608+
"as admin open the System hub (SystemHubPage): screenshot the admin card cluster and record whether the 'AI Approvals' card renders on this agent-less boot (expected at head: it DOES — the card is built unconditionally, SystemHubPage.tsx)",
609609
"click the card through to system/ai-approvals; capture the network for ~15s: GET /api/v1/ai/pending-actions?status=pending firing every ~5s and answering 501 each time (poll never stops on error — usePendingActions clears nothing and re-arms)",
610610
"capture what the page renders: the destructive alert's text (must carry the Cloud/EE remedy sentence from the 501 body), AND whether the 'No actions waiting / When the AI proposes a sensitive action it will appear here for review' empty state renders beneath it as if a live queue exists",
611611
"capture the browser console for the whole session"
@@ -620,7 +620,7 @@
620620
{
621621
"clause": "every gated affordance is ABSENT on the empty catalog: no FAB, no chat dock (⌘⇧I inert — the listener is not armed), no top-bar AI entry, no Home AI CTAs — hidden-during-load is the designed flash-free behavior, so a settled screenshot precedes every DOM read. The ENTITLED side (>= 1 agent ⇒ all of them appear) is blocked(fixture) on the open framework — record it blocked, never ticked from the hook's source",
622622
"oracle": "screenshot",
623-
"verify": "settled screenshots of shell chrome + Home show none of the affordances; post-screenshot DOM reads confirm; ⌘⇧I produces no mount (ConsoleLayout.tsx:117-127 gates the listener on dockEnabled = the same signal)",
623+
"verify": "settled screenshots of shell chrome + Home show none of the affordances; post-screenshot DOM reads confirm; ⌘⇧I produces no mount (ConsoleLayout.tsx gates the listener on dockEnabled = the same signal)",
624624
"evidence": "the region screenshots + the ⌘⇧I non-event"
625625
},
626626
{
@@ -630,7 +630,7 @@
630630
"evidence": "the navigation capture / frame notes"
631631
},
632632
{
633-
"clause": "EXPECTED FAIL at head (defect K2, sweep 2026-08-30): the SystemHub 'AI Approvals' card follows the same gate as every other AI affordance — i.e. it is absent on an agent-less boot. At head it is NOT: SystemHubPage.tsx:258-265 builds the card unconditionally (no useAiSurfaceEnabled read, unlike FAB/dock/header/Home), so it renders and advertises a dead surface. A run that sees the card must score this clause FAIL with the screenshot — do not tick it green, and do not re-file the defect (the sweep's FOLLOW-UPS row owns it)",
633+
"clause": "EXPECTED FAIL at head (defect K2, sweep 2026-08-30): the SystemHub 'AI Approvals' card follows the same gate as every other AI affordance — i.e. it is absent on an agent-less boot. At head it is NOT: SystemHubPage.tsx builds the card unconditionally (no useAiSurfaceEnabled read, unlike FAB/dock/header/Home), so it renders and advertises a dead surface. A run that sees the card must score this clause FAIL with the screenshot — do not tick it green, and do not re-file the defect (the sweep's FOLLOW-UPS row owns it)",
634634
"oracle": "dom",
635635
"verify": "screenshot the hub first, then read the card grid: the designed contract is no 'AI Approvals' card on an empty catalog; observed-at-head is the ungated card",
636636
"evidence": "the hub screenshot + card-grid DOM"
@@ -642,7 +642,7 @@
642642
"evidence": "the alert screenshot + one captured 501 response"
643643
},
644644
{
645-
"clause": "EXPECTED FAIL at head (defect K2, same row): honest degradation means no fake empty queue and no unbounded dead poll. At head, beneath the error alert the inbox ALSO renders the 'No actions waiting' empty state (rows.length === 0 branch is not error-aware, AiPendingActionsInbox.tsx:286-297) — reading as a live, empty approval queue on a deployment that has none — and the 5s poll re-arms forever against the dead endpoint (usePendingActions keeps polling on error). Score against the honest contract; record the observed fake-empty-queue + endless poll as the FAIL evidence, do not tick green",
645+
"clause": "EXPECTED FAIL at head (defect K2, same row): honest degradation means no fake empty queue and no unbounded dead poll. At head, beneath the error alert the inbox ALSO renders the 'No actions waiting' empty state (rows.length === 0 branch is not error-aware, AiPendingActionsInbox.tsx) — reading as a live, empty approval queue on a deployment that has none — and the 5s poll re-arms forever against the dead endpoint (usePendingActions keeps polling on error). Score against the honest contract; record the observed fake-empty-queue + endless poll as the FAIL evidence, do not tick green",
646646
"oracle": "network",
647647
"verify": "the ~15s network capture shows the repeated 501s with no backoff/stop; the page screenshot shows the empty-queue panel rendered alongside the error alert",
648648
"evidence": "the poll trace + the page screenshot"
@@ -656,13 +656,13 @@
656656
],
657657
"traps": ["hydration-race", "stale-console-bundle"],
658658
"source": [
659-
"objectui packages/app-shell/src/hooks/useAiSurface.ts:9-40,71-88 (the ONE signal: access-filtered GET /ai/agents, per-seat rationale, isLoading latch for the route guard; do-NOT-simplify-to-discovery warning)",
660-
"objectui packages/app-shell/src/layout/ConsoleLayout.tsx:77-127 (FAB + chat dock + ⌘⇧I all gated on showChatbot/dockEnabled)",
661-
"objectui packages/app-shell/src/layout/AppHeader.tsx:149-152 (top-bar AI entry gated on the same hook) + console/home/HomeLayout.tsx:45-46 (Home CTAs)",
662-
"objectui packages/app-shell/src/console/ConsoleShell.tsx:371-401 (RequireAiSurface — waits for resolve, splash-preserving redirect, objectui#6507)",
663-
"objectui apps/console/src/pages/system/SystemHubPage.tsx:258-265 (the 'AI Approvals' card built UNconditionally — the K2 gap) + AppContent.tsx:167 (the system/ai-approvals route) + pages/system/AiPendingActionsPage.tsx (thin wrapper, 'Polled every 5 seconds')",
664-
"objectui packages/plugin-chatbot/src/usePendingActions.ts:158-202,217-300 (cookie-only call(), error → error.message, pollInterval 5000 re-arming regardless of errors) + AiPendingActionsInbox.tsx:255-297 (destructive alert + the error-blind 'No actions waiting' empty state)",
665-
"packages/runtime/src/domains/ai.ts:36-113 (#7653 anonymous-deny first; the /ai/agents empty-catalog courtesy #4058/#4053; every other /ai/* → capabilityUnavailable 501) + domains/unavailable.ts (single-sourced remedy sentence)",
659+
"objectui packages/app-shell/src/hooks/useAiSurface.ts,71-88 (the ONE signal: access-filtered GET /ai/agents, per-seat rationale, isLoading latch for the route guard; do-NOT-simplify-to-discovery warning)",
660+
"objectui packages/app-shell/src/layout/ConsoleLayout.tsx (FAB + chat dock + ⌘⇧I all gated on showChatbot/dockEnabled)",
661+
"objectui packages/app-shell/src/layout/AppHeader.tsx (top-bar AI entry gated on the same hook) + console/home/HomeLayout.tsx (Home CTAs)",
662+
"objectui packages/app-shell/src/console/ConsoleShell.tsx (RequireAiSurface — waits for resolve, splash-preserving redirect, objectui#6507)",
663+
"objectui apps/console/src/pages/system/SystemHubPage.tsx (the 'AI Approvals' card built UNconditionally — the K2 gap) + AppContent.tsx (the system/ai-approvals route) + pages/system/AiPendingActionsPage.tsx (thin wrapper, 'Polled every 5 seconds')",
664+
"objectui packages/plugin-chatbot/src/usePendingActions.ts,217-300 (cookie-only call(), error → error.message, pollInterval 5000 re-arming regardless of errors) + AiPendingActionsInbox.tsx (destructive alert + the error-blind 'No actions waiting' empty state)",
665+
"packages/runtime/src/domains/ai.ts (#7653 anonymous-deny first; the /ai/agents empty-catalog courtesy #4058/#4053; every other /ai/* → capabilityUnavailable 501) + domains/unavailable.ts (single-sourced remedy sentence)",
666666
"ai.open-edition-honest-degradation (the API half this item mirrors in the browser — 501 body/discovery parity is proven THERE, not re-proven here)"
667667
],
668668
"history": [

0 commit comments

Comments
 (0)