Skip to content

skills: objectstack-automation capability table says an absent webhooks delivers nothing; after #24997 the stack is refused, and realtime is required too #25069

Closed

Description

@objectstack-fleet

Filing gate ① a measured defect (a documentation inaccuracy in a Tier H skill), found by the contract review of PR #25057 (card #24997). Filed by the domain:spec seat 3 (session session_01D6F9axfoPzR7t8G1J7Ytzz). ⛔ Not a claim.

The finding

skills/objectstack-automation/SKILL.md:331 (capability table) says that when requires lacks webhooks, nothing is delivered outbound. It does not mention realtime.

Once PR #25057 lands, defineStack refuses a stack that declares a webhook while requires lacks webhooks, realtime or both. That refusal is STACK_WEBHOOK_CAPABILITY_REQUIRED (422), at os validate, os build and os dev / os serve. So the absent case is a load-time refusal, not silent non-delivery, and both tokens are required.

Candidate shape (for triage)

Update the row: a declared webhook needs both webhooks and realtime in requires; without them the stack is refused (name the code). Also check the skill's other webhook prose for the same claim, and the triggers row ("flows register, never fire"): validateTriggerCapability (stack.zod.ts:4526-4565) is the refusal this check mirrors, so that row may be stale in the same way. skills/** is a governed surface, so the PR needs an authorized approval.

Order: land after PR #25057.

Dedupe

Method: issues in this repo updated since 2026-10-15 (any state), matched on objectstack-automation and SKILL.md together with webhook. Parent: #24997. New.

Activity

  1. added
    documentationImprovements or additions to documentation
    domain:specDomain lane — seat card indexed by label:pm:seat
    area:workflowApprovals and automation — the work that runs without a person driving it
    domain:skillsDomain lane — seat card indexed by label:pm:seat
    pm:queueReady for the PM dispatch loop
    and removed
    domain:specDomain lane — seat card indexed by label:pm:seat
    on Oct 21, 2026
  2. objectstack-fleet commented on Oct 21, 2026

    @objectstack-fleet
    ContributorAuthor

    pm:queue → pm:blocked · domain:skills seat 1 (seat post #7623) · session_01M82feuetLzrCiBz41BJb7L · 2026-10-21T08:43Z

    Blocked-by: #24997

    This card's own body orders it: "Order: land after PR #25057". PR #25057 (for #24997) is open and draft at this write, and it introduces the STACK_WEBHOOK_CAPABILITY_REQUIRED refusal the new row must describe. So the order becomes a Blocked-by: line, and the card waits as pm:blocked rather than sitting in the queue. When #24997 closes completed, the unlock double-check returns it to pm:queue. skills/** is Tier H: the PR lands on an authorised approval.

    Not claimed and not graded here; this seat is ending its shift.


    Generated by Claude Code

  3. added
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    pm:queueReady for the PM dispatch loop
    and removed
    pm:queueReady for the PM dispatch loop
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    on Oct 21, 2026
  4. objectstack-fleet commented on Oct 23, 2026

    @objectstack-fleet
    ContributorAuthor

    Unlocked · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-23T14:41Z

    • Blocked-by: #24997 (it is in the 2026-10-21 state comment): closed completed on 2026-10-21, with STACK_WEBHOOK_CAPABILITY_REQUIRED on main.
    • State: pm:blocked → pm:queue. Grade unchanged: p3, domain:skills. skills/** is Tier H, so the PR lands on an authorised approval.
    • Why late: the Blocked-by: line sat in a comment, which triage's body-only unlock scan does not read. Unlocked in the maintainer's hold review of 2026-10-23.

    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 Oct 24, 2026
  6. objectstack-fleet commented on Oct 24, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 · 2026-10-24T16:00Z
    Session: session_014FZ3TJucS1L7BdMe5DAzXC
    Account: os-project-manager (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-25069-automation-webhooks-row
    Worktree: objectstack-issue-25069
    Domain: domain:skills
    Seat: domain:skills#1 (seat post #7623)
    File surface: skills/objectstack-automation/SKILL.md (the capability table, webhooks row L331; the triggers row and any other webhook prose making the same claim), one @objectstack/skills patch changeset. (stop on breach; explain in the report)
    Container & model: S, mode:subagent, model: CONTRACT_REVIEW_TIER (dispatch-gates --tier: skills/** MANDATORY, clause ①), effort: medium. Tier H: the PR stays draft for the maintainer's authorised approval.
    Clause-②: no
    Metadata-protocol: none
    Responsibility: the published skill text produces the risk | the load-time refusal STACK_WEBHOOK_CAPABILITY_REQUIRED already covers the runtime | any author reading the published skill reaches it today
    Premise: holds — L331 on origin/main 5eeb02c still reads nothing delivered outbound; #24997 closed completed
    Thread-read: 6367517152
    Serial constraints cleared: none (#25671 is in skills/objectstack-platform/** + skills/objectstack-upgrade/**, disjoint)

  7. objectstack-fleet commented on Oct 24, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 25069,
      "status": "done",
      "branch": "claude/issue-25069-automation-webhooks-row",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/25689",
      "session": "session_014FZ3TJucS1L7BdMe5DAzXC",
      "premise_still_valid": true,
      "summary": "skills/objectstack-automation/SKILL.md capability table: the `webhooks` row now says a declared webhook owes `requires: ['webhooks', 'realtime']` and is otherwise refused with STACK_WEBHOOK_CAPABILITY_REQUIRED (422); the `triggers` row, stale in the same way, now says an auto-launched flow owes `['automation', 'triggers']` and is otherwise refused with STACK_TRIGGER_CAPABILITY_REQUIRED; the lead-in names the doors (os validate / build / dev / serve) and that neither token implies the other. Both measured in packages/spec/src/stack.zod.ts on origin/main b2909fd4: validateWebhookCapability (L4863, `if (hasWebhooks && hasRealtime) return errors;`) and validateTriggerCapability (L4772, `if (hasTriggers && hasAutomation) return errors;`), thrown at defineStack L5335/L5342. The `requires: [...]` example block under the table was deleted to pay the token ratchet (headroom 25 → 3). One @objectstack/skills patch changeset. Per-row verdicts (changed / already correct / out of scope) are in the PR body.",
      "tests": "No package touched: no build closure (1) and no package test/typecheck (2) owed. Documentation-only diff; no ablation (no tested behaviour changed). Readings at head 284e1410: SKILL.md lines 438 → 432; tokens 5755 → 5777 / 5780; all SKILL.md lines 4389 → 4383; skills/** lines 13355 → 13349; bundle tokens 155382 → 155404.",
      "gates": "Local subset at head 284e1410, 46 derived families (dispatch-gates --commands --repo objectstack-ai/objectstack, re-derived after the changeset existed), exit codes captured before any pipe; --ran: 46 of 46 accounted. Exit 0: node scripts/check-skills-token-ratchet.mjs (SKILL.md 5777 tokens, ceiling 5780, headroom 3) and --self-test; pnpm --filter @objectstack/spec run check:skill-docs (Skill docs in sync); pnpm check:skill-frame-sync; pnpm check:skill-identifier-liveness (Leg 1: 456 citations over 53 files); pnpm check:skill-compatibility; pnpm check:doc-authoring; pnpm check:pm-skill-id-lint; pnpm check:nul-bytes; pnpm check:role-word; pnpm check:corpus-claim-drift; pnpm check:closed-ceremony-text; pnpm check:published-files; pnpm check:objectui-changeset; pnpm check:pm-changeset-deadline-census; pnpm check:changeset-gate-self-tests; check-adr-0087-registration, check-changeset-no-major, check-empty-changeset (each --base origin/main and --self-test); check-ci-filter-parity; check-closing-keyword-parity (+ self-test); check-comment-mask-corpus; check-doc-route-spelling --advisory and --self-test; check-dts-emitted --self-test; ci/assert-turbo-remote-cache --self-test; ci/prune-turbo-cache --self-test; pm/release-rehearsal-clone --self-test; release-pending-publish --self-test; pnpm check:agent-test-spelling; check:cross-package-test-inputs; check:driver-memory-census; check:gitlink-declared; check:merge-driver; check:pm-governed-merges; check:refd-timer-probe; check:watch-hint-literal; pnpm --filter @objectstack/lint run check:doc-formula-expressions (exit 3 PREREQUISITE NOT MET on first run, exit 0 after `turbo run build --filter=@objectstack/formula --filter=@objectstack/lint` under os-verify-lock, VERDICT command-exit 0). NOT MEASURED (exit 3, PREREQUISITE NOT MET, each sweeps every workspace package's built dist which this diff does not touch; CI's Lint & Repo Gates runs them on a fresh build): pnpm check:dts-closure, pnpm check:dual-build-cjs-loads, pnpm check:lean-entry-closure, pnpm check:sourcemap-no-sources-content. Local-only families check:skill-frame-freshness and check:dev-prereqs not run (no packages/spec build and no frame file touched). CI check-runs on PR #25689: in_progress at report time, not awaited.",
      "line_budget": "skills/** net -6 lines (budget: at most +2). Changed file 438 → 432; whole bundle 13355 → 13349. Token ratchet green at 5777/5780.",
      "deviations": [
        "Commit trailer: the harness-stamped `Co-Authored-By: Claude Fable 5.1` was refused by the pre-push hook (check:commit-card-trailers, model identifier); the commit was amended before its first push to the model-free pair AGENTS.md prescribes (`Claude-Session:` URL + `Co-authored-by: Claude`). Nothing already pushed was rewritten.",
        "PR body line 1 is an HTML attribution comment and line 2 a requested-by line, placed there at the coordinator's explicit instruction; os-dev.md forbids dev-authored HTML comments and allows only a harness-written one. Conflict noted, coordinator instruction followed; `Fixes #25069` is the first body line after them. Read back byte-identical (8255 of 8255).",
        "Four derived gate families NOT MEASURED locally (full-workspace dist sweeps), declared above; a narrowing, not a skip.",
        "The `automation` row ('flows never execute') was left as is: exact for an explicitly started flow, superseded for an auto-launched one by the `triggers` + `automation` row beneath it; rewording it does not fit the 3-token headroom. Stated in the PR's Acceptance notes."
      ],
      "files_changed": [
        "skills/objectstack-automation/SKILL.md",
        ".changeset/25069-automation-webhooks-row.md"
      ],
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "0 — no MCP GitHub tool called; all reads were REST GET via curl (issue, comments, pull)",
      "api_writes": "2 REST writes plus git push — (1) POST /repos/objectstack-ai/objectstack/dispatches via scripts/pm/fleet-write/dispatch.mjs carrying one pr_create (run 40111383455, success, PR #25689 draft, assignee os-project-manager); (2) this report comment via scripts/pm/post-stamped.mjs. git push x2 to claude/issue-25069-automation-webhooks-row (empty branch probe, then 284e1410).",
      "open_questions": [
        {
          "question": "Should the `automation` row be folded into the `triggers` + `automation` row so the table carries one line for the pair?",
          "options": ["A keep both rows (this PR)", "B fold them in a later PR that also shrinks the file"],
          "recommendation": "A, because the explicit-start case still needs its own absent-case sentence, and the fold costs tokens the file does not have."
        }
      ],
      "out_of_scope_findings": [
        "none filed. Noted in Acceptance notes only: the `automation` row wording (not a defect — exact for explicitly started flows); the card's cited line range stack.zod.ts:4526-4565 had moved to 4772-4812 (line drift, no action)."
      ]
    }
  8. objectstack-fleet commented on Oct 24, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:skills#1 · session_014FZ3TJucS1L7BdMe5DAzXC · 2026-10-24T23:20Z

    PR #25689 MERGED through the merge queue after os-zhuang's APPROVED review (5640493300) on head 284e1410, contract review PASS 6386762141. This stroke takes pm:dispatched and the assignee off. Noted for the next editor of skills/objectstack-automation/SKILL.md: the token ratchet sits at 5777/5780 — delete before adding.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:workflowApprovals and automation — the work that runs without a person driving itdocumentationImprovements or additions to documentationdomain:skillsDomain lane — seat card indexed by label:pm:seatpriority:p3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions