A plan now links to its prototype
Affects: everyone
A plan whose source carries a prototype: line now shows a View prototype link in its header, beside the effort and status badges. Clicking it opens the prototype.
To use: add prototype: docs/prototypes/<slug>.html to a plan’s Markdown source and re-render.
The gallery shows which plans have a prototype
Affects: everyone
Each card in the plans gallery gains a small prototype chip. It is a text label, not a second link — the whole card is already one big link, and nesting a link inside a link is invalid HTML that browsers silently pull apart.
Both files now record the shared data model
Affects: nobody yet
The prototype generator worked out a data model — the thing being tracked, its fields and their types, the main action, and the signal that proves it works — then threw it away once the page was built. That model is now written into both files as a single line of machine-readable data. This is the groundwork that makes the drift check possible at all.
A new check reports drift
Affects: teammates
Whenever a prototype is written, a check compares the recorded model against the prototype’s own visible columns and form fields, and against the plan’s copy. When they disagree it prints a warning naming both files, the field that differs, and what to re-run.
To use: nothing — it runs on its own after every prototype write.
The generator writes the link back
Affects: teammates
Running /plan-agent:prototype against a plan now writes the link and the model into that plan before writing the prototype. When the plan has no Markdown source — most older plans are HTML-only — it skips the write-back, still builds the prototype, and prints one line explaining how to create a source file.
The source-plan placeholder became a real contract
Affects: maintainers
{{SOURCE_PLAN}} was undefined free text that only ever fed a display string. It is now pinned: the repo-relative path of the plan’s Markdown source on the plan path, and empty for idea, image, and Figma inputs. The drift check resolves the owning plan from it, so without a format contract the whole comparison would be unimplementable.