Skip to content

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

Closed

Description

@objectstack-fleet

Ruled: 6303859748 · letter A · 2026-10-20T23:16Z

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.

What the ruling binds (origin/main e4d604efd39f)

What done looks like

  • 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) · #6015 6292005854 (「甲」) and 6303865025 (its amendment).

Activity

  1. added
    bugSomething isn't working
    priority:p1High: required for production / M2
    area:apiThe API a customer can call, and integrations — REST, connectors, webhooks, jobs
    on Oct 20, 2026
  2. 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
  3. objectstack-fleet commented on Oct 21, 2026

    @objectstack-fleet
    ContributorAuthor

    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/main 3b3830ca22 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 「甲」, #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.ts before opening its own. The PR owes a CONTRACT_REVIEW_TIER contract review.

    Read on origin/main 3b3830ca22 at 2026-10-21T03:09Z: STACK_TRIGGER_CAPABILITY_REQUIRED exists at stack.zod.ts (#20332); no webhook arm.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 21, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  5. objectstack-fleet commented on Oct 21, 2026

    @objectstack-fleet
    ContributorAuthor

    Close-out — landed

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

Metadata

Metadata

Assignees

Labels

area:apiThe API a customer can call, and integrations — REST, connectors, webhooks, jobsbugSomething isn't workingdomain:specpriority:p1High: required for production / M2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions