# 46 — Milestone 3 Repository Profiles evidence ## Outcome Milestone 3 passed on 2026-07-27. The implementation spans commits `9401304` through `76b28de`; the corrected production runtime was built from commit `184af5c`. Authoritative validation used the isolated checkout `/mnt/user/appdata/devrunbook-validation/m3` on Unraid 7.2 (`linux/amd64`), 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. The application remains usable without Gitea. Repository commands are stored only as inert, untrusted prompt context; this milestone adds no command execution path. ## Delivered behavior - A dedicated `@devrunbook/repository-intel` boundary strictly parses JSON and YAML, rejects duplicate keys, aliases, custom tags, invalid UTF-8, oversized input and unsafe path or command semantics, and returns exact JSON Pointer, rule, message and remediation details. - Canonical JSON and YAML export use deterministic line endings and content digests. Imported source provenance is server-owned, and the supplied example retains digest `041e20f67e299665e85e5f14800a4bbcfa5e6c42ccdd7b22d29206e2c3f6727e`. - Workspace-authorized application use cases provide list, detail, atomic create, current-profile read, append-only revision and export operations. Viewer/editor/owner permissions remain monotonic without an instance-admin bypass. - PostgreSQL stores repository identity separately from immutable profile revisions. Revision number and lowercase SHA-256 invariants are database checks; row locking and strong ETags serialize concurrent writes; semantic no-ops do not create revisions. - Generated runs retain their frozen repository-profile JSON after later revisions. No mutable current-profile pointer can rewrite historical runs. - Governed HTTP routes support manual JSON creation, raw JSON/YAML import, listing/filtering/pagination, detail, current profile, conditional revision append and deterministic JSON/YAML export. Mutations require same-origin and profile updates require exact `If-Match`. - The responsive authenticated UI includes repository overview, filters, lifecycle/source badges, detail and provenance, explicit inert commands, protected/generated/excluded paths, policies, deterministic exports and viewer-only states. - Manual and import creation plus full structured revision editing cover stack, commands, paths, policies, required validation and preserved source facts. Conflict handling keeps the local draft and requires explicit adopt-current or reviewed rebase; it never silently overwrites. - Repository revision, digest and protected paths are visibly carried into the composer handoff. Full guided composition, prompt linting and final prompt generation remain Milestone 4. ## Defect found by live validation The first PostgreSQL repository integration run exposed an incorrectly correlated summary subquery. Drizzle emitted `repository_id = id`, allowing the inner revision table's `id` to shadow the outer repository identity, so a newly created repository displayed `currentProfileRevision: null`. The summary query now uses an explicit outer table alias and fully qualified correlated columns. A generated-SQL unit regression test and all four live repository-store tests prove the fix. The broad integration command was initially invoked without the Milestone 0 suite's bootstrap state and `/content/playbooks` mount. Its three M0 fixtures failed for those explicit missing preconditions; the independent repository test exposed the real defect above. The final scoped PostgreSQL command ran the four repository and three job/lease integration tests together and passed all seven. ## Authoritative validation | Command or check | Result | | --- | --- | | Frozen install and `pnpm verify` in the pinned Node 24.18.0 container | PASS: formatting, 14-workspace lint/typecheck/build, all unit tests, 28 P0 packages, 6 examples, 72 catalog entries, 9 schemas and 28 byte-identical prompts. | | `pnpm test:security` | PASS: 2 files and 11 tests. | | Repository intelligence tests | PASS: 23 semantic, parser, canonicalization, digest and import/export tests. | | Application repository tests | PASS within 67 application tests, including actor matrix, server metadata, ETags, validation and immutable revision semantics. | | Database unit tests | PASS: 41 tests; 7 environment-gated tests intentionally excluded from the unit command. | | Live PostgreSQL integration | PASS: 2 files and 7 tests covering atomic create, workspace isolation, pagination, concurrent ETags, no-op suppression, frozen run snapshots, job fencing and stale-lease recovery. | | Migration application and replay | PASS: migrations `0000`, `0001` and `0002` applied to an empty PostgreSQL 17.9 volume; a subsequent production startup replay exited successfully. | | Database invariant drill | PASS: positive revision, lowercase 64-hex digest, immutable update, cascade and workspace-list index behavior. | | Production Compose build/start | PASS: migrate completed; web, worker and PostgreSQL healthy. | | Live API matrix | PASS: create, list summary revision, read/ETag, no-op `200`, revision `201`, stale `409`, missing precondition `428`, JSON/YAML export and re-import, traversal `422`, foreign-origin `403`. | | Playwright production matrix | PASS: 4 tests passed and 2 deliberate duplicate-mutation skips across desktop Chromium and 390×844 narrow projects. | | Full-stack restart | PASS: readiness recovered and repository/revision counts remained 9/13. | | Container and log inspection | PASS: web and worker run as `node` with read-only roots; zero sensitive-pattern matches and zero error/fatal/exception matches. | The browser matrix also proved zero console/page errors, keyboard command-palette operation, persisted light theme, reduced-motion media behavior, no narrow horizontal overflow, manual create/edit, protected-path display and repository context in the composer. ## Requirement status Completed with runtime, database and browser evidence: - `FR-REP-001` through `FR-REP-008`. Improved but not overstated: - `FR-DET-007` and `FR-COM-002`: both profile-free and profile-bound handoffs are available, and protected paths are visible, but the complete guided composer remains Milestone 4. ## Operational notes The validation environment and browser credentials remain outside the Git checkout with restricted permissions. No password, cookie, token, session secret, encryption key or database credential is recorded in this evidence. The production validation stack is `devrunbook-m3-prod-927731a` at the existing restricted Unraid validation location. Prior milestone volumes were preserved; no unrelated server data was deleted. No project-wide `release-evidence.json` or `FINAL_HANDOFF.md` is created at this intermediate gate. Those artifacts remain reserved for final release evidence.