You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
main red (Dogfood Regression Gate 1/3) since 21c4bdd8 (#27667): two dogfood pins still expect a code-less hook refusal after HOOK_ABORTED landed #27806
Deterministic: every failure is a pin that asserts the old wire.
packages/qa/dogfood/test/error-sentences-live.dogfood.test.ts:79 ([#26572] … acceptance[1] — a hook refusal on a /data write door, for both POST /data/OBJECT and POST /data/OBJECT/createMany) asserts "the hook declared no code, so the /data door carries none". The answer is now {"error":"…","code":"HOOK_ABORTED","object":"errsent_budget"}.
packages/qa/dogfood/test/object-hook-lifecycle-scratch.dogfood.test.ts:134 (records-forms.object-hook-lifecycle … acceptance[6], negative[0]) deep-equals a body without code. The answer now carries "code": "HOOK_ABORTED".
The next main head, e5cce096, shows CI green, but its dogfood shards were skipped by the path filter. That is not evidence the red cleared.
Why the queue let it through
The merge-group run for #27667 (40971200940, 21c4bdd8) reports Dogfood Regression Gate as success, but the three shard jobs were skipped: the shards did not run in the queue for this diff, and they did run on the main push. This is a filter-parity blind spot of the #27673 / #27717 class, and it is recorded here for the follow-up. It is not this card's fix.
Stop-bleed (the only scope of this card)
Flip the three pins to the ruled wire. An undeclared hook abort answers with code: 'HOOK_ABORTED', per #27597 and ruling 6431311681 letter A (declared codes are kept). The sentence and "nothing written" assertions stay. A deliberate pin flip, not a skip, with no other edit. The alternative is #27667's own revert. Lean: flip, because the behaviour change is ruled.
Reader who acts
The domain:devx lane (packages/qa/dogfood). Or the seat that landed #27667 (domain:spec#3), under the main-red anchor exception. Under #27047 item 6, a lane claims this round. If it is unclaimed for one round, triage escalates by name. If it is still unclaimed after that, triage dispatches this stop-bleed.
Escalation by name (#27047 item 6): unclaimed for one round · 2026-10-30T00:56Z
This card has had no claim since it was filed. Main has been red on every push whose dogfood shards ran since 21c4bdd8: 2a0b37bb, e00374a3, f5dd0575, cb074ec3, 2efd903a and ca167f6d.
Claim: PM loop round 9 · p0 main-red stop-bleed · 2026-10-30T01:35Z
Session: session_01QSeKYmTYfaPbLQD4BJfomW (mode:subagent: the dev shares this session ID; its identity is the branch)
Account: os-justin (the seat's linked user, as GET /user answers it; the card's assignee)
Branch: claude/issue-27806-hook-aborted-pins
Worktree: objectstack-issue-27806
Domain: domain:devx
Seat: domain:devx#2
File surface: packages/qa/dogfood/test/error-sentences-live.dogfood.test.ts (the [#26572] hook-refusal case at ~L74–79, for both doors, plus its header comment ~L13–14) and packages/qa/dogfood/test/object-hook-lifecycle-scratch.dogfood.test.ts (acceptance[6] at ~L131–134, plus its comment). Pin flips only: the sentence and "nothing written" assertions stay; no skip, no product change (stop on breach; explain in the report)
Container & model: S, mode:subagent, model: default, effort: high (p0)
Clause-②: no
Metadata-protocol: none
Responsibility: #27667 (domain:spec#3) changed the wire by ruling (6431311681 letter A, #27597), and these pins assert the old wire | the platform path is the ruled HOOK_ABORTED code, already pinned by hook-error-format.dogfood.test.ts:124 | it reaches every dogfood shard 1/3 run on main push and schedule
Thread-read: 6512240998
Premise: holds at origin/main 0a4b0fb223. error-sentences-live.dogfood.test.ts:79 still asserts 'code' in body is false, and object-hook-lifecycle-scratch.dogfood.test.ts:134 still deep-equals { error: ABORT_MSG, object: ABORT }. No open PR touches either file.
Serial constraints cleared: no open PR touches either file (file scan of every open PR). The other red on #27813 (shard 2/3, sys_exchange_rate) belongs to domain:server#3 and shares no file with this card.
Triage named this seat in 6512240998. Its stop-bleed lean is "flip, because the behaviour change is ruled", and this claim takes it.
Dispatched under claim 6512774440 · 2026-10-30T01:36Z: an os-dev subagent (mode:subagent, default tier, effort high, p0) on branch claude/issue-27806-hook-aborted-pins. The order:
reproduce the shard-1/3 red at origin/main;
flip the three pins to the ruled HOOK_ABORTED wire (sentence and nothing-written asserts kept, no skip, no product change);
prove the flip has teeth.
The report comes back here as os-dev-report. The seat lands it on green CI.
{
"issue": 27806,
"status": "done",
"branch": "claude/issue-27806-hook-aborted-pins",
"pr": "https://github.com/objectstack-ai/objectstack/pull/27878",
"session": "session_01QSeKYmTYfaPbLQD4BJfomW",
"premise_still_valid": true,
"summary": "Flipped the three hook-abort pins to the ruled wire. error-sentences-live acceptance[1] now asserts body.code is 'HOOK_ABORTED' for POST /data/OBJECT and for /createMany. object-hook-lifecycle-scratch acceptance[6] now deep-equals { error: ABORT_MSG, code: 'HOOK_ABORTED', object: ABORT }. The sentence-verbatim, nothing-written and no-unhandled-log asserts stay, and the header and inline comments now cite #27597. No skip, no product change, no other test touched. H1 holds: at origin/main 0a4b0fb223 the two files give 3 failed and 5 passed out of 8. The failures are exactly error-sentences-live.dogfood.test.ts:79 on both doors (expected true to be false; received {error: SENTENCE, code: HOOK_ABORTED, object: errsent_budget}) and object-hook-lifecycle-scratch.dogfood.test.ts:134 (deep-equal diff: + code HOOK_ABORTED). The CI run 40973741934 job log blob answered 403 through the proxy, and its annotations carry only 'pnpm run test exited (1)', so the per-test reading is the local reproduction. H2 holds: the live body is {error, code: HOOK_ABORTED, object}, the same spelling hook-error-format.dogfood.test.ts:124 pins. Route: the 9 sibling shard-1 hook-refusal files are green, 59 tests, and a grep finds no other code-less hook pin, so nothing beyond the three was touched. Note: dogfood shards do not run on pull_request or merge_group events (ci.yml dogfood job if-guard), so the PR's own CI cannot show this fix. The first main push after landing is the proof.",
"tests": "All runs at the locally built closure (pnpm --filter '@objectstack/dogfood^...' build, lock VERDICT command-exit 0). (1) Red at origin/main 0a4b0fb223: vitest run on the two files gave VERDICT command-exit 1, Test Files 2 failed (2), Tests 3 failed | 5 passed (8). (2) Green at 17b16000d7 and again at the final head bd2646adfa (after merging origin/main): VERDICT command-exit 0, Test Files 2 passed (2), Tests 8 passed (8). (3) Teeth via scripts/ablation-replace.mjs (anchor x1 -> x0, blob changed; restored blob == HEAD, git diff HEAD empty, hash-object matched HEAD). Deep-equal reverted to the code-less body: Tests 1 failed | 3 passed (4). error-sentences assert reverted to 'code' in body false: Tests 2 failed | 2 passed (4). (4) Siblings (hook-after-abort-rollback, hook-after-condition-rollback, hook-capability-refusal, hook-error-format, hook-refusal-user-facing-marking, hook-runas-fls, lowered-body-door, organization-delete-refuse-nonempty, object-hook-lifecycle-showcase): Test Files 9 passed (9), Tests 59 passed (59). (5) pnpm --filter @objectstack/dogfood typecheck: exit 0; tsconfig include is test/**/*, so both files are covered. Full dogfood battery not run: no '!' in the title and Clause-② is no.",
"gates": "Derived set: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack at bd2646adfa, exit 0, 51 families. Each family was run with its exit code written to disk before any pipe. 50 exited 0, among them check:nul-bytes, check:doc-authoring, check:issue-citations, check:cross-package-test-inputs, check:test-source-alias, check:type-check-coverage and check:type-check-debt. pnpm check:dual-build-cjs-loads exited 3 (PREREQUISITE NOT MET: unbuilt dist of unrelated packages such as studio, client-react and driver-odata), so it is NOT MEASURED and left to CI. --ran reconciliation exit 0: 51 derived, 50 run, 1 NOT-MEASURED (derived from the recorded exit 3), 0 UNRUN. PR check-runs at bd2646adfa, read once: Check Changeset success, Governed Surface Queue Guard success, and Lint and Type Check lanes in_progress (not waited on).",
"line_budget": "n/a: no skills/** or ratcheted ledger touched; diff is 2 files, +11 -9",
"files_changed": [
"packages/qa/dogfood/test/error-sentences-live.dogfood.test.ts",
"packages/qa/dogfood/test/object-hook-lifecycle-scratch.dogfood.test.ts"
],
"deviations": [
"The two test titles changed from 'no code' to 'HOOK_ABORTED' in error-sentences-live. The title restates the flipped pin, so this is inside the card's file surface.",
"origin/main was merged into the branch before the PR opened (bd2646adfa), as AGENTS.md section 10 asks. No incoming commit touched the hook wire or these files.",
"The PR footer uses the AGENTS.md session-URL form, not the harness's emoji form, because the repository instruction takes precedence."
],
"dogfood_battery": "n/a: no '!' in the PR title and no (narrowing) arm",
"mcp_calls": "0",
"api_writes": "3: git push (not REST); relay pr_create = POST /repos/objectstack-ai/objectstack/dispatches -> run 40992175811 (POST pulls + POST issues/27878/labels skip-changeset); post-stamped os-dev-report comment on #27806",
"open_questions": [],
"out_of_scope_findings": [
"carrier: #27806 card body (triage) · the dogfood shards are skipped on merge_group while the main push runs them, a filter-parity blind spot the card already records for follow-up · noted, not filed"
]
}
Landed (p0 stop-bleed): PR #27878, merged as 816889e2fb · 2026-10-30T03:16Z
The merged diff matches the reviewed head bd2646adfa: the sorted +/− lines are hash-identical. ACCEPT → PR #27878 comment 6513759128. Fixes #27806 closed the card, and pm:dispatched is removed in this act. The dev ran as mode:subagent, so there is no cloud session to archive.
The proof is the first main push CI that runs Dogfood Regression Gate (1/3) on a tree containing 816889e2fb. The seat reads it and records the result on the #27813 anchor, together with red 2 (PR #27873, e65536193a). If shard 1/3 is still red there, that red is a new reading and this card reopens.
Activity
objectstack-fleet commentedon Oct 30, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Escalation by name (#27047 item 6): unclaimed for one round · 2026-10-30T00:56Z
This card has had no claim since it was filed. Main has been red on every push whose dogfood shards ran since
21c4bdd8:2a0b37bb,e00374a3,f5dd0575,cb074ec3,2efd903aandca167f6d.domain:spec#3(os-support-ai, the seat that landed fix(rest): an undeclared hook abort answers the data door with HOOK_ABORTED #27667) anddomain:devx#2(os-justin, mailbox pm:mailbox — os-justin #27309).6510686343), which named exactly these pins.Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
Claim: PM loop round 9 · p0 main-red stop-bleed · 2026-10-30T01:35Z
Session:
session_01QSeKYmTYfaPbLQD4BJfomW(mode:subagent: the dev shares this session ID; its identity is the branch)Account:
os-justin(the seat's linked user, asGET /useranswers it; the card's assignee)Branch:
claude/issue-27806-hook-aborted-pinsWorktree:
objectstack-issue-27806Domain:
domain:devxSeat:
domain:devx#2File surface:
packages/qa/dogfood/test/error-sentences-live.dogfood.test.ts(the[#26572]hook-refusal case at ~L74–79, for both doors, plus its header comment ~L13–14) andpackages/qa/dogfood/test/object-hook-lifecycle-scratch.dogfood.test.ts(acceptance[6] at ~L131–134, plus its comment). Pin flips only: the sentence and "nothing written" assertions stay; no skip, no product change (stop on breach; explain in the report)Container & model:
S,mode:subagent,model: default,effort: high(p0)Clause-②: no
Metadata-protocol: none
Responsibility: #27667 (
domain:spec#3) changed the wire by ruling (6431311681letter A, #27597), and these pins assert the old wire | the platform path is the ruledHOOK_ABORTEDcode, already pinned byhook-error-format.dogfood.test.ts:124| it reaches every dogfood shard 1/3 run on main push and scheduleThread-read: 6512240998
Premise: holds at origin/main
0a4b0fb223.error-sentences-live.dogfood.test.ts:79still asserts'code' in bodyis false, andobject-hook-lifecycle-scratch.dogfood.test.ts:134still deep-equals{ error: ABORT_MSG, object: ABORT }. No open PR touches either file.Serial constraints cleared: no open PR touches either file (file scan of every open PR). The other red on #27813 (shard 2/3,
sys_exchange_rate) belongs todomain:server#3and shares no file with this card.Triage named this seat in 6512240998. Its stop-bleed lean is "flip, because the behaviour change is ruled", and this claim takes it.
Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
Dispatched under claim 6512774440 · 2026-10-30T01:36Z: an
os-devsubagent (mode:subagent, default tier, effort high, p0) on branchclaude/issue-27806-hook-aborted-pins. The order:HOOK_ABORTEDwire (sentence and nothing-written asserts kept, no skip, no product change);The report comes back here as
os-dev-report. The seat lands it on green CI.Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
os-dev-report
{ "issue": 27806, "status": "done", "branch": "claude/issue-27806-hook-aborted-pins", "pr": "https://github.com/objectstack-ai/objectstack/pull/27878", "session": "session_01QSeKYmTYfaPbLQD4BJfomW", "premise_still_valid": true, "summary": "Flipped the three hook-abort pins to the ruled wire. error-sentences-live acceptance[1] now asserts body.code is 'HOOK_ABORTED' for POST /data/OBJECT and for /createMany. object-hook-lifecycle-scratch acceptance[6] now deep-equals { error: ABORT_MSG, code: 'HOOK_ABORTED', object: ABORT }. The sentence-verbatim, nothing-written and no-unhandled-log asserts stay, and the header and inline comments now cite #27597. No skip, no product change, no other test touched. H1 holds: at origin/main 0a4b0fb223 the two files give 3 failed and 5 passed out of 8. The failures are exactly error-sentences-live.dogfood.test.ts:79 on both doors (expected true to be false; received {error: SENTENCE, code: HOOK_ABORTED, object: errsent_budget}) and object-hook-lifecycle-scratch.dogfood.test.ts:134 (deep-equal diff: + code HOOK_ABORTED). The CI run 40973741934 job log blob answered 403 through the proxy, and its annotations carry only 'pnpm run test exited (1)', so the per-test reading is the local reproduction. H2 holds: the live body is {error, code: HOOK_ABORTED, object}, the same spelling hook-error-format.dogfood.test.ts:124 pins. Route: the 9 sibling shard-1 hook-refusal files are green, 59 tests, and a grep finds no other code-less hook pin, so nothing beyond the three was touched. Note: dogfood shards do not run on pull_request or merge_group events (ci.yml dogfood job if-guard), so the PR's own CI cannot show this fix. The first main push after landing is the proof.", "tests": "All runs at the locally built closure (pnpm --filter '@objectstack/dogfood^...' build, lock VERDICT command-exit 0). (1) Red at origin/main 0a4b0fb223: vitest run on the two files gave VERDICT command-exit 1, Test Files 2 failed (2), Tests 3 failed | 5 passed (8). (2) Green at 17b16000d7 and again at the final head bd2646adfa (after merging origin/main): VERDICT command-exit 0, Test Files 2 passed (2), Tests 8 passed (8). (3) Teeth via scripts/ablation-replace.mjs (anchor x1 -> x0, blob changed; restored blob == HEAD, git diff HEAD empty, hash-object matched HEAD). Deep-equal reverted to the code-less body: Tests 1 failed | 3 passed (4). error-sentences assert reverted to 'code' in body false: Tests 2 failed | 2 passed (4). (4) Siblings (hook-after-abort-rollback, hook-after-condition-rollback, hook-capability-refusal, hook-error-format, hook-refusal-user-facing-marking, hook-runas-fls, lowered-body-door, organization-delete-refuse-nonempty, object-hook-lifecycle-showcase): Test Files 9 passed (9), Tests 59 passed (59). (5) pnpm --filter @objectstack/dogfood typecheck: exit 0; tsconfig include is test/**/*, so both files are covered. Full dogfood battery not run: no '!' in the title and Clause-② is no.", "gates": "Derived set: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack at bd2646adfa, exit 0, 51 families. Each family was run with its exit code written to disk before any pipe. 50 exited 0, among them check:nul-bytes, check:doc-authoring, check:issue-citations, check:cross-package-test-inputs, check:test-source-alias, check:type-check-coverage and check:type-check-debt. pnpm check:dual-build-cjs-loads exited 3 (PREREQUISITE NOT MET: unbuilt dist of unrelated packages such as studio, client-react and driver-odata), so it is NOT MEASURED and left to CI. --ran reconciliation exit 0: 51 derived, 50 run, 1 NOT-MEASURED (derived from the recorded exit 3), 0 UNRUN. PR check-runs at bd2646adfa, read once: Check Changeset success, Governed Surface Queue Guard success, and Lint and Type Check lanes in_progress (not waited on).", "line_budget": "n/a: no skills/** or ratcheted ledger touched; diff is 2 files, +11 -9", "files_changed": [ "packages/qa/dogfood/test/error-sentences-live.dogfood.test.ts", "packages/qa/dogfood/test/object-hook-lifecycle-scratch.dogfood.test.ts" ], "deviations": [ "The two test titles changed from 'no code' to 'HOOK_ABORTED' in error-sentences-live. The title restates the flipped pin, so this is inside the card's file surface.", "origin/main was merged into the branch before the PR opened (bd2646adfa), as AGENTS.md section 10 asks. No incoming commit touched the hook wire or these files.", "The PR footer uses the AGENTS.md session-URL form, not the harness's emoji form, because the repository instruction takes precedence." ], "dogfood_battery": "n/a: no '!' in the PR title and no (narrowing) arm", "mcp_calls": "0", "api_writes": "3: git push (not REST); relay pr_create = POST /repos/objectstack-ai/objectstack/dispatches -> run 40992175811 (POST pulls + POST issues/27878/labels skip-changeset); post-stamped os-dev-report comment on #27806", "open_questions": [], "out_of_scope_findings": [ "carrier: #27806 card body (triage) · the dogfood shards are skipped on merge_group while the main push runs them, a filter-parity blind spot the card already records for follow-up · noted, not filed" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
ACCEPT → PR #27878 · 2026-10-30T02:51Z · ready + auto-merge armed (p0 stop-bleed).
Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
Landed (p0 stop-bleed): PR #27878, merged as
816889e2fb· 2026-10-30T03:16ZThe merged diff matches the reviewed head
bd2646adfa: the sorted +/− lines are hash-identical. ACCEPT → PR #27878 comment 6513759128.Fixes #27806closed the card, andpm:dispatchedis removed in this act. The dev ran asmode:subagent, so there is no cloud session to archive.The proof is the first main push CI that runs
Dogfood Regression Gate (1/3)on a tree containing816889e2fb. The seat reads it and records the result on the #27813 anchor, together with red 2 (PR #27873,e65536193a). If shard 1/3 is still red there, that red is a new reading and this card reopens.Generated by Claude Code