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
spec: refuse a declared webhook whose requires cannot dispatch it — STACK_WEBHOOK_CAPABILITY_REQUIRED in defineStack, the third declared-capability refusal (ruling A on #24910; ships in 18.x by the maintainer's re-timing) #24997
Filing gate ③ — the maintainer's 「同意」 on ruling A of #24910 (batch #379 item 4, the director's chat, 2026-10-20), re-timed by the maintainer's word in the same chat, 「暂时不考虑 v19,协议的调整原则上也是尽快,不考虑退役版本。」 (recorded on #24910 as 6303859748, and pointed to under 「甲」 on #6015 as 6303865025): the refusal ships now, in 18.x. Filed by the director seat (summon #45 continuation 2, session_01Lg6GQ4xjqmvEzYv78d6H7i); re-timed in the same act. ⛔ Not a claim.
Reader who acts: the domain:spec seat. One PR with a BREAKING changeset (Clause-②: no (narrowing), the #24813 shape: BREAKING banner, adr-0087: not-required), contract review at CONTRACT_REVIEW_TIER. #24910 is pm:blocked on this card and closes when it lands. The separate 18.x warning card #24995 is closed as superseded: the refusal is the loud half.
Dedupe: the 19 open domain:spec cards' titles read in this act: 0 name a webhook, a capability or requires; #24910's own dedupe (626 newest issues) found 0.
A scaffolded 18.0.0-shaped project with a declared webhook and requires: ['automation', 'triggers'] is refused at os validate, os build and os dev with STACK_WEBHOOK_CAPABILITY_REQUIRED, naming the webhook and the missing tokens; with ['automation', 'triggers', 'webhooks', 'realtime'] it loads (the CONTROL).
The three arms (no webhooks, no realtime, both missing) pinned; ablation red.
Changeset with the BREAKING banner; content/docs/automation/webhooks.mdx §3.0 says "refused", naming the two tokens.
Related
#24910 (the ruled card; 6303779439 and its amendment 6303859748) · #24995 (superseded warning card, closed) · #20332 (validateTriggerCapability) · #24813 (narrowing changeset precedent) · #60156292005854 (「甲」) and 6303865025 (its amendment).
changed the title [-]spec: refuse a declared webhook whose `requires` cannot dispatch it — `STACK_WEBHOOK_CAPABILITY_REQUIRED` in `defineStack`, the third declared-capability refusal (ruling A on #24910; 19.0 under 「甲」 rule 2)[/-][+]spec: refuse a declared webhook whose `requires` cannot dispatch it — `STACK_WEBHOOK_CAPABILITY_REQUIRED` in `defineStack`, the third declared-capability refusal (ruling A on #24910; ships in 18.x by the maintainer's re-timing)[/+]on Oct 20, 2026
Claim: PM loop round 26
Session: session_01D6F9axfoPzR7t8G1J7Ytzz
Account: baozhoutao (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-24997-webhook-capability-required
Worktree: objectstack-issue-24997
Domain: domain:spec
Seat: domain:spec#3 (seat post #18883)
File surface (at origin/main3b3830ca22 or later; stop on a breach and explain it in the report): packages/spec/src/stack.zod.ts (defineStack refuses a declared webhook whose requires lacks webhooks or realtime, one code STACK_WEBHOOK_CAPABILITY_REQUIRED beside STACK_TRIGGER_CAPABILITY_REQUIRED), packages/spec/src/api/error-code-ledger.zod.ts, the doors that load a stack where they need a pin, the example apps' requires, the dogfood webhook-materialization-fixture.ts (converted or declared, not deleted), content/docs/automation/webhooks.mdx §3.0, tests, generated artifacts and .changeset/24997-*.md.
Container & model: M, mode:subagent, model: default (no path-derived mandate)
Clause-②: no (narrowing: a stack declaring a webhook without the capability tokens is refused; ships now under the amended 「甲」, #60156303865025)
Responsibility: ruled A on #24910 (6303859748)
Thread-read: none
Serial constraints cleared: read at this act; the dev re-checks open PRs touching stack.zod.ts before opening its own. The PR owes a CONTRACT_REVIEW_TIER contract review.
Read on origin/main3b3830ca22 at 2026-10-21T03:09Z: STACK_TRIGGER_CAPABILITY_REQUIRED exists at stack.zod.ts (#20332); no webhook arm.
os-dev-report
{
"issue": 24997,
"status": "done",
"branch": "claude/issue-24997-webhook-capability-required",
"pr": "#25057",
"session": "session_01D6F9axfoPzR7t8G1J7Ytzz (resumed after a container restart; the earlier run of this seat opened the PR)",
"premise_still_valid": true,
"summary": "defineStack refuses a stack that declares a webhook while requires lacks 'webhooks', 'realtime' or both, with one code STACK_WEBHOOK_CAPABILITY_REQUIRED (status 422, StackRefusalError envelope), registered in the error-code ledger; docs section 3.0 says refused; BREAKING changeset with Clause-2 no (narrowing) and the adr-0087 not-required marker. This resume found two things the earlier run left behind and fixed both: (1) CI on 07aeabc was red on 'Type Check / source gates' because content/docs/references/api/automation-api.mdx, a page added on main by the FlowInnerRefusal work, lists every error code and was missing the new one. Merged origin/main 63085c3, reproduced the red locally (check:generated: check:docs stale), regenerated with --fix (1 of 14 artifacts), commit e69078f. (2) packages/qa/dogfood/test/webhook-meta-door-credential-redaction.dogfood.test.ts, which landed on main after the branch was cut, declares a webhook with no requires and threw STACK_WEBHOOK_CAPABILITY_REQUIRED at import. The PR's dogfood shards are skipped, so this would only have shown up on main's full battery. It now uses strict: false, with a docblock saying why: its 'without plugin-webhooks' composition is what the redactor pins need, and declaring the pair would make bootStack mount the plugin. This is the same choice as webhook-materialization-fixture. Commit 779ed23. A fresh producer search on the new head found no other producer.",
"tests": "All at head 779ed23 unless noted. spec: check:generated 'All 14 generated artifacts are up to date' + test 706/706 files, 21446 passed / 1 todo (VERDICT command-exit 0, at e69078f; 779ed23 only adds a dogfood test file). spec typecheck: tsc --noEmit + check:scripts-typecheck + check:test-typecheck OK; test:repo 72 files / 1237 tests passed (VERDICT command-exit 0, at e69078f). dogfood: webhook-materialization + wall-declared-webhook-deployment-wide + webhook-meta-door-credential-redaction: 3 files / 24 tests passed (VERDICT command-exit 0). Before the fix the redaction file failed at import with StackWebhookCapabilityRequiredError. eslint --no-inline-config --format json over the 8 touched .ts files: 8 files, 0 errors, 0 warnings. eslint.config.mjs enables no type-aware linting, so the untouched files cannot change verdict; repo-wide pnpm lint is left to CI. dispatch-gates --commands at 779ed23: 116 families, the same set as at e69078f, which adds spec check:generated to the earlier run's list. All 116 run with recorded exit codes, all exit 0 (ran at e69078f). check:cross-package-test-inputs, check:nul-bytes and check:test-source-alias were re-run at 779ed23: exit 0. dispatch-gates --ran: '116 derived, 116 run, 0 NOT-MEASURED (a DERIVED zero)'. The ablation (red, 18 failed / 76 passed with the call removed, restore proven by HEAD blob 3d8624dc4fa1) and the door measurements (os validate / os build / os dev refused; CONTROL loads) come from the earlier run, are recorded in the PR body, and were not re-run. cli unit layer: the earlier run's reading (313/316, then the 3 dts-dependent files 42/42 after a declaration build); this diff touches no cli file, and the integration layer is left to CI. CI at 779ed23: in_progress (27 success, 7 in_progress, 6 skipped at the last read). The one red on the previous head 07aeabc (Type Check / source gates, generated reference docs) is fixed by e69078f. Full dogfood suite: NOT MEASURED, reason: main-only full battery; only the webhook-declaring files were run.",
"mcp_calls": "0",
"api_writes": "1 in this resume: POST /repos//issues/24997/comments (this report, via post-stamped through the fleet-write relay). git push x2 is not a REST write. Earlier run of this seat: 1 pr_create via the relay (PR 25057).",
"open_questions": [
{
"question": "The resume instruction asks that the PR body start with 'Closes #24997'. It starts with 'Fixes #24997'. The os-dev contract says a dev writes the PR body once and never PATCHes it, so I left it unchanged. Both keywords close the card on merge. Should the seat rewrite it?",
"options": ["A: leave 'Fixes #24997'. It already closes the card, and the Clause-2 line is on line 5, copied from the claim.", "B: the seat PATCHes line 1 to 'Closes #24997' and adds two Verification bullets (see the next item)"],
"recommendation": "B if the seat wants the body current; the PATCH is cosmetic for line 1 and useful for the two new bullets."
},
{
"question": "Two PR-body updates the seat may want to write, since a dev does not PATCH: under 'Producers measured and fixed', add a row for packages/qa/dogfood/test/webhook-meta-door-credential-redaction.dogfood.test.ts (yes / absent / declared via strict: false, commit 779ed23). Under 'Verification', add: merged origin/main 63085c3; automation-api.mdx regenerated, commit e69078f; readings at 779ed23 as in this report's tests field.",
"options": ["A: the seat writes them", "B: leave the body as is; this report comment carries the readings"],
"recommendation": "A, because reviewers read the body, and the redaction fixture is a second declared-not-converted case the contract review should see."
}
],
"out_of_scope_findings": [
"carrier: none (noted, not filed). The PR's own CI does not run the full dogfood suite (the 'Dogfood Regression Gate (shard/3)' jobs are skipped on PRs), so a defineStack narrowing that breaks a dogfood fixture added to main after the branch point only shows up on main's full battery. This is by design (two speeds, ruling record 6120820653), so it is not a defect. Dedupe words: dogfood shard skipped PR, defineStack narrowing dogfood fixture, full battery main-only."
]
}
Patch-id verified: the merged commit's patch-id equals the reviewed head 779ed238e5 (555b879f90).
Contract review: PASS, record 6310101862 on the PR.
What shipped: defineStack refuses a stack that declares a webhook while requires lacks webhooks, realtime or both, with one code, STACK_WEBHOOK_CAPABILITY_REQUIRED (422), at every door that loads a stack.
Activity
[-]spec: refuse a declared webhook whose `requires` cannot dispatch it — `STACK_WEBHOOK_CAPABILITY_REQUIRED` in `defineStack`, the third declared-capability refusal (ruling A on #24910; 19.0 under 「甲」 rule 2)[/-][+]spec: refuse a declared webhook whose `requires` cannot dispatch it — `STACK_WEBHOOK_CAPABILITY_REQUIRED` in `defineStack`, the third declared-capability refusal (ruling A on #24910; ships in 18.x by the maintainer's re-timing)[/+]objectstack-fleet commentedon Oct 21, 2026
Claim: PM loop round 26
Session:
session_01D6F9axfoPzR7t8G1J7YtzzAccount:
baozhoutao(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-24997-webhook-capability-requiredWorktree:
objectstack-issue-24997Domain:
domain:specSeat:
domain:spec#3(seat post #18883)File surface (at
origin/main3b3830ca22or later; stop on a breach and explain it in the report):packages/spec/src/stack.zod.ts(defineStackrefuses a declared webhook whoserequireslackswebhooksorrealtime, one codeSTACK_WEBHOOK_CAPABILITY_REQUIREDbesideSTACK_TRIGGER_CAPABILITY_REQUIRED),packages/spec/src/api/error-code-ledger.zod.ts, the doors that load a stack where they need a pin, the example apps'requires, the dogfoodwebhook-materialization-fixture.ts(converted or declared, not deleted),content/docs/automation/webhooks.mdx§3.0, tests, generated artifacts and.changeset/24997-*.md.Container & model:
M,mode:subagent,model: default (no path-derived mandate)Clause-②: no (narrowing: a stack declaring a webhook without the capability tokens is refused; ships now under the amended 「甲」, #6015
6303865025)Responsibility:
ruled A on #24910 (6303859748)Thread-read: none
Serial constraints cleared: read at this act; the dev re-checks open PRs touching
stack.zod.tsbefore opening its own. The PR owes aCONTRACT_REVIEW_TIERcontract review.Read on
origin/main3b3830ca22at 2026-10-21T03:09Z:STACK_TRIGGER_CAPABILITY_REQUIREDexists atstack.zod.ts(#20332); no webhook arm.Generated by Claude Code
objectstack-fleet commentedon Oct 21, 2026
os-dev-report
{
"issue": 24997,
"status": "done",
"branch": "claude/issue-24997-webhook-capability-required",
"pr": "#25057",
"session": "session_01D6F9axfoPzR7t8G1J7Ytzz (resumed after a container restart; the earlier run of this seat opened the PR)",
"premise_still_valid": true,
"summary": "defineStack refuses a stack that declares a webhook while requires lacks 'webhooks', 'realtime' or both, with one code STACK_WEBHOOK_CAPABILITY_REQUIRED (status 422, StackRefusalError envelope), registered in the error-code ledger; docs section 3.0 says refused; BREAKING changeset with Clause-2 no (narrowing) and the adr-0087 not-required marker. This resume found two things the earlier run left behind and fixed both: (1) CI on 07aeabc was red on 'Type Check / source gates' because content/docs/references/api/automation-api.mdx, a page added on main by the FlowInnerRefusal work, lists every error code and was missing the new one. Merged origin/main 63085c3, reproduced the red locally (check:generated: check:docs stale), regenerated with --fix (1 of 14 artifacts), commit e69078f. (2) packages/qa/dogfood/test/webhook-meta-door-credential-redaction.dogfood.test.ts, which landed on main after the branch was cut, declares a webhook with no requires and threw STACK_WEBHOOK_CAPABILITY_REQUIRED at import. The PR's dogfood shards are skipped, so this would only have shown up on main's full battery. It now uses strict: false, with a docblock saying why: its 'without plugin-webhooks' composition is what the redactor pins need, and declaring the pair would make bootStack mount the plugin. This is the same choice as webhook-materialization-fixture. Commit 779ed23. A fresh producer search on the new head found no other producer.",
"tests": "All at head 779ed23 unless noted. spec: check:generated 'All 14 generated artifacts are up to date' + test 706/706 files, 21446 passed / 1 todo (VERDICT command-exit 0, at e69078f; 779ed23 only adds a dogfood test file). spec typecheck: tsc --noEmit + check:scripts-typecheck + check:test-typecheck OK; test:repo 72 files / 1237 tests passed (VERDICT command-exit 0, at e69078f). dogfood: webhook-materialization + wall-declared-webhook-deployment-wide + webhook-meta-door-credential-redaction: 3 files / 24 tests passed (VERDICT command-exit 0). Before the fix the redaction file failed at import with StackWebhookCapabilityRequiredError. eslint --no-inline-config --format json over the 8 touched .ts files: 8 files, 0 errors, 0 warnings. eslint.config.mjs enables no type-aware linting, so the untouched files cannot change verdict; repo-wide pnpm lint is left to CI. dispatch-gates --commands at 779ed23: 116 families, the same set as at e69078f, which adds spec check:generated to the earlier run's list. All 116 run with recorded exit codes, all exit 0 (ran at e69078f). check:cross-package-test-inputs, check:nul-bytes and check:test-source-alias were re-run at 779ed23: exit 0. dispatch-gates --ran: '116 derived, 116 run, 0 NOT-MEASURED (a DERIVED zero)'. The ablation (red, 18 failed / 76 passed with the call removed, restore proven by HEAD blob 3d8624dc4fa1) and the door measurements (os validate / os build / os dev refused; CONTROL loads) come from the earlier run, are recorded in the PR body, and were not re-run. cli unit layer: the earlier run's reading (313/316, then the 3 dts-dependent files 42/42 after a declaration build); this diff touches no cli file, and the integration layer is left to CI. CI at 779ed23: in_progress (27 success, 7 in_progress, 6 skipped at the last read). The one red on the previous head 07aeabc (Type Check / source gates, generated reference docs) is fixed by e69078f. Full dogfood suite: NOT MEASURED, reason: main-only full battery; only the webhook-declaring files were run.",
"mcp_calls": "0",
"api_writes": "1 in this resume: POST /repos//issues/24997/comments (this report, via post-stamped through the fleet-write relay). git push x2 is not a REST write. Earlier run of this seat: 1 pr_create via the relay (PR 25057).",
"open_questions": [
{
"question": "The resume instruction asks that the PR body start with 'Closes #24997'. It starts with 'Fixes #24997'. The os-dev contract says a dev writes the PR body once and never PATCHes it, so I left it unchanged. Both keywords close the card on merge. Should the seat rewrite it?",
"options": ["A: leave 'Fixes #24997'. It already closes the card, and the Clause-2 line is on line 5, copied from the claim.", "B: the seat PATCHes line 1 to 'Closes #24997' and adds two Verification bullets (see the next item)"],
"recommendation": "B if the seat wants the body current; the PATCH is cosmetic for line 1 and useful for the two new bullets."
},
{
"question": "Two PR-body updates the seat may want to write, since a dev does not PATCH: under 'Producers measured and fixed', add a row for packages/qa/dogfood/test/webhook-meta-door-credential-redaction.dogfood.test.ts (yes / absent / declared via strict: false, commit 779ed23). Under 'Verification', add: merged origin/main 63085c3; automation-api.mdx regenerated, commit e69078f; readings at 779ed23 as in this report's tests field.",
"options": ["A: the seat writes them", "B: leave the body as is; this report comment carries the readings"],
"recommendation": "A, because reviewers read the body, and the redaction fixture is a second declared-not-converted case the contract review should see."
}
],
"out_of_scope_findings": [
"carrier: none (noted, not filed). The PR's own CI does not run the full dogfood suite (the 'Dogfood Regression Gate (shard/3)' jobs are skipped on PRs), so a defineStack narrowing that breaks a dogfood fixture added to main after the branch point only shows up on main's full battery. This is by design (two speeds, ruling record 6120820653), so it is not a defect. Dedupe words: dogfood shard skipped PR, defineStack narrowing dogfood fixture, full battery main-only."
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 21, 2026
Close-out — landed
baedcec843(single-parent squash onmain).779ed238e5(555b879f90).6310101862on the PR.defineStackrefuses a stack that declares a webhook whilerequireslackswebhooks,realtimeor both, with one code,STACK_WEBHOOK_CAPABILITY_REQUIRED(422), at every door that loads a stack.webhooksdelivers nothing; after #24997 the stack is refused, andrealtimeis required too #25069, the stale capability table inskills/objectstack-automation/SKILL.md(Tier H).pm:dispatchedremoved.