# 48 — Milestone 5 Export and Run Pack evidence ## Outcome Milestone 5 passed on 2026-07-27 through commits `a19ea56` and `5ba0caf`. 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 and PostgreSQL 17.9. The Windows workstation's Node.js 23.7.0 results are supporting feedback only. Generated output is now directly usable without changing the immutable run or requiring Gitea. Plain prompt copy, canonical Markdown, deterministic Run Pack ZIP, review-only `AGENTS.md.suggested`, authorized artifact history/download and historical Run Pack verification are available from the generated-task view. No export path executes repository commands or extracts imported files. ## Delivered behavior - Plain copy uses the exact stored prompt bytes and reports clipboard success or a recoverable failure through an accessible live region. - Markdown export wraps the same prompt in a deterministic TASK metadata envelope whose embedded prompt digest is verified before acceptance. - Run Pack creation is dependency-free and deterministic: entries are sorted, paths and names are canonical, metadata and modes are fixed, and the manifest inventories every non-manifest file with exact SHA-256 and byte length. - Run Pack verification parses into bounded memory and never extracts. It rejects traversal, backslashes, absolute and Windows-device paths, duplicate or case-colliding entries, symlinks and other non-regular entries, local ZIP offsets, overlapping data, unsupported compression, CRC mismatch, oversized inputs, duplicate JSON keys, inventory drift and digest substitution. - Historical re-import additionally binds the verified manifest to an authorized immutable run: run id, generated timestamp, render digest, playbook slug/version/digest and repository-profile digest must all match. - Artifact creation is workspace-authorized and idempotent per run, type and idempotency key. Viewer reads remain allowed while viewer creation is denied. - Artifact metadata and bytes are integrity-checked on read, have bounded retention, and remain persisted in PostgreSQL plus the configured local artifact store across container recreation. - `AGENTS.md.suggested` is review-only. It includes only integrity-bound frozen profile rules, confirmed commands explicitly marked safe for suggestion, protected/excluded paths and durable policies; task input and rendered prompt text are excluded and no existing `AGENTS.md` is modified. - Download responses use the recorded media type, safe RFC 5987 content disposition, `no-store` and `nosniff`. Mutation/import routes enforce strict content types, same-origin checks and streaming byte limits. - The generated-task UI exposes explicit viewer, unavailable, success and error states, three artifact actions, persisted history and a Run Pack file chooser. ## Defect found by live validation The first 390-pixel production verification exposed horizontal overflow after a successful Run Pack import because the unbroken manifest digest in the status message did not wrap. Commit `5ba0caf` applies `overflow-wrap: anywhere` to export feedback and adds a UI contract regression assertion. The rebuilt production page then had equal document client and scroll widths at 390 pixels, and all five required viewports passed. ## Authoritative validation | Command or check | Result | | --- | --- | | Integrated Node 24.18.0 verification | PASS: formatting, lint, typecheck, all workspace tests and production build across 14 workspaces. | | `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: all 28 supplied prompt fixtures remain byte-identical. | | Artifact package tests | PASS: 3 files and 23 tests, including 18 deterministic and hostile Run Pack cases. | | Application tests | PASS: 17 files and 100 tests, including authorization, idempotency, retention, immutable-source and local-storage integrity cases. | | Web tests | PASS: 29 files and 147 tests, including artifact/download/import HTTP contracts and generated-task UI states. | | `pnpm test:security` | PASS: 2 files and 11 tests. | | Live PostgreSQL integration | PASS: 6 focused files and 17 tests against PostgreSQL 17.9, including generated artifact persistence and authorization. The three fresh-database-only Milestone 0 cases were intentionally excluded from the already initialized production database run. | | Production Compose build/start | PASS: exact Node 24.18.0 image build; migration replay exited zero; web, worker and PostgreSQL healthy. | | Production browser export | PASS: exact prompt copy plus Markdown, Run Pack and AGENTS recommendation creation with explicit confirmations and three persisted history rows. | | Production Run Pack re-import | PASS: the downloaded 12,356-byte ZIP verified without extraction against its historical immutable task and manifest digest `13a82ad8a0ac3eb352ddd7c0193ba7ca8592d8f3c63d3382bcb52e3358ed3276`. | | Artifact byte evidence | PASS: downloaded/stored Run Pack SHA-256 `47e9308d97b6322157718a6766a7d71d07292e16e77e74cd9164f21b7b5b8eab` matched browser metadata and PostgreSQL. | | Restart persistence | PASS: web and worker were recreated; readiness recovered; the immutable run still reported three artifacts and all three download rows. | | Responsive matrix | PASS after regression repair: 390, 768, 1024, 1440 and 2560 pixel widths had no horizontal overflow. | | Browser console | PASS: zero entries after export, import, restart and viewport checks. | | Runtime boundary and log scan | PASS: web/worker run as `node`, read-only, all capabilities dropped and `no-new-privileges`; zero token, password or error-pattern matches. | Production evidence identifiers are deliberately non-secret: - run `a87ae11c-54b7-41c6-ba70-3a2d2a9aac0e`; - render digest `ea10cbd4920c94bb6af66189e1f35b880b8fe1eafdbe7a02097ee44efd0c4883`; - Markdown artifact `348d0cda-c24b-5e9d-8a88-0466838d40e2`, 8,543 bytes, SHA-256 `8cd95e53f6563281bbddc660d7d502731b53103855e21eb03452b46fd672e23d`; - Run Pack artifact `bd0f1e6a-d644-563c-b8de-f4a2473ed172`, 12,356 bytes, SHA-256 `47e9308d97b6322157718a6766a7d71d07292e16e77e74cd9164f21b7b5b8eab`; - AGENTS recommendation artifact `c648ed3d-5e41-5c51-acb9-7baef4f33896`, 1,265 bytes, SHA-256 `bfd12bc02591be18fbcf36dc42cc58025f8cfd71a9923084f3f514674a5b51b4`. ## Requirement status Completed with unit, PostgreSQL, production container and browser evidence: - `FR-OUT-001` through `FR-OUT-008`; - the Runs and exports acceptance section in `docs/19-acceptance-criteria.md`. The package-authoring import/export criterion is separate and remains assigned to Milestone 7. Personal-data export/deletion remains assigned to Milestone 8. ## Operational notes No credential, cookie, token, session secret, encryption key or database password is recorded here. The browser validation ZIP and remote transfer copy were deleted after verification; the authoritative artifact remains in the configured persistent artifact store under retention policy. No project-wide `release-evidence.json` or `FINAL_HANDOFF.md` is created at this intermediate gate; those remain final-release artifacts.