Skip to content

docs: README cold-reader audit fixes; canvas_bind returns an idMap (#227) - #230

Merged
vicmaster merged 2 commits into
masterfrom
docs-readme-audit-227
Oct 23, 2026
Merged

vicmaster merged 2 commits into
masterfrom
docs-readme-audit-227

Conversation

@vicmaster

Copy link
Copy Markdown
Owner

Fixes #227, except finding 1, which is the multi-line batch_design ops bug. That one is fixed separately in #229 because it needed a parser change.

Code change: canvas_bind returns an ID map

canvas_bind now returns idMap: { workspace: { old: new }, projects: { old: new } }. An agent can retarget its stale IDs straight from the result instead of calling project_list and canvas_list again. bindRepo already built this mapping internally and threw it away. The change only adds a field; the existing projectsMigrated and canvasesMigrated counts are unchanged.

While checking this I found that the docs overstated what a bind changes. They said binding re-keys every project and canvas ID. In fact only the workspace ID and the project IDs change. Canvas IDs are kept, and each canvas's projectId is updated to its new project. A throwaway repro confirmed it, and test-repo-canvases.ts already relied on it by calling getCanvas(login.id) after the bind. Every surface that made the claim now says what actually happens: the README init and canvas_bind sections, the GUIDELINES.md sharp-edges bullet, the server instructions, the gotchas, and the canvas_bind docstring. test-repo-canvases.ts gains three checks: both projects map to live repo-proj- IDs, the workspace maps to the live repo-ws- ID, and canvas IDs survive the bind and point at the mapped project.

Contract decisions now written down

  • The LLM critique never gates presenting. This holds with or without an API key: the heuristic directive is the only gate, which is already how src/directive.ts behaves. With a key, the agent runs the critique loop as the standard last step (judge, then canvas_revise, then judge again). If canvas_revise stops at its iteration cap or because a pass did not improve the score, and axes still fail, the agent presents the design and tells the user which axes fail. A gate the agent cannot satisfy by improving the design would leave it stuck, and a model's verdict varies between runs. Several surfaces used to say "re-judge until it passes", with no exit. That wording is now consistent everywhere: the README canvas_evaluate and canvas_revise sections and workflow step 7, GUIDELINES.md, the server instructions, the gotcha, and the canvas_evaluate and canvas_revise docstrings.
  • Every cliché tell blocks the directive, whatever its severity. The README categories table, the canvas_evaluate docstring, and a GUIDELINES.md bullet all described cliché findings as advisory, or as not blocking. That contradicted both the directive paragraph and countBlocking, which treats any cliché finding as blocking.

Other corrections from the audit

  • The page-pattern quality gate runs under five themes: the neutral default plus the four bundled presets. The README said "all five presets", and there are only four.
  • The persistence sentences now distinguish unbound canvases, which live in ~/.framesmith/canvases/, from canvases in a bound repo, which live in that repo's .framesmith/. The viewer section now says it also watches every registered repo.
  • The viewer port is described as it actually works: the first free port from 3001 up, unless a port is passed.
  • batch_design gets a parameter table, a note that the third argument to M() is the child index, the missing properties (name, pulse, responsive), and the keys a chart series entry accepts.
  • A note explains that the category weights are relative: the overall score is a weighted mean over the categories that ran.
  • The README now spells out which grid values are accepted, matching the SAFE_GRID_* patterns in src/renderer.ts, instead of calling the rest "unsafe" without defining it.
  • Internal "Phase 13" and "Phase 28" labels are removed from the README.
  • The usage example no longer passes projectId: "default-project", an ID the README never defines.

Tests

The fast suite passes 72/72 and test-discoverability.ts passes 117/117.

)

canvas_bind now returns idMap { workspace, projects } (old -> new) so an
agent can retarget without re-listing. Docs said a bind re-keys every
project AND canvas ID; only workspace and project IDs change, canvas IDs
are kept, so every surface is corrected.

Also states that the LLM critique never gates presenting (the heuristic
directive is the only gate), that every cliche tell blocks the directive
regardless of severity, the real theme count behind the pattern gate,
where bound vs unbound canvases persist, and the lower-stakes README gaps
from the audit.
@vicmaster
vicmaster merged commit 2d66164 into master Oct 23, 2026
3 checks passed
@vicmaster
vicmaster deleted the docs-readme-audit-227 branch October 23, 2026 19:06
@vicmaster vicmaster mentioned this pull request Oct 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Docs: cold-reader audit of README — examples that fail as pasted, stale claims, canvas_bind re-keying gap

1 participant