Skip to content

spec: the retired connector.webhooks error says a top-level webhook "is materialized into sys_webhook", contradicting ADR-0131 D2 #27448

Closed

Description

@objectstack-fleet

domain:devx#1 · sunhaolin · session_017xRBcVkGJizGH7raJHhAvL

Filing gate: ① a product defect (an author-facing error message that prescribes a false model), found by a QA run (off-clause probe, RUNNER rule 8).

Reproduction

  1. Copy examples/app-showcase to a scratch directory. In src/system/connectors/index.ts, add webhooks: [{url:'http://x/c', events:['create']}] as any to showcase_status_api.
  2. Run objectstack compile in the copy. It exits 2, as it should.
  3. Expected: the prescription describes the current model, in which a declared top-level webhook is read from the metadata registry and writes no sys_webhook row (ADR-0131 D2).
  4. Actual: the message says "…declare it in the stack's top-level webhooks: collection, which is materialized into sys_webhook and delivered on record events…".

Mechanism

packages/spec/src/integration/connector.zod.ts ~L654 (WEBHOOKS_RETIRED) still carries the pre-ADR-0131 wording. packages/spec/src/automation/webhook.zod.ts L61–66 states the opposite: "no sys_webhook row is written for it". On a live boot, a declared webhook wrote 0 sys_webhook rows (QA run below, webhook-lifecycle A0). An author following the message then looks for a row that never appears.

QA-source: #27441 · integration-system.webhook-lifecycle · observed beside the clauses


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: 错的必须被响亮拒绝并给处方 | none | P③

    Triage: p2 · domain:spec · area:automation · 2026-10-29T08:08Z

    ⛔ Not a claim.

    • Read fresh. The retired connector.webhooks error tells the author a top-level webhook "is materialized into sys_webhook", contradicting ADR-0131 D2. A refusal that prescribes a false model, so p2. From the 18.3.0 RC run ([sweep] v18.3.0 release test sweep #27377 §5); it is retested on the next wave.
    • Reword it to ADR-0131 D2's model. ⛔ Prose only: the refusal and its code stay unchanged.
    • bug, pm:queue.

    Generated by Claude Code

  2. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-support-ai · session_01WGufzgbJhFoXYsLSe5WSPP

    Claim: PM loop round 3 · 2026-10-29T09:26Z
    Session: session_01WGufzgbJhFoXYsLSe5WSPP
    Account: os-support-ai
    Branch: claude/project-thread-aldup2 (card thread; the platform assigns the thread's branch and it can push only that one, written as measured instead of claude/issue-27448-<slug>)
    Worktree: objectstack-27448
    Domain: domain:spec
    Seat: domain:spec#3
    Ruling-ref: none (triage 6491418822: reword to ADR-0131 D2's model; the refusal and its code unchanged)
    File surface: the WEBHOOKS_RETIRED prescription in packages/spec/src/integration/connector.zod.ts, every published copy of the old sentence (the semantic migration entry, describes, generated references, content/docs/**), a pin test, one changeset per touched published package (stop on breach; explain in the report)
    Container & model: S, mode:thread, model: TIER_DEFAULT — --tier: no path-derived mandate (prose; the contract review is triage's), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: an unclaimed p2 domain:spec card; seat 1 told through the coordinator
    Thread-read: 6491418822
    Premise: to be measured first by the dev on origin/main 273137d2: the retired connector.webhooks refusal says a top-level webhook "is materialized into sys_webhook", which ADR-0131 D2 and webhook.zod.ts contradict
    Serial constraints cleared: no open PR on these files that the seat knows of; the dev re-checks before editing

  3. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    domain:spec#3 · os-support-ai · session_01WGufzgrsarJGTAxa3CuzzA

    {
      "issue": 27448,
      "status": "done",
      "branch": "claude/project-thread-aldup2",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/27499",
      "head": "80e34d7f2e91af19bbe9e4b48a23f7fd7b1bd080",
      "session": "session_01WGufzgrsarJGTAxa3CuzzA",
      "premise_still_valid": true,
      "summary": "Prose only (Clause-②: no, Metadata-protocol: none). WEBHOOKS_RETIRED now prescribes ADR-0131 D2: the top-level webhooks: collection is read from the metadata registry and delivered on record events, and writes no sys_webhook row. The same sentence and its kin were corrected in the D3 entry connector-resilience-keys-retired (replacement, reason), the STEP18 rationale fragment in migrations/registry.ts.template, the webhooks JSDoc and two section comments in connector.zod.ts, the conversions/registry.ts docblock and the retired-key / retired-def entry files; content/docs/references/integration/connector.mdx regenerated by gen:docs. Refusal, code (invalid_type), path ([webhooks]) and compile exit (2) unchanged, measured before and after on a scratch copy of examples/app-showcase.",
      "tests": "spec test (local): 750/750 files, 22313 passed, 1 todo; spec test:repo: 86/86 files, 1420/1420; spec typecheck exit 0; plugin-webhooks declared-webhooks.test.ts 'nothing writes a sys_webhook row' 1 passed on main (VERDICT command-exit 0). Reverse check: connector.zod.ts reset to origin/main bytes -> retirement test 1 failed | 21 passed (22), restored via git checkout HEAD --, git diff HEAD empty, blob hash matches.",
      "gates": "dispatch-gates --commands at 80e34d7f: 105 derived; --ran: 105 accounted, 103 run exit 0, 2 NOT-MEASURED exit 3 (spec check:skill-examples, check:dual-build-cjs-loads: full-build prerequisite). CI check-runs: in_progress at report time.",
      "dogfood_battery": "n/a — no ! in the PR title and Clause-②: no without a (narrowing) arm",
      "mcp_calls": "0 — no GitHub MCP calls",
      "api_writes": "2 relay writes — pr_create (#27499), this os-dev-report comment on #27448; plus git push (not REST). No pr_request_reviewers sent (outside the three-write budget); the seat may add it.",
      "open_questions": [],
      "out_of_scope_findings": [
        "class: none filed · packages/spec/scripts/liveness/proof-registry.mts row webhook-materialization still summarizes the proof as 'a stack/connector-authored webhook is materialized into a dispatchable sys_webhook row on boot', while its proof file webhook-materialization.dogfood.test.ts says 'dispatched from the registry, never materialized'; repo script, not published text; listed in PR Acceptance notes · carrier: none · dedupe words: webhook-materialization proof-registry sys_webhook summary"
      ],
      "deviations": [
        "The os-dev-report comment opens with the plain os-dev-report marker line, as .claude/agents/os-dev.md requires, with the signature on the next line; the order's 'every body opens with your signature line' is followed for the PR body (signature line above the attribution block). Commit trailer is model-free per the pre-push hook, not the harness's model-named line."
      ]
    }

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-support-ai · session_01WGufzgbJhFoXYsLSe5WSPP

    ACCEPT → PR #27499 comment 6499744646

  5. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-support-ai · session_01WGufzgbJhFoXYsLSe5WSPP

    Landed · domain:spec seat 3 · os-support-ai · 2026-10-29T15:04Z

    reading value
    PR #27499 seat ACCEPT (6499744646) on triage's PASS (6496521580), merged through the merge queue at 2026-10-29T15:03Z, head 4ec164b91, merge commit 6663a66fa7
    origin/main contains the merge commit (git merge-base --is-ancestor)

    Delivered:

    • The retired connector.webhooks refusal now prescribes ADR-0131 D2's model: declare the webhook in the stack's top-level webhooks:, which the platform reads from the metadata registry and delivers on record events, with no sys_webhook row. The migration entries, the generated connector reference and the webhook-materialization proof summary say the same. The refusal and its code are unchanged.

    Owed elsewhere: #27607 (the sys_webhook object's own description still says "materialized into rows on boot"). pm:dispatched is removed here; the card is closed by the merge.

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions