This commit is contained in:
@@ -0,0 +1,113 @@
|
||||
# 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.
|
||||
- `composeCanonicalPrompt` remains 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 records `source_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-001` through `FR-COM-010`;
|
||||
- `FR-DET-007`.
|
||||
|
||||
Improved but not overstated:
|
||||
|
||||
- `FR-OUT-005` and `FR-OUT-006` have 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.
|
||||
|
||||
Reference in New Issue
Block a user