Skip to content

QA run · integration-system.webhook-lifecycle (1/1) · 55a806a7 · 2026-10-17 · 0 PASS / 1 PARTIAL / 0 FAIL / 0 BLOCKED / 0 NOT-RUN #24110

Closed

Description

@objectstack-fleet

Run record for the re-run #24036 (half B) asks for after revising this item. Runner: an os-dev subagent dispatched by the domain:devx seat 2 PM (session session_016PVjjuVPte5XEJvaQx1E4t). Protocol: .claude/skills/checklist-test/SKILL.md + docs/qa/platform-checklist/RUNNER.md. Executed sequentially (no subagent tool in this runner).

Environment fingerprint

  • framework: 55a806a78c0442243a8ac22e7dbc6f7b2c4b3bb0 on branch claude/issue-24036-ledger-b, the commit the app was built from. Its product tree is origin/main 8a83cebc1; the branch adds docs/qa/platform-checklist/areas/*.json only, and its later commits touch those files alone. Built with pnpm install --frozen-lockfile and turbo run build (75/75 tasks).
  • .objectui-sha: f8267df93aba8fb09cc1cc0692eadc0c8c5a5e56 (no browser leg in this item).
  • boot: OS_PORT=41926 objectstack dev --ui --seed-admin -p 41926 -d file:(run dir)/wh/data.db from examples/app-showcase, its own port and file DB (the CLI also provisioned the sibling data.telemetry.db), stopped by its own process-group id afterwards. Rebooted once on the same DB for the seed-not-clobber leg. A local echo receiver (node http, 127.0.0.1:41930, its own PID) captured every request; it was stopped by PID for the dead-receiver leg and restarted. The retired-key probes ran objectstack build on a scratch copy of the showcase (beside it in the worktree, never committed).
  • persona(s): the seeded admin (admin@objectos.ai), identity proven with GET /api/v1/auth/get-session before the first cell
  • timestamps: 2026-10-17, 00:46Z to 00:52Z

Scope

Selector integration-system.webhook-lifecycle resolves to 1 runnable item: integration-system.webhook-lifecycle at revision 7, P1, surface mixed. No planned or blocked-hidden item.

Per-clause verdicts

# clause (short) verdict evidence
0 declared webhook materializes with the remaps pass sys_webhook showcase_task_changed: object_name showcase_task, active false, managed_by package, organization_id null, definition_json carries the envelope (object showcase_task, isActive false, timeoutMs 30000, triggers create/update/delete)
1 each per-record variant delivers once with recordId pass in-organization scratch webhook (POST /api/v1/data/sys_webhook, organization stamped, triggers create/update/delete, signing and header secrets masked on read). Task create (with its required project, per the revised step) 201, update 200, delete 200 → receiver got data.record.created, data.record.updated, data.record.deleted, one each, recordId the task id. The org-less shipped row, though flipped active, delivered nothing (no hit on its URL)
2 bulk pair aggregate shape blocked(dependency) not driven: a flow node's predicate multi-write publishes with no organizationId, so the org-owned subscription refuses it (knownGaps[1], maintainer question on #23166, not ruled)
3 headers, HMAC, timeout, outbox rows pass each hit carried X-QA-Custom: qa-header-value; X-Objectstack-Signature equals sha256= + HMAC-SHA256(body, secret) for all three; sys_http_delivery rows status success, attempts 1, response_code 200, timeout_ms 5000. Receiver down: a create's row went pending, attempts 2 then 3, error "fetch failed", next_retry_at moving forward
4 redeliver replays; refusal matrix pass POST /api/v1/webhooks/redeliver {deliveryId} on a success row → 200 {id, status: pending}; the receiver's replayed hit carried the original X-Objectstack-Signature byte-for-byte; row back to success, attempts 1, response_code 200. Refusals: anonymous 401 UNAUTHENTICATED; non-JSON 400 INVALID_REQUEST; {} 400 MISSING_REQUIRED_FIELD; unknown id 404 RESOURCE_NOT_FOUND; the still-pending dead-receiver row 409 DELIVERY_NOT_ELIGIBLE. Cross-organization 404 and DELIVERY_NEVER_SENT not staged live (they rest on the plugin and outbox tests the verify text names)
5 retired trigger kinds fail at parse pass build with triggers undelete: exit 2, "Invalid option: expected one of create|update|delete|bulk_update|bulk_delete"; with api: the same
6 admin-edited row survives reboot pass admin PATCH of the shipped row (active true, url to the receiver) through the data API — the write the Setup page issues; the page was not driven — stamped customized true; after the reboot: active true, url kept, customized true, managed_by package

Automated pins run (RUNNER rule 6)

  • packages/qa/dogfood/test/webhook-materialization.dogfood.test.ts (automated.ref): 1 passed, run with package-first-authoring (6 passed across the two files), under the shared verify lock.

Reproduction rules

No clause scored fail, so none is owed. No authentication or authorization hole was found; nothing here is withheld under the RUNNER rule-2 carve-out.

Derived item verdict

integration-system.webhook-lifecycle r7: partial (6 pass + 1 blocked(dependency) of 7 clauses).

  • Negatives the earlier run owed: negative[1] PASS — a row planted in sqlite with triggers [create, undelete] was dropped loudly at boot: WARN [webhook-auto-enqueuer] webhook 'qa_hook_planted' declares trigger(s) the engine never emits: undelete — ignored; the data API itself refuses such a row 400 VALIDATION_FAILED. negative[2] PASS — a connector carrying webhooks fails the build: "connector.webhooks was removed in @objectstack/spec 17 (ADR-0049 enforce-or-remove) …".
  • The revised step[2] holds: the create passed the required project and the create event fired.
  • Substitution recorded: step[1]'s Setup flip was issued through the data API rather than the page.

Checklist-accuracy findings and fixture gaps from this run close out on #24036.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 17, 2026

    @objectstack-fleet
    ContributorAuthor

    Close-out (domain:devx seat 2): no fail; the one partial gap is parked below. Ruling C on #24127 (maintainer): a verification re-run of a ledger edit no longer carries a qa-run record, and the existing ones close out now. The revised item landed with #24141 (9ffe8af094), Part of #24036.

    Parked-on: #24036 · integration-system.webhook-lifecycle · clause 2 blocked(dependency): a flow node's predicate multi-write publishes with no organizationId, so the org-owned subscription refuses it (the item's knownGaps[1]; the question on #23166 is unruled)


    Generated by Claude Code

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

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions