6.9 KiB
47 — Milestone 4 Guided Composer evidence
Outcome
Milestone 4 passed on 2026-07-27 at commit 80b95bc. Authoritative
validation used the isolated checkout
/mnt/user/appdata/devrunbook-validation/m3 on Unraid 7.2, Docker 27.5.1,
Compose 2.40.3, Node.js 24.18.0, Python 3.11.2 and PostgreSQL 17.9. The
Windows workstation's Node.js 23.7.0 results are supporting feedback only.
The application remains useful without Gitea and still has no arbitrary code execution path. Repository text and commands are inert, bounded, redacted evidence used only while composing instructions.
Delivered behavior
- A framework-independent governed resolver normalizes typed inputs, evaluates the closed three-valued condition DSL, resolves compatibility, scope, policies and command roles, and fails closed when facts are unavailable.
composeCanonicalPromptremains the byte-frozen reference-v1 formatter. The production resolver matches all 28 supplied prompt fixtures byte for byte.- Server-authoritative preview loads an exact published playbook version and an exact immutable repository-profile revision. The client cannot supply prompt bytes, snapshots, digests, lint results or provenance.
- Prompt assembly emits mission, repository context, reconnaissance, scope, constraints, autonomy, workflow, validation, recovery, completion and final reporting blocks with block-level source and condition-fact provenance.
- Sensitive inputs are rejected or redacted, imported text is fenced and bounded, unsafe commands remain inert, and protected/excluded paths are resolved before rendering.
- Prompt lint separates blocking findings and warnings, links findings to composer controls, and prevents generation until required inputs and the persisted preview digest are current.
- Workspace-scoped composer drafts use strict JSON, positive monotonic
revisions, strong
"draft:<revision>"ETags, atomic compare-and-swap updates, semantic no-op suppression and explicit conflict recovery. - Generated tasks use mandatory workspace idempotency keys, persisted digest validation, immutable database triggers and one append-only creation audit event in the same transaction.
- Guided UI generation sends
X-DevRunbook-Draft-Id; the server reloads that authorized persisted draft and recordssource_draft_id, rather than trusting client-derived composition state. - Generated task history is authorized, cursor-paginated and stable. Detail reads validate every persisted snapshot and render digest before returning exact stored prompt bytes.
- The responsive seven-step UI supports profile-free or exact-revision repository context, dynamic inputs, scope and protected paths, Observe through Repair autonomy, validation, live preview, provenance and immutable read-only task detail. Viewer, offline, expired-session, conflict and stale profile states are explicit.
Defect found by live validation
The first production browser run correctly froze all snapshots and digest but
exposed that the generic POST /runs path left source_draft_id null. Direct
API composition remains supported, but guided composition now supplies an
optional, validated X-DevRunbook-Draft-Id. When present, generation reloads
the workspace-authorized draft through generateCompositionFromDraft and
ignores client-derived composition state. A second production run proved the
exact draft relation, new digest and single audit event.
Authoritative validation
| Command or check | Result |
|---|---|
Integrated Node 24.18.0 pnpm verify with isolated Python environment |
PASS: formatting, 14-workspace lint/typecheck/tests/build, pack validation and reference composition. |
python scripts/validate_pack.py |
PASS: 28 P0 packages, 6 examples, 72 catalog entries, 9 schemas, 28 golden prompts and 68 release-evidence fields. |
python scripts/reference_compose.py --check |
PASS: 28 byte-identical prompts. |
| Composer tests | PASS: 37 resolver, normalization, condition, policy, redaction, lint, provenance and golden-parity tests. |
| Application tests | PASS: 16 files and 96 tests, including draft generation, replay conflicts, source integrity, authorization and run history. |
| Web tests | PASS: 24 files and 132 tests, including strict draft/preview/run HTTP contracts and UI contract tests. |
| Database unit and live integration | PASS: generated-run integrity/history plus six draft/source and three history tests against PostgreSQL 17. |
pnpm test:security |
PASS: 2 files and 11 tests. |
| Production Compose build and migration | PASS: migration 0003 applied; migrate exited zero; web, worker and PostgreSQL healthy. |
| Existing-data preservation | PASS: 9 repositories remained; profile history advanced only by the deliberate browser evidence revision from 13 to 14. |
| Browser critical flow | PASS: library exact-version handoff, draft creation, missing-input block, autosave, deterministic preview, provenance, immutable generation, reload and post-restart read. |
| Historical profile behavior | PASS: draft remained explicitly pinned to revision 2 after current revision 3 was saved; both generated tasks retained revision 2 and its original digest. |
| Responsive matrix | PASS: 390, 768, 1024, 1440 and 2560 pixel widths had no horizontal overflow; mobile navigation switched off at desktop breakpoints. |
| Accessibility interaction | PASS: semantic steps/fieldsets/tabs, disabled generation, theme switch and Ctrl+K command palette worked; reduced-motion behavior remains covered by the browser regression contract. |
| Browser console | PASS: zero warning or error entries. |
| Container restart | PASS: readiness recovered and the generated task plus exact draft relation remained persisted. |
| Runtime boundary scan | PASS: web/worker run as node, read-only, non-privileged, all capabilities dropped, no-new-privileges; zero sensitive log-pattern matches. |
Production evidence identifiers are deliberately non-secret:
- draft
86a44885-41d7-4d86-8664-cb56fc2473c6; - linked run
a87ae11c-54b7-41c6-ba70-3a2d2a9aac0e; - render digest
ea10cbd4920c94bb6af66189e1f35b880b8fe1eafdbe7a02097ee44efd0c4883; - frozen profile revision 2 digest
6f5f4c8533bad7e5a882b4174f1d212e5a58155a2f29e387cb8adbc16b771f85.
Requirement status
Completed with unit, PostgreSQL and production browser evidence:
FR-COM-001throughFR-COM-010;FR-DET-007.
Improved but not overstated:
FR-OUT-005andFR-OUT-006have working immutable snapshot and historical read foundations, but remain assigned to Milestone 5 until export, re-import and artifact history are complete.
Operational notes
No credential, cookie, token, session secret, encryption key or database
password is recorded here. Browser credentials and the Compose environment
remain outside the checkout with restricted permissions. No project-wide
release-evidence.json or FINAL_HANDOFF.md is created at this intermediate
gate; those remain final-release artifacts.