- db/schema.sql: 9 core tables, append-only event log (trigger-enforced), deny-by-default policy_rule with seeded globals, runaway budgets on work items. Validated against Postgres 16 (DDL applies, trigger rejects UPDATE). - engine/schemas/events.py: AgentMessage (flat, inference-enforced) + EventEnvelope pydantic models; models are the schema (ADR-003). - adr/ADR-003: event schema and data model decisions. - SLICE1_DEMO.md: verbatim acceptance script for Slice 1. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2.4 KiB
2.4 KiB
Slice 1 Acceptance Demo — verbatim script
This is the acceptance test for Slice 1 (PRD_ADDENDUM §6). When every step below works end-to-end, Slice 1 ships. Nothing outside this script is in scope.
Cast
- Company: GasWatch Inc. (first real subsidiary; brief: track local gas prices, tiny web app)
- Employees:
Mara(Manager),Dev(Engineer),Quinn(QA) — three Hermes profiles, qwen3.5:9b
Script
POST /companieswith the GasWatch brief → company row, eventcompany.created, three employees hired (employee.hired×3), Hermes profiles created via adapter.- Engine asks Mara to decompose the brief → Mara returns plan; engine creates ~3 work items (
work_item.created), one flagged as needing clarification. - Clarification flows: Mara emits
clarification.requestedwith 2–3 options + recommendation → surfaces in dashboard → user answers →clarification.answered→ dependent task unblocks. Non-blocked tasks proceeded meanwhile. - Dev picks up the feature task: engine dispatches to Hermes (
dispatch.sent), worktree created on an isolated branch, code committed. Every agent report lands as validatedAgentMessageevents. - Quinn runs pytest + one Playwright browser flow against the running app; screenshots + trace captured (
test.started/test.completed,artifact.created). - Seeded defect found by Quinn → defect work item → Dev fixes → Quinn re-verifies (defect loop closed).
- Evidence bundle assembled (commits, test output, screenshots, trace) →
artifact.created(kind=evidence_bundle)→ downloadable from dashboard. - Dashboard (read-only) showed live truthful states the whole time: employee status, work item board, event feed, cost tally (
cost.recordedper run). - Runaway guard demonstrated: one task configured with
max_iterations: 2tripsrun.cappedand blocks cleanly instead of looping. - Global pause:
POST /pausemid-run → no new dispatches, in-flight inference drains, tool executions abort, state consistent, resume works.
Hard exit criteria
- Zero free-form parsing: every agent→engine message validated against
AgentMessage. - Event log replay tells the whole story; no state exists that lacks a causal event.
task.blockedfrom any agent was triaged by Mara before surfacing to user.- Kill Hermes mid-demo → engine marks run failed, work item re-dispatchable, no corruption.