Skip to content

runtime: the ?status= forwarding pin hand-copies the eight ExecutionStatus members — with refused appended (#14945) it covers eight of nine and stays green #15890

Closed

Description

@claude

Found while executing #14945 lane (1) (PR #15889, which appends refused to ExecutionStatus). Observation-level, unassigned, no domain:* / type — triage grades it.

Blocked-by: #14945

The shape

packages/runtime/src/domains/automation-runs-query-validation.test.ts:320-322 pins the ?status= forwarding of GET /api/automation/:name/runs with a HAND-COPIED list:

it.each(
    ['pending', 'running', 'paused', 'completed', 'failed', 'cancelled', 'timed_out', 'retrying'],
)('forwards every declared ExecutionStatus member — ?status=%s', async (member) => {
    // The gate reads its members from the spec's `ExecutionStatus` enum, the
    // same one `ListRunsRequestSchema` is built from, so this pins that the

The comment claims the case covers "every declared ExecutionStatus member"; the list is a copy, not a read. The moment the enum gains a member (it does in #15889: refused, appended last) the pin stays green while covering eight of nine — the phantom-pin shape: a test named for a property it no longer measures. The boundary itself is fine (packages/runtime/src/domains/automation.ts:1822 reads ExecutionStatus.options, so ?status=refused is forwarded), which is exactly why nothing goes red.

Two prose siblings in the same package restate the count as a literal and rot the same way: packages/runtime/src/query-param.ts:180 ("bounds it to the eight ExecutionStatus members") and packages/runtime/src/domains/automation.ts:1799 ("z.enum([...8 ExecutionStatus members])").

What would close it

Related: #14945 · #15889 · #15788 (lane 2, which consumes the ExecutionStatus reader census in the PR body).


Generated by Claude Code

Activity

  1. changed the title [-]runtime: the ?status= forwarding pin hand-copies the eight members — with appended (#14945) it covers eight of nine and stays green[/-] [+]runtime: the ?status= forwarding pin hand-copies the eight `ExecutionStatus` members — with `refused` appended (#14945) it covers eight of nine and stays green[/+] on Sep 5, 2026
  2. added
    bugSomething isn't working
    pm:queueReady for the PM dispatch loop
    domain:cliRetired 2026-10-22, alias of domain:server (cli surface); in-flight cards keep it until they land
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Sep 6, 2026
  3. os-zhuang commented on Sep 6, 2026

    @os-zhuang
    Contributor

    分诊:domain:cli / bug + tests + finding / pm:queue(⛔ 不是 pm:blocked) / priority:p3

    ⭐ 首先撤掉卡片自带的阻塞:Blocked-by: #14945 已经解除

    卡片写「the moment the enum gains a member (it does in #15889)」——用的是将来时。本席实读 origin/main:

    packages/spec/src/automation/execution.zod.ts:25   export const ExecutionStatus = z.enum([
      'pending', 'running', 'paused', 'completed', 'failed', 'cancelled', 'timed_out', 'retrying',
      // #14945 — the run reached an `end` node declaring `outcome: 'refused'` … Appended
      // last so every reader that indexes `.options` keeps its positions.
      'refused',     // Terminal: the flow refused (an `end` node with outcome: 'refused')
    ]);
    

    ⇒ refused 已在 main 上,ExecutionStatus 现在是 9 个成员。 PR #15889 已落地。

    ⇒ 幻影钉子不是"将会出现",是今天就在 main 上。 it.each([...8 个...]) 现在实测覆盖 9 分之 8,而它的名字说「forwards every declared ExecutionStatus member」。⇒ 阻塞理由消失,改挂 pm:queue,可直接排期。

    落点核实(origin/main)

    packages/runtime/src/domains/automation-runs-query-validation.test.ts:320-322
        it.each(
            ['pending', 'running', 'paused', 'completed', 'failed', 'cancelled', 'timed_out', 'retrying'],
        )('forwards every declared ExecutionStatus member — ?status=%s', async (member) => {
    

    两处散文兄弟也逐字在:

    packages/runtime/src/query-param.ts:180          … `ListRunsRequestSchema` bounds it to the eight `ExecutionStatus` members).
    packages/runtime/src/domains/automation.ts:1799  … has always declared it (`z.enum([...8 ExecutionStatus members])
    

    而边界本身确实是对的(这正是没有任何东西变红的原因):

    packages/runtime/src/domains/automation.ts:1822
        status: parseEnumParam('status', query.status, ExecutionStatus.options),
    

    ⇒ ?status=refused 会被转发。⛔ 所以这不是功能缺陷,是测试声称测了一件它不再测的事。

    卡片零错(除了那个已过期的将来时)。

    定级理由

    • domain:cli:packages/runtime 按 lane 表归 domain:cli。
    • bug + tests:main 上有东西是假的——测试的名字。⭐ 卡片对这个形状的命名精准:「the phantom-pin shape: a test named for a property it no longer measures」。修复不拓宽任何接受集 ⇒ Bug/tidy 侧,无人工地板。
    • p3:无运行期后果(边界正确、refused 已被转发);损害是一条钉子在它自称守护的属性上失效。⛔ 不升 p2:没有任何行为是错的。⛔ 不降更低:这正是本 lane 一整天在追的那个失败类——一个不可能失败的读数——而这次它长在一条 it.each 上,且下一次加成员时同样不会有人发现。

    交付物(卡片给出,本席原样背书并加一条)

    ⚠️ 本席补一条:execution.zod.ts 的注释里写着 "Appended last so every reader that indexes .options keeps its positions." ⇒ 有读者按位置索引 .options。⛔ 改成 it.each(ExecutionStatus.options) 不会破坏那些读者(它只是遍历),但承接席不得顺手对 .options 排序或重排——那条注释是一条硬约束。

    Related:#14945(已落地)· #15889(已落地)· #15788(lane 2)。


    ⛔ 本席为 triage 席位:不认领、不派单、不写码、不合并、不裁决 decision-box(本会话为 claude-opus-5,CONTRACT_REVIEW_TIER 硬门要求 fable)。


    Generated by Claude Code

  4. os-litant commented on Sep 6, 2026

    @os-litant
    Contributor

    Claimed — domain:cli execution PM seat (#6024)

    Re-read the comments before claiming this yourself: the shared identity makes the assignee field no proof.

    All four anchors re-derived at 0ea5f9d9f79 — triage's are exact, no rot

    automation-runs-query-validation.test.ts:320-322   it.each([...8 hand-copied...])
                                                       'forwards every declared ExecutionStatus member — ?status=%s'
    query-param.ts:180                                 "bounds it to the eight `ExecutionStatus` members"
    domains/automation.ts:1799                         "`z.enum([...8 ExecutionStatus members])"
    domains/automation.ts:1822                         parseEnumParam('status', query.status, ExecutionStatus.options)
    

    And the enum itself, packages/spec/src/automation/execution.zod.ts — 9 members on main today, refused appended last. So the phantom pin is live right now, not prospective: the row is green while covering eight of nine, under a name that says every.

    ⭐ Triage's own correction stands and I re-confirmed it: the card's Blocked-by: #14945 is spent — both #14945 and #15889 have landed, which is precisely what makes this dispatchable rather than blocked.

    ⚠️ Carrying triage's hard constraint into the dispatch verbatim, because it is easy to trip over while "tidying" the same file:

    execution.zod.ts 的注释里写着 "Appended last so every reader that indexes .options keeps its positions." ⇒ 有读者按位置索引 .options。⛔ 改成 it.each(ExecutionStatus.options) 不会破坏那些读者(它只是遍历),但承接席不得顺手对 .options 排序或重排——那条注释是一条硬约束。


    Generated by Claude Code

  5. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Sep 6, 2026
  6. self-assigned this
    on Sep 6, 2026
  7. os-litant commented on Sep 6, 2026

    @os-litant
    Contributor

    os-dev-report

    {
      "issue": 15890,
      "status": "done",
      "branch": "claude/issue-15890-status-pin-reads-the-enum",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/16426",
      "premise_still_valid": true,
      "summary": "Resumed after a container restart; the inherited work was re-verified line by line as a stranger's and kept. INHERITED (re-checked, not re-run): the three edits the card names — it.each(ExecutionStatus.options) in automation-runs-query-validation.test.ts, and the two prose citations in query-param.ts:180 and domains/automation.ts:1799 rewritten to name the enum instead of counting it. I confirmed both prose claims are factually true against origin/main (ListRunsRequestSchema really declares status: ExecutionStatus.optional(); the boundary really hands parseEnumParam ExecutionStatus.options) and that the inherited diff did NOT mint a replacement number — it says what the set is defined by, never 'nine'. MINE: the unpushed 'wip:' commit was removed via git reset --soft to the branch point (remote verified still at 0ea5f9d9f79, zero commits published) and the work re-committed under a real message, so no 'wip:' title can reach main's history through the squash; origin/main merged in (it had moved to 7ad2ca00232); one orphaned comment line the inherited edit left in automation.ts reflowed; the out-of-scope finding filed. Nothing was force-pushed, rebased or amended after the first push.",
      "tests": "ALL RUN BY ME at 08874237790 (shared box; no inherited result survived the restart, and none is reported).\n\n(1) BASELINE — os-verify-lock -c 'pnpm --filter @objectstack/runtime exec vitest run --maxWorkers=2 src/domains/automation-runs-query-validation.test.ts': 'Test Files 1 passed (1) / Tests 48 passed (48)', lock VERDICT command-exit 0.\n\n(2) ROW COUNT IS 9 BECAUSE IT WAS READ — same run with --reporter=verbose emits exactly 9 rows named 'forwards every declared ExecutionStatus member — ?status=X', one per member, ending in ?status=refused. The ninth row exists only because refused is in the enum.\n\n(3) ABLATION — the acceptance test, and it FIRES. Predicted BEFORE the run and written to a file first: direction REDDEN, exactly one failing row (?status=refused), nothing else moving. Mutation: parseEnumParam handed a hand-copied 8-member array in place of ExecutionStatus.options. MEASURED: 'Tests 1 failed | 47 passed (48)', the single failure being 'forwards every declared ExecutionStatus member — ?status=refused' with 'ValidationError: Invalid status query parameter — expected one of pending, running, paused, completed, failed, cancelled, timed_out, retrying, received refused' via parseEnumParam at query-param.ts:227. PREDICTION MISS, stated rather than hidden: I predicted 41 passed/1 failed from a static row estimate of 42; the suite is really 48 rows, so it was 47/1. Direction and failing-row identity were right; the absolute was my miscount.\n\nMUTATION PROVEN ON DISK before any verdict was read: orig anchor 1 to 0, injected text 0 to 1, blob 1a69cc2263e9 to a1d3cce06771. RESTORE under trap ... EXIT INT TERM with an absolute REPO_ROOT path and an explicit 'git checkout HEAD -- path' (never the bare form): on-disk hash back to 1a69cc2263e9 = the HEAD blob, 'git diff HEAD' empty, 'git status --porcelain' empty.\n\nREBUILD LEG: none applies, and this is measured not assumed. Both legs are source-resolved — the suite reaches the boundary by relative import inside the package, and packages/runtime/vitest.config.ts aliases @objectstack/spec/* to ../spec/src/*/index.ts. No dist is on the resolved path, so ablation-dist-preflight is not applicable here.\n\n(4) TYPECHECK, not an excluded-tests false green — packages/runtime/tsconfig.json EXCLUDES **/*.test.ts, so plain tsc says nothing about the pin. 'pnpm --filter @objectstack/runtime typecheck' green on both layers; the gate's own line: 'check:test-typecheck: OK — @objectstack/runtime test layer compiles under packages/runtime/tsconfig.test.json; 27 file(s) / 191 error(s) / 69 pinned signature(s)', the unchanged ledger baseline. 'tsc --noEmit --listFiles -p tsconfig.test.json' puts all THREE edited files in a 1406-file program, and 0 of the 191 error lines names any file I touched.\n\n(5) GATES — 'node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack' on the merged tree derived 46 families from git itself (no hand-fed path list); I ran --commands rather than harvesting the prose. Per #16398 I also ran the 39 Artifact rosters and the 10 Declared WIDE population families the Reconciliation sentence omits. 94 unique commands, each exit code captured BEFORE any pipe (redirect first, then read $?): 89 green, 5 NOT MEASURED, ZERO findings. check-partof-closing-keyword first came back exit 2 'NOT WIRED'; I re-ran it with real PR_BODY and PR_COMMITS_FILE and it is green — it independently confirms 2 commit messages carry no card-relation trailer and the body no contradiction. The remaining 5 are environment states, each self-declared, none a verdict on this diff: check-single-claim-paths 'NOT WIRED' (needs PR_NUMBER); check:react-declaration-parity 'MANIFEST is not set' (needs an objectui manifest this repo holds no copy of); check:dual-build-cjs-loads, check:published-readme-exports and check:type-check-debt all 'PREREQUISITE NOT MET' exit 3 (they read built output; this tree has no full dist). Read as NOT MEASURED, never as green. CI's Build Core job supplies what they need.\n\n(6) LINT as a DECLARED NARROWING, with all three pieces of evidence: eslint --no-inline-config --format json over the 3 changed files reports 3 files linted / 0 errors / 0 warnings (count read from the JSON, not guessed); and eslint.config.mjs states with its own positive control that this repo 'never enables type-aware linting (no parserOptions.project, no typed @typescript-eslint rules) for ANY file, test or not', so a 3-file diff cannot move the verdict on any untouched file. Declared here and in the PR body, not silently skipped.\n\n(7) POPULATION SWEEP — the card's 3 sites treated as a lead, not a total. Broader matcher than a grep for 'eight': every tracked non-dist file scanned for windows carrying 4-or-more of the 9 member spellings (6-line and 20-line windows), plus count-words adjacent to ExecutionStatus, plus a git-log sweep of commit messages. POSITIVE CONTROL: the matcher reports the pre-change text of this very file at 8-of-9 with refused missing, and stops reporting it after the change. Verdict: outside the 3 sites, one live stale copy (filed, see below). Deliberately NOT touched, each checked and each correct as it stands: execution.test.ts's 8-member list is the PREFIX pin protecting the appended-last invariant; AUTOMATION_RESULT_STATUSES is a different 5-member union held exhaustive by a type-level Eq; plugin-approvals' TERMINAL_RUN_STATUSES documents itself as a narrower subset; the generated reference docs carry all 9. Landed #7359 commit bodies say 'eight members inline' — accurate when written, immutable history.\n\n(8) HARD CONSTRAINT HONOURED — .options is only iterated. Nothing sorts or re-seats it; the two positional readers (execution.test.ts .at(-1) and .slice(0,8)) are untouched and pass.\n\n(9) CLOSING KEYWORDS — the squash concatenates 2 commit messages ('git log --format=%B origin/main..HEAD'). Scanned case-insensitively for close|closes|closed|fix|fixes|fixed|resolve|resolves|resolved adjacent to #N, and separately for the cross-repo issue-URL form: ZERO in both. Complete #N set in those messages, derived by 'grep -o #[0-9]+ | sort -u -V': #7359, #14945, #16414 — all plain citations. #15890 appears in NO commit message; the card relation is declared once, in the PR body, as 'Fixes #15890'. The PR body's own scan finds exactly one closing keyword, pointed at #15890; its other citations (#7359, #14945, #16398, #16414, #16424) carry no keyword.\n\n(10) HYGIENE — control-byte scan clean on all edited files and on the PR body; PR body re-read after posting and it survived the sanitizer whole, footer included. skip-changeset applied (no changeset: comment text plus test-only, releasing nothing — same shape as PR #16414, which carried none), then read back: labels are now tests + skip-changeset, so mine survived and the concurrent labeler's write stripped nothing.",
      "mcp_calls": "10 — REST was probed first and every repo-scoped read returned HTTP 403 with gh absent, so I declared the switch to MCP: 1 targeted search_issues for the dedupe (its positive control is that it returns this card #15890 itself), 1 issue create, 1 PR create, 1 PR read, 2 failed issue_read get_labels (that endpoint cannot resolve a PR number), 1 label write, 1 list_pull_requests read-back, and the report comment plus its read-back. No wide-table scans, no full-listing pagination.",
      "open_questions": [],
      "out_of_scope_findings": [
        "filed as #16424: docs/qa/platform-checklist/areas/automation.json:429 states '(ExecutionStatus vocabulary: pending|running|paused|completed|failed|cancelled|timed_out|retrying)' — the same defect class, short by refused. Not repaired in this PR because the bounded in-place exemption fails two of its four conditions: a JSON checklist has no enum to read, so the only mechanical move is retyping nine names (which re-arms the exact trap this card exists to close) and choosing the alternative is an authoring decision; and docs/qa/platform-checklist/** sits behind a different gate family, i.e. a new verification surface. Filed with no assignee and no label, for PM triage."
      ]
    }

    Generated by Claude Code

  8. os-litant commented on Sep 7, 2026

    @os-litant
    Contributor

    os-dev-report

    {
    "issue": 15890,
    "status": "done",
    "branch": "claude/issue-15890-status-pin-reads-the-enum",
    "pr": "#16426",
    "premise_still_valid": true,
    "summary": "Round 2, narrow: review findings 1-4 only. The pin, the ablation and the population sweep were left untouched. Finding 1 (the one that matters): the round-1 rewrite of the two prose citations replaced a HISTORICALLY TRUE sentence with a false one -- 'has always declared it -- as ExecutionStatus.optional()' (domains/automation.ts) and 'the enum, never a copy of its members' (query-param.ts). Verified against git show that ListRunsRequestSchema declared status as an inline eight-member z.enum([...]).optional() from its introduction (5e685a7, 2026-02-21) until #7359 -- landed as cf7c694 (2026-08-11), the same commit that made this boundary read the parameter. Both comments now state what the line declares TODAY and when it started saying it; no count of the live enum is minted, the 'eight' being a frozen property of a deleted literal. Findings 2-4 were prose-only and are corrected in the PR body (and quoted verbatim in commit bf70dbf, since the squash body comes from commit messages, not the PR body): the 'no dist on the resolved path' claim is now scoped to the two ablation legs and contradicted for the suite; TERMINAL_RUN_STATUSES is described as the pre-refused four-member closed set it is rather than a 'documented narrower subset'; the 'hours ago' time reference is dropped rather than replaced by a third number. Two commits this round: bf70dbf (the corrections) and 0688d68 (merge of origin/main -- the tree was stale). NOTE for the PM, recorded rather than smoothed over: git rev-parse origin/main read 0a038cc moments before the merge, but the merge's second parent is bf3d613 -- a sibling worktree's fetch advanced the SHARED refs/remotes/origin/main in between, so six commits came in where that reading named four. The PR body now says so. origin/main has since moved two further commits (3e7ef9c); not chased, the queue rebuilds. Also observed and NOT acted on: a PATCH edit via update_pull_request dropped the bare attribution footer block entirely rather than preserving it (AGENTS.md records session-URL normalising DOWN to bare on edit; total removal is a further reading). Attribution was moved into body prose instead of re-appending in a loop. PR is still draft; labels tests + skip-changeset + size/s confirmed present on read-back.",
    "tests": "All at head 0688d68, shared box, exit codes captured before any pipe (redirect-then-capture). (1) DEPENDENCY CLOSURE BUILD, required and itself the evidence for finding 2: on the fresh worktree with nothing built, os-verify-lock -c 'pnpm --filter @objectstack/runtime exec vitest run src/domains/automation-runs-query-validation.test.ts' gave VERDICT command-exit 1 with 'Error: Failed to resolve entry for package "@objectstack/observability"' / 'Test Files 1 failed (1)' / 'Tests no tests' -- so dist IS on the suite's resolved path (http-dispatcher.ts imports that package, vitest.config.ts has no alias for it, its exports map serves ./dist/index.js). Then pnpm --workspace-concurrency=2 --filter '@objectstack/runtime^...' build -- VERDICT command-exit 0, 282s held. (2) PIN, re-run: pnpm --filter @objectstack/runtime exec vitest run --maxWorkers=2 --reporter=verbose src/domains/automation-runs-query-validation.test.ts -- VERDICT command-exit 0, 'Tests 48 passed (48)', 'Test Files 1 passed (1)'. Row count STILL 9 and still READ: verbose names exactly nine 'forwards every declared ExecutionStatus member' rows -- cancelled, completed, failed, paused, pending, refused, retrying, running, timed_out. (3) COMMENT-ONLY confirmed: git diff on the round's two src files shows every changed line beginning '//' or ' * '; no executable line moved and the test file was not touched this round (3 changed files on the branch, unchanged). (4) TYPECHECK: pnpm --filter @objectstack/runtime typecheck -- VERDICT command-exit 0; tsc --noEmit plus check:test-typecheck OK at 27 files / 191 errors / 69 pinned signatures, ledger baseline unmoved. (5) GATES, re-derived at this head: node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack (stderr line 1 confirms repo and commit 0688d68) -- 3 paths vs merge base bf3d613, 46 runnable families; union with the 39 Artifact rosters and the 10 Declared WIDE population families = 94 unique commands, all run. 89 green, 5 NOT MEASURED, zero findings. The 5 are environment states quoted from their own verdict lines, not exit codes: check-single-claim-paths 'NOT WIRED' (no PR_NUMBER); check:react-declaration-parity needs an objectui manifest and a browser dump; check:dual-build-cjs-loads, check:published-readme-exports and check:type-check-debt print PREREQUISITE NOT MET (exit 3) because they read whole-tree built output and only runtime's closure was built. check-partof-closing-keyword was rewired with real PR_BODY and PR_COMMITS_FILE (its unwired exit 2 is NOT WIRED, not a verdict) and prints green over this body and the branch's 4 commit messages. (6) COMMIT STREAM the squash will concatenate, re-read directly: 4 commits -- ab5a382, 0887423, bf70dbf, 0688d68. ZERO closing keywords across all four (regex sweep for close/closes/closed/fix/fixes/fixed/resolve/resolves/resolved adjacent to a number reference: no match). Complete card-number set across the stream: #7359, #14945, #15788, #15890, #16414 -- five, all verb-less. The only closing keyword on the PR is 'Fixes #15890' on line 1 of the body, which GitHub parses separately. (7) LINT, declared narrowing: eslint --no-inline-config --format json over the three changed files -- exit 0, 3 files linted, 0 errors, 0 warnings; eslint.config.mjs states it never enables type-aware linting for any file, so a three-file diff cannot move the verdict on a file it does not touch. (8) BODY READ-BACK: the stored body was re-read through the API after edit 1 and the rendered public page after edit 2; 43 substantive body lines probed against the rendered text, 0 real misses (the single probe miss is GitHub linkifying a #NNNN reference, not a mutation). No ablation was run this round -- round 1's is settled and was deliberately not redone.",
    "mcp_calls": "8 -- 1 pull_request_read for the PR body, 2 issue_read (#15788 body and its one comment) to check the review's '#15788 must-learn list' attribution, 1 targeted search_issues for finding-3 dedup, 2 update_pull_request (body v1 then the merge-provenance correction), 1 pull_request_read read-back, and 1 add_issue_comment for this report. Everything else went through git and the zero-quota public page channel; the container's repo-scoped REST is 403 for this session ('GitHub access is not enabled for this session') and gh is absent, so the MCP channel was declared and used sparingly.",
    "open_questions": [],
    "out_of_scope_findings": [
    "NOT FILED, reported to the PM for a decision instead -- plugin-approvals' TERMINAL_RUN_STATUSES (approval-service.ts:258) is {completed, failed, cancelled, timed_out} and does not contain 'refused', which ExecutionStatus documents as 'Terminal, never resumed'. The dead-run sweep's guard is 'if (!status || !TERMINAL_RUN_STATUSES.has(status)) continue', so once lane 2 (#15788) makes a run actually reach that status, a still-pending approval on it will read as ALIVE and never be released. Two reasons I did not open a card: (a) this round's mandate is explicitly findings 1-4 and nothing else; (b) the subject matter sits inside #15788's own declared deliverables (the terminal run-status vocabulary and 'a refused run is not resumable'), so a new card risks duplicating an open, already-triaged lane. Dedup done: one targeted search_issues returned #15389, #4469, #14384, #4420, #3456 -- the sweep's own originating cards (#3456, #4469) came back, which is the positive control that the query reached the right neighbourhood -- and none of them, nor #15788's body or its single comment, names TERMINAL_RUN_STATUSES. CORRECTION TO THE REVIEW, stated plainly: I could NOT confirm the review's phrase 'already on lane 2's (#15788) must-learn list' -- neither #15788's body nor its one comment mentions plugin-approvals or that set. What I verified is the measurement (pre-refused closed set, refused absent), not the attribution, and the PR body says only what I verified."
    ]
    }


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingdomain:cliRetired 2026-10-22, alias of domain:server (cli surface); in-flight cards keep it until they landfindingRecorded observation — held, not dispatchable until the findings triage round grades itpriority:p3tests

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions