Files

89 lines
3.6 KiB
Markdown
Raw Permalink Normal View History

2026-08-18 20:04:13 -07:00
# T10.10 — Orchestration composition gate
| Field | Value |
|---|---|
| Phase | P10 — Orchestration |
| Size | L — over 3 days |
| Status | Not started |
| Flags | gate |
| Spec | inlined below |
| Blocks | — |
## Goal
Prove the properties no single T10.x task owns: a full goal chain survives a
real Kafka outage, dispatch is idempotent under forced redelivery,
`Suspended`-approval produces byte-identical IR to hand-authored YAML, and
the HTTP method table stands as a published artifact.
## Facts (inlined — no spec read needed)
- Mirrors T7.4's fault-injection shape — broker down for the whole test —
extended across the full events → reconcile → dispatch → inbox-relay →
spawn loop, not just outbox delivery.
- Front-door equivalence for door (b) extends T3.10's existing hash-equality
gate — same discipline, new door.
- Gate script follows board convention: one script, diffed against a
committed expected output, empty diff is the only pass.
## Steps
1. Compose a fixture: one goal, a 2-run chain (A → reconcile → B → reconcile
`Stop`), driven through real HTTP calls and real Kafka topics.
2. Kill the broker mid-chain — after A completes, before the dispatch
message for B is consumed; assert the chain still completes once the
broker returns, with B eventually spawned.
3. Force redelivery of the `.dispatch` message for B; assert exactly one
run B exists.
4. Submit a problem statement through door (b), edit the draft, approve;
separately hand-author the identical edited content as YAML and load it
through door (a); assert both `WorkflowVersion` hashes match.
5. Snapshot the HTTP method table (paths + request/response shapes) to a
committed fixture; assert no path removed and no field removed relative
to the fixture — additions are fine, removals fail the gate.
6. Assert a goal-stall metric fires for a deliberately broken `Reconciler`
on one goal while a healthy goal in the same tenant proceeds unaffected
(T10.8's concurrency claim, at gate scope).
## Acceptance
- All six checks above pass with an empty diff against
`verify/expected/T10.10.txt`.
## Verify
**Harness:** full stack — embedded `redb`, real Kafka (or the board's
chosen fault-injection substrate), `axum` API instance, stub `Reconciler`
with scripted multi-step decisions.
**Integration test**`tests/it_p10_composition_gate.rs`, one numbered
assertion per Steps item above (`a1`..`a6`), reported by name per the
board's script convention.
**Command:** `verify/T10.10.sh`, diffed against `verify/expected/T10.10.txt`.
**False pass:**
- Running the chain with the broker never actually taken down — the
"survives an outage" claim needs the outage to really happen mid-chain,
not just be configured as theoretically tolerable.
- Skipping the method-table snapshot diff — a route or field silently
removed here breaks every embedder bound to the table (HTTP today, stdio
later) without any single T10.x task's own tests catching it, since none
of them own the whole table.
## Traps
- Treating this gate as "run all T10.x tests together." It must assert
properties none of them individually assert, per the board's own gate
discipline (INDEX.md, "Verification practice," point 5).
- Committing the method-table fixture as freeform prose instead of a
diffable, structured snapshot. An unreviewable diff defeats the point of
having a fixture at all.
---
Background (not required to do this task):
[../INDEX.md](../INDEX.md) (verification practice) ·
[T7.4-outbox-relay.md](T7.4-outbox-relay.md) ·
[T3.10-front-door-equivalence.md](T3.10-front-door-equivalence.md)