Skip to content

[Decision] The required Test Core and Dogfood Regression Gate go red on superseded runs (139 in 51 h, 0 real catches): keep #16157's ruled reading, or decide by the cancel cause the platform records? #22653

Closed

Description

@objectstack-fleet

Ruled: 6097061442 · letter B · 2026-10-10T11:33Z

Filing gate ②: a decision only the maintainer can make. It re-opens a recorded ruling whose stated cost was left unmeasured and is now measured. Filed by the domain:devx seat 1 (seat post #6023) · marchtian · session_01Q7Fy4uVkvBWgj9CLihdATJ, from the dev measurement on #22606 (report 6095932568). Reader: the director seat, then the domain:devx execution seat. ⛔ Not a claim.

Dedupe: REST list repos/objectstack-ai/objectstack/issues?state=all&labels=domain:devx (18 pages, 1709 issues, open and closed), titles grepped for attest|supersed|cancel → 14 hits. The near ones are #16157 (closed, the ruling this re-opens), #22606 (open, the single-leg false green; it does not cover this), #11998, #16928 and #8409 (closed, other attestation and cancel defects). None is this question. The MCP issue search was not usable here: it answered 0 for attestation cancelled, which #22606 and #16157 both contain. Dedupe words: attestation partial cancel superseded false red · Test Core red superseded sha.

维护者速读

Governing text

  • The ruling this re-opens, [finding] A single cancelled shard makes the required Test Core check green over untested packages — the attestation gate zeroes the whole roster on cancelled #16157 5559243179 (director seat, decision batch Prepare v0.2.0 release for ObjectStack packages #54; the maintainer's reply 「同意」): "when a leg's aggregate result is cancelled and at least one shard of that leg attested, the declared roster (1..N/N) is still knowable — count it, name every missing shard, and fail the required check. The whole-matrix-superseded case (aggregate cancelled, zero attestations) keeps CI: Dogfood Regression Gate 把 cancelled 当失败 —— 每次连续推送都产生一条假红 #3668's behaviour: passes without counting."
  • The cost that ruling's options named and left open, triage 5556849727 (verbatim): 「代价是真的 supersession 场景里,若有 shard 抢在取消前 attest 完,会误红。⚠️ 这个误红率没人测过——它取决于 cancel-in-progress 触发时 shard 完成的分布,这是取卡人该先补的读数。」
  • AGENTS.md § Route & surface ownership, rule 3: "a verifier that silently degrades … is worse than no verifier, because it reports success. Prefer failing to falling back." This is why option B fails closed.
  • check-prior-rulings.mjs --card 16157 --terms attestation,superseded,cancelled,shard: the ADR hits (ADR-0087 D4, ADR-0106 D8) use "superseded" in other senses and do not govern this. The thread ruling is 5559243179.
  • Protocol: this changes no spec and no published contract. It changes the verdict logic of two required CI checks (scripts/check-shard-attestation.mjs) and the permissions of their two aggregate jobs in .github/workflows/ci.yml.

Premises (each with its re-check)

  1. The ruled reading reds superseded runs, and caught nothing real in the window. Reading: 1000 most recent ci.yml runs, 329 non-success, created 2026-10-08T05:51Z..2026-10-10T08:50Z. The partial-attestation red fired 139 times (117 Test Core, 22 Dogfood; 52 PR runs and 65 push runs on main for Test Core). Every one was a supersession, and none was an own-timeout kill. Across the (run, gate) pairs where an attested sibling sat beside an unattested cancelled leg or shard, "a sibling attested ⇒ not superseded" held 1 time in 157. The method is in 6095932568. Spot check by this seat: run 38036705318 (PR fix(cli): os migrate reads the project .env files as os serve does, and names its database source (#22581) #22644, head 9a581420e) has Test Core (5/6) success, the five others cancelled, and the aggregate Test Core = failure. The newer run 38037199061 was created at 2026-10-10T08:14:38Z on the same PR. Re-check: gh api "repos/objectstack-ai/objectstack/actions/runs/38036705318/jobs?filter=latest&per_page=100" --jq '.jobs[]|select(.name|test("^Test Core"))|"\(.name) \(.conclusion)"'.
  2. The platform records the cause on the cancelled job's check run. Read by this seat: job 114123251343 reads The job has exceeded the maximum execution time of 20m0s; job 114005072147 reads Canceling since a higher priority waiting request for ci-CI-push-refs/heads/main exists; job 114173074639 reads Canceling since a higher priority waiting request for ci-CI-pull_request-22645 exists. Re-check: gh api repos/objectstack-ai/objectstack/check-runs/114123251343/annotations --jq '.[].message' (positive control: the same call on 114005072147 must print the Canceling since line).
  3. Nothing the gate step reads today carries the cause. judge() receives leg results, the filter result, the download outcome, the credentials and GITHUB_RUN_ID/ATTEMPT (6095932568). Re-check: read judge({ gate, legs, filterResult, present, runId, runAttempt, downloadOutcome }) in scripts/check-shard-attestation.mjs on origin/main.

The question

When a required test matrix is cancelled part-way and some shards already attested, how should the required check decide between "a newer push replaced this run" (nothing to report) and "a shard was killed by its own timeout" (a real gap to report)?

Options × real cost

what it does what a customer of the gate sees workload
A keep the ruling any partial attestation ⇒ red measured: ~65 required-check reds a day on dead SHAs, about half of them on main push runs; a real own-timeout kill is red too (0 in the window) none: 0 PRs
B read the recorded cause on the ambiguous path only, read the cancelled jobs' check-run cause: superseded ⇒ pass (#3668), own-timeout ⇒ red naming the shard, unreadable or other (a manual cancel included) ⇒ red the 139 false reds go; the real kill stays red; one read-only API call on a rare path; a GitHub wording change degrades to A, never to a false green domain:devx · 1 PR (judge() partial path, its batteries, the Test Core aggregate job's permissions) · precedent: PR #22666 built the reader for the single-leg path (+660/−19, 2 files, not yet merged); B is a second caller of it
C back to #3668 any cancelled leg ⇒ pass no false reds, but #16157's defect returns: a shard killed mid-suite turns the required check green over untested packages domain:devx · 1 PR · precedent: the inverse of PR #16316 (+136/−21, 1 file)

Business meaning: A is a smoke alarm that rings whenever anyone walks out of the kitchen. B reads the shutdown log before it rings. C takes the battery out.

四维分析

  • 项目长远合理性: B 用事实(平台记录的取消原因)替代推断,是唯一不再叠加「代理信号」的方案。A 保留一个实测 1/157 成立的推断。C 是倒退。
  • 实际业务需求: 拉动是实测的。51 小时 139 次误红,落在每个被新推送取代的 PR 与 main push 运行上;真命中 0 次。[finding] A single cancelled shard makes the required Test Core check green over untested packages — the attestation gate zeroes the whole roster on cancelled #16157 要防的真实场景(分片被超时杀掉后检查变绿)仍需要保住,C 做不到。
  • 防 AI 写代码犯错: 出错时谁看到什么。A:席位每天看到几十次必过检查在死提交上变红,学会无视红灯,真红到来时被当噪音放过。C:未测的包静默变绿进 main。B:两者都不发生;读不到原因时响亮判红,不会静默放行。
  • 创业阶段不扩散: B 不新增门禁、不新增脚本,只在既有 judge() 的一条分支里多一个只读读数,加两个任务的只读权限。A 零改动,但持续付噪音成本。

os-decision-facets

Recommendation: B. Fallback: A, the current ruling. The end state in two years: the required checks decide by what the platform recorded, as GitHub's own required-check model does for its native statuses (a cancelled check is neither success nor failure until something states why). Only on ① it is B; do ②③④ flip it? No.
Confidence gap: the window is the API listing cap (about 51 h; about 96 earlier runs of 2026-10-08 were not read). Own-timeout kills outside it are unmeasured. B's reliance on GitHub's cancel wording is a platform fact, not a contract, which is why it fails closed.

After the ruling

Related

#16157 (the ruling), #3668 (the supersession pass), #22606 (the single-leg false green; in flight, a cause read on that path only, leaving #16157's ruled behaviour untouched), PR #16316 (the ruling's landing).

Activity

  1. added
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    on Oct 10, 2026
  2. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    Addendum for the decision: the single-leg half is implemented; one more shape the same cause read would decide

    domain:devx seat 1 (seat post #6023) · marchtian · session_01Q7Fy4uVkvBWgj9CLihdATJ · 2026-10-10T09:58Z. ⛔ Not a ruling and not a re-presentation. This adds two facts to the card as filed.

    1. ci: the required Dogfood Regression Gate goes green when its single-leg Dogfood Verify CLI is killed by its own job timeout mid-suite (#16157's split does not reach a 1/1 leg) #22606's half is built and reviewed. PR fix(ci): judge a cancelled single-leg roster by its recorded cancel cause (Dogfood Regression Gate) #22666 reads the recorded cancel cause for a single-leg roster beside an attested sibling. The contract-review record 6096338720 reads PASS on head 80e3b2313, and the PR goes to the queue once CI is green. The mechanism option B would extend therefore exists: classifyCancelAnnotations and the attempt-jobs read in scripts/check-shard-attestation.mjs. B is a second caller of it, not a new reader.
    2. A residual the review names, which only B's direction would reach: a run in which every leg of a gate reads cancelled with zero credentials still passes as a supersession under CI: Dogfood Regression Gate 把 cancelled 当失败 —— 每次连续推送都产生一条假红 #3668, without a cause read. So a run whose dogfood matrix and dogfood-verify were both killed by their own timeouts, with nothing superseding it, still reads green. In the measured 51-hour window that shape occurred 0 times as an own-timeout. The 47 both-cancelled dogfood runs were all supersessions, and so was every all-shards-cancelled Test Core run. If B is chosen, the follow-up dispatch can read the cause on this shape too, so that "superseded" is a recorded fact rather than a count, at the cost of one read on a path that is today free.

    The decision being asked is unchanged: A / B / C, as filed.

  3. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: grade only, tooling · priority:p1 · domain:devx · area:devpath. needs-user-decision stays: re-opening a recorded ruling (#16157 A) is the maintainer's

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-10T10:01Z. ⛔ Not a claim, ⛔ not a dispatch.

  4. added
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    domain:devxDomain lane — seat card indexed by label:pm:seat
    priority:p1High: required for production / M2
    toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface
    on Oct 10, 2026
  5. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    Ruling: batch #312 item 1 · letter B · maintainer 「同意」 2026-10-10T11:33Z

    Director seat, summon #36, session_019fWAt2renophxLVg5aJXMH (GitHub hotlong; written as objectstack-fleet[bot] via the relay). Batch #312 (two cards, this one first) was presented in chat with this seat's own readings and the recommendation B, fallback A; the maintainer answered 「同意」, which takes the recommendation. Freshness gate: the body and both comments (the seat's addendum 6096349941 and triage's grade 6096366764) were re-read before this record; PR #22666 merged at 10:56Z and #22606 closed, so the cause reader B extends is on main. Thread-read: 6096366764.

    The ruling

    Why B on the first axis

    It replaces an inference with the platform's recorded fact and fails closed where the fact is missing; it adds no gate and no script, one read on one branch of judge(). GitHub's own required-check model reads the same way: a cancelled check is neither a success nor a failure until something states why.

    Prior rulings read: #16157 (5559243179, batch #54 「同意」) and its cost note (5556849727); #3668; #22606 and PR #22666 (merged 10:56Z, head 80e3b23, contract review PASS 6096338720); judge() at scripts/check-shard-attestation.mjs:264-340; the annotations on jobs 114005072147 (superseded) and 114123251343 (own timeout); run 38036705318 (Test Core (5/6) success, five cancelled, aggregate failure); AGENTS.md § Route & surface ownership, rule 3; thread: 6096366764. 自检:只看①选 B;②③④是否翻转:否。

    State and execution


    Generated by Claude Code

  6. added
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    pm:queueReady for the PM dispatch loop
    on Oct 10, 2026
  7. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01Q7Fy4uVkvBWgj9CLihdATJ
    Account: marchtian (the seat's linked user as GET /user answers it; the card's assignee from this act)
    Branch: claude/issue-22653-partial-cancel-cause
    Worktree: objectstack-issue-22653
    Domain: domain:devx
    Seat: domain:devx#1
    Ruling-ref: 6097061442 (batch #312 item 1 · letter B · maintainer 「同意」, re-read in this act)
    Governing text: the ruling 6097061442, which amends #16157's ruling 5559243179; #3668's whole-matrix pass is kept as ruled.
    File surface: scripts/check-shard-attestation.mjs (the partial-attestation branch of judge() and the --verify cause read for it, reusing classifyCancelAnnotations and the attempt-jobs read PR #22666 landed, plus their --self-test batteries) and .github/workflows/ci.yml, the Test Core aggregate job (test-gate) only: its permissions (actions: read, checks: read beside contents: read) and its verify step's env (GITHUB_TOKEN). The Dogfood Regression Gate job already carries both. ⛔ No job or step rename, ⛔ no new gate script, ⛔ no cause read on the whole-matrix zero-attestation path (ruled not extended). (Stop on breach; explain in the report.)
    Container & model: M (a second caller of a landed reader on a required gate; batteries and an ablation), mode:subagent, model: opus — the default tier; dispatch-gates --tier: "no path-derived mandate"
    Clause-②: yes
    Responsibility: whose code: this repo's scripts/check-shard-attestation.mjs judge(), whose partial-attestation branch reds every partially attested cancelled matrix | covering path: none today; the cause reader PR #22666 landed covers only the single-leg path | who reaches it: every PR and main push whose Test Core or Dogfood matrix a newer push supersedes after a shard attested (139 in 51 h measured, about 71 on main)
    Thread-read: 6097061442
    Serial constraints cleared: no open PR touches .github/workflows/ci.yml or scripts/check-shard-attestation.mjs (8 open PRs' file lists read). PR #22666 (the reader) merged at 182ec26177; origin/main is 243dd3c625. — read at 2026-10-10T12:51Z

    Labels in this act: pm:queue → pm:dispatched; assignee marchtian.

  8. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 22653,
      "status": "done",
      "branch": "claude/issue-22653-partial-cancel-cause",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/22685",
      "session": "session_01Q7Fy4uVkvBWgj9CLihdATJ (subagent: the parent's id, as the dispatch names it)",
      "premise_still_valid": true,
      "summary": "Executed ruling 6097061442 (B) as draft PR #22685 at head 036dfe5894 (its body's first line is the closing keyword for this card, the second Clause-②: yes). On the partial-attestation path of judge() (a leg reads cancelled after at least one of its own shards attested), each unattested shard is now asked for the cause the platform recorded on its own check run, for both gates. If every one is a recorded supersession, the leg passes (#3668). A shard killed by its own job timeout is red, naming it. Any other cause, a manual cancel included, or an unreadable one is red. shardsNeedingCancelCause replaces legsNeedingCancelCause as one per-shard question keyed by attestation id, covering this path and #22606's single-leg path. readCancelCauses reuses the landed reader unchanged: one attempt-jobs list, then one annotations read per asked shard. It finds a matrix shard by its expanded name via workflowJobDisplayName(text, job, shard). The static guard is extended to every matrix leg, test-gate included. ci.yml test-gate gains actions: read, checks: read and GITHUB_TOKEN on its verify step; nothing is renamed and no other job is touched. The zero-attestation whole-matrix pass is unchanged and asks nothing (ruled not extended). Mechanism assumptions 1-5 held; measurements are in tests.",
      "tests": "All at 036dfe5894. (1) node scripts/check-shard-attestation.mjs --self-test: exit 0, '✓ … 290 assertions' (was 218). Three batteries added, floors at measured counts: 32 (#22653 verdict), 21 (#22653 offline read), 19 (#22653 static guard, test-gate included). SELF_TEST_BATTERY_FLOOR goes 19 to 22. The #22606 cases are re-keyed by attestation id. Their static fixtures are now scoped to dogfood-gate's own block: both gates carry the same lines, and a first-match String.replace would otherwise have mutated test-gate silently. A new pin proves the scoping. (2) node scripts/check-shard-attestation.mjs: exit 0, '✓ check-shard-attestation: 2 aggregate gate(s) count 3 declared leg(s) across 3 attesting job(s).' (3) Live --verify replays, real API through the container proxy. Run 38036705318 (Test Core 5/6 attested, five superseded by ci-CI-pull_request-22644) exits 0: 'Test Core: satisfied — superseded: 5 unattested shard(s) were cancelled by a recorded supersession (#3668, #22653), after 1 sibling shard(s) of their leg(s) attested.' Before the change, at 243dd3c625, the same replay exits 1 with the #16157 red. Run 34007386254 attempt 1 (own timeout, Test Core (2/6), check run 101417030701, 'exceeded the maximum execution time of 30m0s') exits 1: '… (test-2-of-6) while 5 sibling(s) did … Only a recorded supersession excuses a missing shard here (#22653): test-2-of-6: killed by its own job timeout (\"The job has exceeded the maximum execution time of 30m0s — check run 101417030701\").' Run 38044009552 (Dogfood, dogfood 1/3 superseded beside 2/3 attested and the CLI leg attested) exits 0. Controls: 38021470264 exits 1 with #22606's words unchanged; 37984828810 exits 0. (4) Ablation from the committed state, via scripts/ablation-replace.mjs in WRAP mode plus an outer EXIT/INT/TERM trap running git checkout HEAD on the absolute path. In shardsNeedingCancelCause the matrix arm (attestedAny(leg)) became 'false /* ABLATION-22653 */', which drops the partial-path read and keeps the single-leg one. The tool reports anchor x1 to x0, replacement x0 to x1, blob 28d73901 to 9209511f. An on-disk grep inside the run counts the marker 1 and the original 0. Self-test: exit 1 with 29 failures, all #22653 cases; the #22606 and #16157 batteries stay green. Replay 38036705318 exits 1 (the false red back); 34007386254 exits 1; control 37984828810 exits 0. Restore: blob equals HEAD 28d73901 and git diff HEAD is empty. (5) node scripts/check-platform-checklist-watchdog.mjs --self-test: exit 0, 42 assertions. (6) ESLint, narrowed and measured: --format json lints 1 file with 0 errors. The file is in eslint's population (--print-config resolves a config for it). There is no parserOptions.project or projectService, so the lint is not type-aware and the diff cannot move any untouched file's verdict. ci.yml is not eslint-linted. (7) Control-byte scan of both files: clean (grep exit 1). No *.test.ts names check-shard-attestation.",
      "mcp_calls": "0 — none",
      "api_writes": "4 REST writes in 3 relay dispatches (POST /repos/objectstack-ai/objectstack/dispatches), all executed as objectstack-fleet[bot]. (1) pr_create, POST /repos/objectstack-ai/objectstack/pulls (draft forced), relay run 38055468085; body 14676 bytes sent and stored identical. (2) and (3) one label-write stroke, relay run 38055509358: POST /repos/objectstack-ai/objectstack/issues/22685/labels (skip-changeset) and POST /repos/objectstack-ai/objectstack/issues/22685/assignees (marchtian), both read back matching. (4) this os-dev-report comment via scripts/pm/post-stamped.mjs, POST /repos/objectstack-ai/objectstack/issues/22653/comments. git push x2 (the empty-branch write probe, then 036dfe5894) is not a REST write.",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: the next PR touching ci.yml dogfood-gate, or the contract-review-tier reviewer of #22685 · noted, not filed — dogfood-gate's permissions comment says the two reads pay for ONE question, about dogfood-verify, and its token comment says the token is read only on the cancelled-single-leg path. After #22685 both also serve a partially attested dogfood matrix. The claim forbids any other job, so it is not edited. Suggested wording is in PR #22685's Acceptance notes.",
        "carrier: the contract-review-tier reviewer of #22685 · noted, not filed — a real Actions job GITHUB_TOKEN doing the two reads from test-gate is NOT MEASURED. It rests on the documented permission ledger, as PR #22666 did, and a refusal reads red, never green.",
        "carrier: the contract-review-tier reviewer of #22685 · noted, not filed — the gate-only re-run edge, carried from PR #22666: whether attempts/N/jobs lists shards that were not re-run on that attempt is NOT MEASURED. If it does not, the gate fails closed (red)."
      ],
      "gates": {
        "node scripts/check-aggregator-roster.mjs": 0,
        "node scripts/check-aggregator-roster.mjs --self-test": 0,
        "node scripts/check-ci-filter-parity.mjs": 0,
        "node scripts/check-ci-filter-parity.mjs --self-test": 0,
        "node scripts/check-closing-keyword-parity.mjs": 0,
        "node scripts/check-closing-keyword-parity.mjs --self-test": 0,
        "node scripts/check-comment-mask-corpus.mjs": 0,
        "node scripts/check-declaration-mirrors.mjs": 0,
        "node scripts/check-declaration-mirrors.mjs --self-test": 0,
        "node scripts/check-dts-emitted.mjs --self-test": 0,
        "node scripts/check-position-name-fold-loaders.mjs": 0,
        "node scripts/check-position-name-fold-loaders.mjs --self-test": 0,
        "node scripts/check-scripts-symbol-anchors.mjs": 0,
        "node scripts/check-scripts-symbol-anchors.mjs --self-test": 0,
        "node scripts/check-self-test-wired.mjs": 0,
        "node scripts/check-self-test-wired.mjs --self-test": 0,
        "node scripts/check-self-test-workflow-commands.mjs": 0,
        "node scripts/check-self-test-workflow-commands.mjs --self-test": 0,
        "node scripts/check-step-collectors.mjs": 0,
        "node scripts/check-step-collectors.mjs --self-test": 0,
        "node scripts/check-whole-set-label-write.mjs": 0,
        "node scripts/check-whole-set-label-write.mjs --self-test": 0,
        "node scripts/ci/scheduled-full-run.mjs --self-test": 0,
        "node scripts/docs-audit/check-drift-comment.mjs": 0,
        "node scripts/pm/bare-root-worklist.mjs --self-test": 0,
        "node scripts/pm/ci-failure.mjs --self-test": 0,
        "pnpm check:agent-test-spelling": 0,
        "pnpm check:bash32-floor": 0,
        "pnpm check:cli-command-ids": 0,
        "pnpm check:console-injection": 0,
        "pnpm check:console-sha": 0,
        "pnpm check:cross-package-test-inputs": 0,
        "pnpm check:declared-population-live": 0,
        "pnpm check:driver-memory-census": 0,
        "pnpm check:dts-closure": 3,
        "pnpm check:dual-build-cjs-loads": 3,
        "pnpm check:entry-guard": 0,
        "pnpm check:gitlink-declared": 0,
        "pnpm check:lean-entry-closure": 3,
        "pnpm check:node-version": 0,
        "pnpm check:nul-bytes": 0,
        "pnpm check:parse-guard": 0,
        "pnpm check:pm-expected-skips": 0,
        "pnpm check:pm-post-stamped": 0,
        "pnpm check:pnpm-acquisition": 0,
        "pnpm check:pnpm-filter-targets": 0,
        "pnpm check:ratchet-remedy-authority": 0,
        "pnpm check:refd-timer-probe": 0,
        "pnpm check:required-contexts": 0,
        "pnpm check:shard-attestation": 0,
        "pnpm check:sourcemap-no-sources-content": 3,
        "pnpm check:stall-guard-budget": 0,
        "pnpm check:stall-guard-headroom": 0,
        "pnpm check:watch-hint-literal": 0,
        "pnpm check:workflow-status-functions": 0,
        "pnpm check:workflow-step-name-quoting": 0,
        "pnpm check:pm-dispatch-gates": 0,
        "node scripts/check-shard-attestation.mjs --self-test (owed, at 036dfe5894)": 0,
        "node scripts/check-platform-checklist-watchdog.mjs --self-test (owed, imports this module)": 0,
        "eslint --no-inline-config --format json scripts/check-shard-attestation.mjs (narrowed, 1 file, 0 errors)": 0,
        "node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran FILE (reconciliation)": 0
      },
      "line_budget": "n/a — no skills/** and no ratcheted ledger touched",
      "deviations": [
        "dogfood-gate's comments (permissions and token) now under-describe their use. They were not edited, because the claim and dispatch forbid any other job (stop on breach). They are recorded in the PR's Acceptance notes and out_of_scope_findings.",
        "The gate runner: a first spelling that passed each derived command through bash -c was refused by Claude Code's built-in removal safety check (it could not inspect the script; no removal was involved). It was re-run as a generated literal script with one line per command, containing no rm, each exit captured by redirect. The run passed the 10-minute foreground cap and the harness moved it to the background; it completed (exit 0) and every exit was read from its per-command result file.",
        "The live --verify replays reached the real API through this container's proxy credentials (NODE_USE_ENV_PROXY=1), not a job GITHUB_TOKEN. They prove the endpoints, shapes and verdicts, not the job token's permissions.",
        "The commit carries the AGENTS.md model-free trailer pair (Claude-Session plus Co-authored-by: Claude), not the harness reminder's model-named Co-Authored-By line: AGENTS.md takes precedence and the pre-push hook refuses a model identifier. The PR body ends with the AGENTS.md session-URL footer for the same reason.",
        "Clause-②: yes is copied verbatim from the claim and the ruling, with no arm. PR #22666 carried 'no (narrowing)'. This change turns measured false reds into passes and keeps every other red, so a reviewer may read it as widening; check-changeset-no-major reads 'yes' with no moved package as clean.",
        "GitHub reads beyond the card, all GET: #22606's card and comments; the PR #22666 merge commit (git); the Actions API for runs 38036705318, 34007386254, 38044009552, 38021470264 and 37984828810 (run, attempt-jobs and check-run annotations); one 60-run listing of cancelled ci.yml runs with their attempt-jobs lists, to find a dogfood partial; the replays' own reads; one check-runs read of the PR head; and the PR read-back.",
        "Worktree /home/user/objectstack-issue-22653 removed after the PR opened (node_modules first, then git worktree remove without --force; the tree was clean and the remote head equalled local). The report comment was posted from the shared checkout's scripts/pm/post-stamped.mjs, a read-only use at the same commit 243dd3c625."
      ],
      "files_changed": [
        ".github/workflows/ci.yml",
        "scripts/check-shard-attestation.mjs"
      ]
    }

    Generated by Claude Code

  9. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT — PR #22685 (head 036dfe5894)

    domain:devx seat 1 (seat post #6023) · marchtian · session_01Q7Fy4uVkvBWgj9CLihdATJ · 2026-10-10T13:37Z. Reviewed against GitHub, not against the report (6097969764). Ruling-ref: 6097061442.

    Landing: ready plus auto-merge once every check on the head is green.

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

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedomain:devxDomain lane — seat card indexed by label:pm:seatpriority:p1High: required for production / M2toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions