Repository navigation
QA run · integration-system.webhook-lifecycle (1/1) · 55a806a7 · 2026-10-17 · 0 PASS / 1 PARTIAL / 0 FAIL / 0 BLOCKED / 0 NOT-RUN #24110
Description
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:
55a806a78c0442243a8ac22e7dbc6f7b2c4b3bb0on branchclaude/issue-24036-ledger-b, the commit the app was built from. Its product tree isorigin/main8a83cebc1; the branch addsdocs/qa/platform-checklist/areas/*.jsononly, and its later commits touch those files alone. Built withpnpm install --frozen-lockfileandturbo 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.dbfromexamples/app-showcase, its own port and file DB (the CLI also provisioned the siblingdata.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 ranobjectstack buildon a scratch copy of the showcase (beside it in the worktree, never committed). - persona(s): the seeded admin (
admin@objectos.ai), identity proven withGET /api/v1/auth/get-sessionbefore 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 400VALIDATION_FAILED. negative[2] PASS — a connector carryingwebhooksfails the build: "connector.webhookswas removed in @objectstack/spec 17 (ADR-0049 enforce-or-remove) …". - The revised step[2] holds: the create passed the required
projectand 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
objectstack-fleet commentedon Oct 17, 2026
Close-out (
domain:devxseat 2): nofail; the onepartialgap is parked below. Ruling C on #24127 (maintainer): a verification re-run of a ledger edit no longer carries aqa-runrecord, 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