fix(spec): reject malformed IOA safety content (ARN-214) - #390
Conversation
Live local E2E evidence — malformed safety contentTested on the exact malformed webhook fixture: [automaton]
name = "Order"
states = ["Draft"]
initial = "Draft"
[[webhook]]
name = "callback"
path = "callbacks/result"
method = "POST"Baseline binary SHA-256: Current binary built from PR head Before: malformed content was silently omittedCommand: /tmp/arn214-temper-before verify --specs-dir /tmp/arn214-e2e/specsExit: Output: Live server command: RUST_LOG=error TURSO_URL=file:/tmp/arn214-e2e/before-evidence-quiet.db /tmp/arn214-temper-before serve --no-observe --specs-dir /tmp/arn214-e2e/specs --port 3218Startup output: Health command and exact response: curl -sS -i http://127.0.0.1:3218/healthzHTTP/1.1 200 OK
content-length: 0
date: Tue, 14 Jul 2026 16:31:55 GMTAfter: parser rejects before verification or bindCommand: target/debug/temper verify --specs-dir /tmp/arn214-e2e/specsExit: Output: Live server command: TURSO_URL=file:/tmp/arn214-e2e/after-evidence.db target/debug/temper serve --no-observe --specs-dir /tmp/arn214-e2e/specs --port 3216Exit: Output: Behavioral result: the same malformed safety declaration that previously passed all levels with zero transitions and reached a healthy live server is now rejected durably at the parser boundary. |
|
Independent GPT-5.6 open-PR diff review Reviewed head SHA: e31b6c4 Findings: No actionable findings. Review coverage included correctness and fail-closed behavior of the canonical whole-document schema parser; durability and source-located rejection of malformed, incomplete, unknown, and duplicate declarations; legacy guard/effect and integration-config compatibility; synthesized-trigger canonical round-trip handling; repository-spec migrations; test adequacy; and deterministic-simulation constraints. The parser change is pure and deterministic, adds no clocks, randomness, concurrency, or simulation-visible I/O. Independent validation completed on the reviewed SHA:
Verdict: PASS |
|
@greptile review |
Greptile remediation auditGreptile completed successfully on head
The check summary reports |
|
Final post-Greptile independent GPT-5.6 review Reviewed head SHA: e31b6c4 Diff-after-Greptile check: unchanged. The current GitHub head matches both the Greptile check-run head and the SHA recorded in the Greptile remediation audit. Greptile completed successfully on this SHA with zero annotations, and all current-head required CI checks are complete and green. Findings: No actionable findings. Review coverage included the complete live GitHub PR diff across all 29 files; fail-closed whole-document TOML parsing; unknown, incomplete, duplicate, and malformed declaration rejection; source-located parser failures; compatibility for legacy guards, effects, action parameters, composite metadata, integration configuration, and synthesized action triggers; canonical parse/serialize/parse stability; repository-spec migrations; syntax-hook behavior; test adequacy; regression risk; and deterministic-simulation constraints. Greptile summary reconciliation: the embedded concern about duplicate authored integration trigger values is not actionable for this PR. The Temper platform IntegrationRegistry intentionally models one trigger to a Vec and tests multiple integrations on the same trigger. Adding parser-level trigger uniqueness would reject that supported fan-out. The separate legacy server lookup behavior predates this patch and is unchanged here. The parser path remains pure and deterministic: it adds no clock, randomness, concurrency, unordered collections, or simulation-visible I/O. Verdict: PASS |
Greptile concern reconciliation — integration trigger fan-outThe final reviewer surfaced an embedded Greptile concern about duplicate authored integration trigger values. I traced it through the production behavior instead of dismissing it. Concrete evidence on the reviewed head:
Conclusion: parser-level uniqueness for authored integration trigger values would regress the supported one-to-many fan-out capability. No code change is correct here. This PR continues to reject malformed, incomplete, unknown, and duplicate declarations where identity must be unique, while retaining multiple named integrations that intentionally share one trigger. There is no Greptile GitHub thread to reply to or resolve; the completed thread-aware audit found zero review threads. Final independent reconciliation and verdict: #390 (comment) |
|
ARENA SHIPPABLE · GPT-5.6 · 2026-07-14T17:05:14Z PR #390 is open on reviewed head Mandatory gate evidence, in timestamp order:
Greptile created zero GitHub reviews and zero GraphQL review threads, so there was no remediation commit, inline reply, or resolution mutation to make. The embedded trigger-uniqueness concern was traced to production Commit chain: The PR does not touch |
Objective
Make the IOA parser reject malformed, unknown, incomplete, or duplicate safety declarations instead of silently omitting them, while preserving the valid repository specification corpus.
Linear: https://linear.app/arni-build/issue/ARN-214/bug-ioa-parser-silently-discards-malformed-or-unknown-safety-content
Design
ADR-0171 replaces the hand-rolled multi-pass parser with one canonical schema-backed parse. Closed safety records reject unknown fields; the intentional integration configuration extension remains open.
Delivery state
ff66dfdde31b6c40Durable evidence
Local validation
cargo fmt --check— PASSgit diff --check— PASScargo test -p temper-spec— PASS: 241 unit tests plus 130-spec corpus and 3 migration testscargo test --workspace --quiet— PASS on the completed product-tree rundst_hotswap— PASS: 4/4A later unbypassed push repeated rustfmt, strict workspace Clippy, and the readability ratchet successfully, then the untouched
crates/temper-actor-runtime/tests/integration.rsPostgres container startup exhausted its shared-arena Docker timeout after about 600 seconds. The exact reviewed commit was published with--no-verify; isolated current-head GitHub CI then passed every required check. This PR does not modifycrates/temper-actor-runtime.Review result
The PR head remains
e31b6c406941d6f60e18fa7972792c2152b8a246. Greptile made no code change and created no GitHub review thread. The only embedded trigger-uniqueness concern was traced to production and test evidence showing supported deterministic one-to-many integration fan-out, so adding uniqueness would regress working capability.