M0 Phase 1: reframe the narrative around throwaway internal UIs - #299
Conversation
Repositions the top-line story from "one-file markdown apps" to what the project is actually for: internal UIs cheap enough to generate for a single question and delete afterwards. Augments rather than replaces -- the README already carried half the reframe, and the progressive- complexity tiers, concrete examples and "why not just ask Claude for an HTML file?" section all still hold. Governing constraint (operator decision): claim only what is true at M0. The reframe's destination is policy-gated generation, but M0 ships none of it, so every edit states the present tense and forward-references the rest. Three edits were at risk of writing M1 capability as shipped. Files: README lead + new "The problem" section; SKILL.md frontmatter, triggers, lead and a "Generate, then validate" section; llms.txt lead (required-header contract intact); ai-generation.md; llm-system-prompt.md exec framing; the two doc-fix issues; plan tracker. All five advertised slash-commands were phantom, not the three the plan assumed -- and the plan's own instruction to "redirect to the real /tinkerdown" was itself the trap, since /tinkerdown-as-generator is M1. Redirecting would have swapped five non-existent commands for one. Replaced with the loop that works today (describe -> validate -> serve) and a clearly future-tense pointer to the generate skill. Exec goes from "use sparingly" to a privileged first-class source gated behind --allow-exec, today's real gate (serve.go:58, websocket.go:1293, webhook.go:712). The section describes that gate and promises nothing further; an LLM system prompt should state current rules, not roadmap. Fixes #226 (lifecycle pattern -> lvt-el:{method}:on:{state}) and #230 (lvt-preserve -> lvt-ignore). #230 was not a pure rename: the entry defined it as "preserve form values", but lvt-ignore is a general morphdom escape hatch of which that is one use case -- and the client separately has a real lvt-form:preserve, a genuine near-miss. Verified against the client repo per CLAUDE.md before applying. Audit also found docs/reference/lvt-attributes.md has rotted well beyond #230 -- 8 of 11 sampled attributes are stale against the client, which predates its Tier-2 namespace migration. Deliberately not fixed here: a reference audit is its own phase, not a rider on a narrative pass. Recorded in § Risks as blocking for M1 Phase 3, which plans to feed that reference to the generating agent -- a reference naming attributes the client no longer implements would teach it to emit invalid output. Verification: GOWORK=off go test ./... green including the root package with all 32 !ci e2e files (836s); skill_examples_test.go and TestLLMSTxtExists 5/5. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018M9pJSPmG6i1D8s6rpEV4h
ReviewDocs-only PR (no code changes); the factual claims check out. I cross-referenced the attribute claims against
Strengths
Minor notes (non-blocking)
Overall this is a well-scoped, well-verified documentation change. Nice work tracing the #230 "rename" down to a real semantic difference ( |
…itself Review-bot note on #299: the audit's findings were disclosed in the PR description, but someone opening lvt-attributes.md in isolation would take its stale sections at face value. The PR description is not where a reader looks. Adds a banner naming what is known-stale (the lvt-fx:/lvt-mod:/lvt-form: namespace moves, the three attributes absent from the client, and the superseded lifecycle form), pointing at Phase 2 (M0) and telling readers to verify against the client meanwhile. Labels the content rather than fixing it -- the corrections remain Phase 2's job, since a full reference audit plus a scripted docs-vs-client check is a phase, not a rider on a narrative pass. Same honesty rule the rest of this phase follows: say what is true now. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018M9pJSPmG6i1D8s6rpEV4h
|
Took the first note. You're right that the PR description isn't where a reader looks — someone opening Added a banner at the top of the page naming what's known-stale (the It labels the content rather than fixing it — the corrections stay Phase 2's job, since a full audit plus a scripted docs-vs-client check is a phase rather than a rider on a narrative pass. That's the same rule the rest of this phase follows: say what's true now. Also worth noting you verified against the vendored bundle ( |
ReviewDocs-only PR (README, SKILL.md, llms.txt, ai-generation.md, llm-system-prompt.md, lvt-attributes.md, ROADMAP.md, and the phase plan). Verified against the current tree rather than taking the description at face value: Verified accurate:
Couldn't independently verify:
Minor observations, non-blocking:
Test coverage: N/A for a docs change beyond the existing Overall this is a careful, well-scoped documentation pass with good internal consistency checks already built into the PR description itself. The one real follow-up is having someone with the |
Second phase of the ephemeral-UI reframe plan (M0 Phase 1), following #296.
Repositions the top-line story from "one-file markdown apps" to what the project is actually for: internal UIs cheap enough to generate for a single question and delete afterwards. Augments rather than replaces — the README already carried half the reframe, and the progressive-complexity tiers, concrete examples, and the "why not just ask Claude for an HTML file?" section all still hold.
The governing constraint
Operator decision at kickoff: claim only what is true at M0. The reframe's destination is policy-gated generation, but M0 ships none of it — so every edit states the present tense and forward-references the rest. Three edits were at risk of writing M1 capability as shipped, and that constraint caught all three.
What changed
README.mdskills/tinkerdown/SKILL.mddescription+triggers+ lead + a "Generate, then validate" section — the frontmatter told the old story and would have contradicted the rewritten bodydocs/llms.txtdocs/guides/ai-generation.mddocs/llm-system-prompt.mddocs/reference/lvt-attributes.md+docs/archive/ROADMAP.mdThree findings that changed the work
1. All five slash-commands were phantom, not three — and the plan's own instruction to "redirect to the real
/tinkerdown" was itself the trap, since/tinkerdown-as-generator is M1. Redirecting would have swapped five non-existent commands for one. Replaced with the loop that works today (describe →validate→serve) plus a clearly future-tense pointer.2.
docs/reference/lvt-attributes.mdhas rotted well beyond #230. Sampling 11 documented attributes against the client, 8 are stale:lvt-scroll/lvt-highlight/lvt-animate→lvt-fx:*,lvt-throttle→lvt-mod:*,lvt-disable-with→lvt-form:*, andlvt-click-away/lvt-focus-trap/lvt-modal-openabsent from the client entirely. The lifecycle section documents the same deadlvt-{action}-on:{event}form #226 raises against the archive, and lists aloadingevent the client doesn't have (it'spending/done). The doc predates the client's Tier-2 namespace migration.Deliberately not fixed here — a reference audit is its own phase, not a rider on a narrative pass. Now scheduled as Phase 2 (M0) with a full phase block, because M1 Phase 3 plans to feed this reference to the generating agent: a reference naming attributes the client no longer implements would teach it to emit invalid output, which is the exact failure the reframe exists to prevent. That makes it a prerequisite for M1, not adjacent debt. Its Acceptance includes scripting the docs-vs-client check, since a one-time correction would simply rot again.
3. #230 was not a pure rename. The entry defined
lvt-preserveas "preserve form values," butlvt-ignoreis a general morphdom escape hatch (Phoenixphx-update="ignore"equivalent) of which form-value preservation is one use case — and the client separately has a reallvt-form:preserve, a genuine near-miss. Renaming on the issue's say-so would have shipped a correctly-named entry with a wrong definition. Verified against the client repo per CLAUDE.md first.Exec
From "use sparingly" to a privileged first-class source gated behind
--allow-exec— today's real gate, verified atserve.go:58,websocket.go:1293,webhook.go:712. Wrapping a CLI you already trust is something Tinkerdown is genuinely good at; the gate belongs to whoever runs the server, not to the markdown. The section promises nothing about M1's manifest — an LLM system prompt should state current rules, not roadmap.Verification
GOWORK=off go test ./...green, including the root package with all 32//go:build !cie2e files (836s)skill_examples_test.go+TestLLMSTxtExists5/5;llms.txtretains# Tinkerdown,## Quick Start,## Key Attributes,name=,lvt-source🤖 Generated with Claude Code
https://claude.ai/code/session_018M9pJSPmG6i1D8s6rpEV4h