Repository navigation
QA run · records-forms.object-hook-lifecycle (1/1) · 55a806a7 · 2026-10-17 · 1 PASS / 0 PARTIAL / 0 FAIL / 0 BLOCKED / 0 NOT-RUN #24121
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_LOG_LEVEL=info OS_PORT=41931 objectstack dev --ui --seed-admin -p 41931 -d file:(run dir)/hk/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. Scratch objects and hooks authored in a writable package (POST /api/v1/packages,PUT /api/v1/meta/object|hook/NAME?package=PKG). - persona(s): the seeded admin (
admin@objectos.ai), identity proven withGET /api/v1/auth/get-sessionbefore the first cell - timestamps: 2026-10-17, 01:08Z to 01:10Z
Scope
Selector records-forms.object-hook-lifecycle resolves to 1 runnable item: records-forms.object-hook-lifecycle at revision 5, P1, surface mixed. No planned or blocked-hidden item.
Per-clause verdicts
| # | clause (short) | verdict | evidence |
|---|---|---|---|
| 0 | beforeInsert stamps source=web | pass | GET /api/v1/meta/hook lists the five showcase hooks. POST showcase_inquiry with name, email, message and no status/source → 201; re-read source web, status new. (A name-only body, as steps[1] first read, answered 400 VALIDATION_FAILED "Email is required; Message is required" — see notes) |
| 1 | one multi-event hook trims insert and update | pass | POST title " os-qa-RUNID " → "os-qa-RUNID"; PATCH padded → "os-qa-RUNID-upd" |
| 2 | afterUpdate audit fires on the completing update | pass | PATCH Build homepage done false→true 200; log INFO [hook 'showcase_audit_task_completion'] task completed: Build homepage |
| 3 | audit does not fire on a non-transition edit | pass | priority-only PATCH on App wireframes and on Audit current IA (both done:true) → 0 new "task completed" lines after a 4 s settle each |
| 4 | over-budget warn fires | pass | PATCH Data Platform spent 650000 (budget 600000) → WARN [hook 'showcase_warn_over_budget'] project over budget: Data Platform (650000 / 600000) |
| 5 | record = stored ⊕ payload; under budget no warn | pass | the spent-only PATCH fired with the stored budget 600000 read into record; Website Relaunch spent 70000 (budget 150000) → 0 warn lines |
| 6 | onError abort on a throwing beforeInsert rolls back | pass | scratch beforeInsert hook throwing, onError abort: POST → 400 {error: "qa scratch abort hook refused"}; count 0 → 0 |
| 7 | onError log on an async throw does not roll back | pass | scratch async afterUpdate hook throwing, onError log: PATCH val 2 → 200, re-read val 2; log ERROR [hook] handler failed (onError=log; suppressing) naming the hook; no fire-and-forget line |
| 8 | unevaluable condition fails closed | pass | scratch hook, condition int(record.name) > 0, onError log; POST name "abc" → 500 INTERNAL_ERROR, count 0 → 0; log HookConditionError: Hook '…_h_cond' could not evaluate its condition (runtime: int() type error …) — operation aborted. Control: an uncompilable condition is refused at authoring, PUT /meta/hook 422 INVALID_METADATA (expression-invalid) |
| 9 | same object and event run lowest priority first | pass | scratch afterInsert hooks at priority 10 and 90 on one object: one POST → log p10 at 01:08:42.998Z, then p90 at 01:08:43.165Z |
Automated pins run (RUNNER rule 6)
packages/qa/dogfood/test/showcase-public-form.dogfood.test.ts+hook-error-format.dogfood.test.ts(automated.ref): 2 files, 8 passed, 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
records-forms.object-hook-lifecycle r5: pass (10 pass of 10 clauses).
- Checklist-accuracy finding of this run, fixed on the branch before this record: steps[1] posted an inquiry with
nameonly, which answers 400VALIDATION_FAILED(email and message are required) before any hook runs. The step now carries the two required fields; clause 0 is scored on that body. - The revised steps[0] holds: the audit line is INFO and appeared on the
OS_LOG_LEVEL=infoboot; the revised acceptance[8].verify holds: the runtime-unevaluable condition aborted the write, and the uncompilable one never reached the gate. - Observation, not scored: the fail-closed abort reaches the caller as a generic 500
INTERNAL_ERROR("[REST] Unhandled error: HookConditionError …" in the log), not as a coded refusal.
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): every clause PASS; nothing to extract. 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 itemrecords-forms.object-hook-lifecyclelanded with #24141 (9ffe8af094), Part of #24036; itshistoryrow names #24036.Generated by Claude Code