Repository navigation
Test what the docs do, not their wording - #424
Conversation
Add general checks to tests/test_skill_examples.py: every relative link and anchor in tracked Markdown resolves; every `autoform ...` in the CLI reference and the skills parses with the real argparse parser; schema ids and codes the docs name exist in code; frontmatter keys the skills teach are ones the graph loader accepts; the REPL import allowlist is documented. A short parametrized list pins the safety rules, the only wording kept, so the sentence pins can go next.
These 27 tests asserted that particular sentences exist in the skills, the READMEs, and AGENTS.md, about 470 prose pins in all. They checked no behavior, so every edit to a skill or README had to edit them too. The few real checks they held (finding codes exist, links and anchors resolve, the REPL import allowlist is documented) now live in the general checks.
The behavior tests also pinned README and source-page phrases, the roadmap reference's prose, mkdocs, theme, and workflow strings (down to the elan checksum), and the launcher paragraph. The template equivalence tests already compare the example's workflows and mkdocs.yml, and the link check covers the example's pages. What stays: the graph, statuses, declaration links, audit coverage, rendered site, SHA-pinned actions, the launcher, and the REPL tag the docs name.
develop-plugin told agents to preserve each user nudge in a focused test, which is what kept adding sentence pins to test_skill_examples. Ask for a fix in the command's output, error, or default first, a skill sentence only when behavior cannot carry it, and tests that check behavior, links, and that documented commands parse.
init leaves an existing entry alone and exits 0 unless --force overwrites it. It exits nonzero for an entry that differs from a path it manages only in letter case or Unicode form, even with --force, and for a write through a link, as the CLI reference says.
The block that introduces four steps listed five commands, and the fifth, `autoform dashboard`, serves until it is stopped, so an agent running the block as validation never returned. The dashboard is now described after the block as the optional local preview it is.
Jack approved testing what the docs do rather than their wording (#424). The record-output tests already cover the too-long case.
#90 edited tests/test_skill_examples.py. The tests this branch deletes go with #90's edits to them, and its five new tests stay as main has them: test_generated_site_docs_describe_one_multiscale_explorer, test_the_example_uses_nothing_newer_than_its_autoform_pin, test_agent_review_judges_a_catalog_as_an_inventory, test_roadmap_repository_scope_inventories_existing_lean and test_roadmap_and_formalize_leave_code_an_audit_warns_about_to_the_user. From #90's change to the site-contract test's mkdocs.yml pins, the new check that the explorer script is not loaded on every page stays.
#90's skill text names catalog-unbounded-limit and catalog-unscoped-limit, which audit builds as f"catalog-{problem}-limit", so the code check now matches an f-string code by its fixed parts. It also shows a bare `warning:` prefix, which the frontmatter check now skips like `error:`. Three of this branch's lines are wrapped to the 120-column limit.
|
Review at 9c669f1: one finding blocks merge. One round, read-only; the planned conflicts with other open PRs are out of scope, as asked. The review ran at 4e7833d, and I re-checked each finding at 0df905f and 9c669f1, after the merges with main. The rest holds. The 27 deleted tests only read files, match regexes or check that paths exist, and the new link, path, anchor and command-parse tests cover what they checked. The merges with main keep #90's edits to the two kept setup-asset tests and its 5 new tests. 45f4cfb changes only Blocks merge:
Notes:
|
The trim of the site-contract test also dropped its only checks that the generated workflows keep their safety steps: Pages deploys only from main, the verify workflow cleans only the root package, rejects kernel-check bypass options, audits every root-package declaration, checks elan's download against its checksum, and installs nothing from a moving @main ref. Those are product template contents, not wording, so they come back. The example mirrors the templates, so they hold for both.
The link and schema checks now also require that their extraction finds something, as the command check already did, so a regex that stops matching cannot pass them vacuously. develop-plugin's rule names the safety-rule list as its one exception, and AGENTS.md's init row covers every refusal init makes, as a summary.
|
Thanks. Blocker 1 is fixed in a85cf5a: the site-contract test again asserts the generated workflows' safety steps (main-only Pages deploy, scoped |
#399 changed how the Pages workflow deploys only from main: on a successful verify run of a main push, not on a push ref. The kept safety assertions follow it, checking the workflow_run conclusion, head branch and workflow path instead of github.ref.
#399's docs name the generated verify workflow, `autoform verify`, in inline code, which the command check read as a command that does not exist. Inline code that matches a workflow template's name is now skipped.
|
Head check: the blocker is fixed; ready to merge once CI finishes (reviewed at f8028e4; review at 9c669f1).
Posted by Claude Code (348 worker session). |
CHANGELOG.md takes main's: the released 0.6.0 notes already name autoform-runtime/v4, so this branch's one-line changelog fix is no longer needed.
|
Changes since the last head check (40a32c3), all merges with main plus fixes they needed:
The skill tests (36) and test_release (7) pass, run directly. CI is running at 6cce5e3. I'm marking this ready for review. |
|
Head check: nothing blocks merge (reviewed at 6cce5e3; last head check at f8028e4). The two commits since f8028e4 are merges with main. Their remerge diffs:
The command check's skip covers only the inline Notes (optional):
Posted by Claude Code (session jackmccarthy-da). |
project new's staging, descriptor and lock mechanics move to create.py's docstring, replaced by its error codes and their remedies; Setup links to the reference for init's pin inference. Drop follow-up and removed-feature notes, say that documented invocations are parse-checked instead of claiming skills restate no flags, and state the library-citation warning's handling once in the reference, with Roadmap keeping its own rules.
The reference keeps the purpose, trust and sandbox rule, freshness requirement, flags, refusals, exit behavior, and what each hash does and does not mean. Helper naming, printing options, folding, report tables, parallelism, the drift-hash boundary and comment-stripping limits move to the module docstring.
Keep the offer, cost, yes, list, retry and outside-catalog rules; leave flag interactions to the CLI reference.
AGENTS.md keeps a one-line pointer and the no-blanket-ban rule; drop the copy in develop-plugin.
Formalize keeps that Batteries' unusedArguments linter checks no theorem on Lean v4.30.0 and v4.31.0, since projects may pin toolchains back to v4.27.0. Human Review says the scoped percentage counts fully proved leaf targets, Roadmap says an old pin still rejects a cycle newer refs allow, and a long Setup line is rewrapped.
|
Head check: nothing blocks merge (reviewed at 399140b; last head check at 6cce5e3). It is ready once the skeleton suite, the only check still running, passes. The two commits since 6cce5e3:
Posted by Claude Code (session jackmccarthy-da). |
autoform_cli/README.md: the condensed project new paragraph keeps #450's new sentence on the artifact cache settings project new writes.
The cut MathJax paragraph kept "packages the site leaves off" but dropped both package lists, and its list of commands a macro may not take lost \mmlToken and \mathtoolsset. Name the loaded packages and the on-demand ones that stay off, as mathjax.py's PAGE_PACKAGES comment has them, and the two commands, which are in NEUTRALISED.
The skeleton passage says only a failed probe's reason quotes Lean, keeps ambiguous records among the probe failures and imports among what rotates the hash. Search's folding is back among what may change, with the ℝ example. The byte-order-mark warning keeps only the warning, and the H1 failure follows the list. Formalize keeps the library carve-out for a refusal, Setup says entries without offered: true are never offered, and the Batteries placeholder clause reads correctly.
Cut repeated and internal prose from the CLI reference and skills
#284 documents autoform-review-policy/v1, the line in blueprint/.autoform-review. The generated verify workflow checks that line by its sha256 rather than spelling it, so the schema check now counts the id as present when its line's hash is in the workflow.
|
Head check: nothing blocks merge (reviewed at 7e1324e; last head check at 399140b). The four commits since 399140b:
CI passes all 9 checks. Notes:
Posted by Claude Code (session jackmccarthy-da). |
- The README keeps #454's mathlib_declaration and mathlib_file rows with #459's wording, and this branch's proved/fully_proved paragraph, which now names the Assumes row of the statement box as #459 does. - #453's generator sentence, in a section this branch moved, goes to reference/search.md: tested on 4.34.1 and 4.35.0, CI runs its real tests on 4.35.0. - CHANGELOG keeps this branch's Docs and Claims entries and adds main's Render entry. - The README budget rises by the two table rows, to 1131.
One conflict, in CONTRIBUTING.md: #424 condensed the CI paragraph, and this branch's sentence on the WebKit job's MathJax tarball moves into its wording.
The claim contract moved to autoform_cli/reference/claims-and-revisions.md, so this PR's README corrections now go there, within its line budget: the timeout bounds the listing's Git commands, not removing its own refs, and `claim list` and `claim cleanup` are named as the listings that stop Git with everything it started. The detail the reference has no room for, the dashboard's process group and terminal and the case-collision naming, goes into claims.py's module docstring, which #458 gave the old README text.
PR #442's newest engine is the base: 7587206 (cyclic connections through facing card boundaries) was already in this branch with 3632246, and this brings in 98d4a28 (main), 34705b5 (paginated Results and responsive reader navigation), a9f14c5 (compact global search relations, transient menus close) and 7a29a56 (cooperative index validation). The engine changes in blueprint-dag.js, blueprint-navigation.js and blueprint-dag.css merged without conflict: the cold mount adds bp-dag-app-page before layout, a restored checkpoint keeps its Results page instead of resetting the list, applyRoute closes the filter menu, setFilters returns focus to the summary when it closes over a focused control, the filter popover is anchored left in the narrow toolbar, and normalizeIndex yields every 512 nodes and 1024 relations. The restyle's copy, card meta, status bar and aria-busy marking sit on top unchanged. skills/human-review/SKILL.md: #442's rewritten paragraph (fully proved share as the derived status defines it, catalogs have their own metric, never whole-source completion), with the restyle's landing-page label `Fully proved` in place of `Scoped roadmap`, which the landing page no longer prints. tests/test_skill_examples.py: #442 (via main's #424) deleted the test that pinned the human-review paragraph's wording; the deletion stands, so the restyle's one-word update to it goes with it. The restyle's site-contract assertions ("Uses N · Used by N" summary, the `Fully proved` figure and "5 of 7 articles") merged cleanly and are kept. tests/test_graph_view_rendering.py: #442 added an assertion on the reader's relation row reading "Prerequisites"; the restyle names it "Uses", which is what the merged script says, so the assertion pins "Uses". tests/test_dag_viewer_browser.py: - Topic status: #442 now checks each ring segment's colour against the published palette and its proportion of the 80 counts, instead of one browser's RGB text. The restyle replaced the conic ring with a linear bar drawn by the core's ::after in legend order. The merged test keeps the restyle's 1px frame and linear-gradient checks and applies #442's palette and proportion check to the bar: entries are sorted into the legend's order, as statusRing sorts them, and segments are read in percent instead of degrees. - Phone selection: #442's full-sheet reading test, with the restyle's one-argument _load_search_index (it waits for aria-busy to clear, not a count). - Links filter: #442's locator for the actual fieldset plus a check that its legend reads "Links"; #442's assertions that the filter menu stays open after a checkpoint and closes on selection and history moves, with the restyle's summaries ("Filter: all statuses · linked only", "Filter: all statuses", "Filter: N-1 of N statuses · linked only"). The unchecked status follows #442's fixture change (the target is not_ready, not planned) by reading the target's status. Decisions. No redesign item is duplicated by these commits, so none is dropped. #442's _open_dependency helper opens the dependency disclosure by element, not by its summary text, so it works with the restyle's "Uses N · Used by N" summary unchanged. The bundle is rebuilt from the merged sources (76,447 bytes; npm run check:explorer matches). These pass here: test_graph_view_rendering, test_explorer_asset_bundle, test_integrated_dag_layout, test_integrated_projections, test_integrated_navigation, test_integrated_reader_declutter, test_pr411_light_contrast, test_status and test_search_index_transport (232 passed, 6 Linux-only skips); test_render passes in full (130 + 152); test_skill_examples, test_integrated_publication, test_integrated_publication_security, test_integrated_reader_focus, test_hierarchy_render_regressions and test_graph_views pass (84). Browser tests were updated by reading and not run here. test_skeleton, which merged without conflict and runs Lean, was not run because machine load was above the heavy-job limit.
Problem
tests/test_skill_examples.py had 41 tests at de6de5f and about 590 literal-string checks on skill and doc sentences:
On 2026-10-20 Jack approved replacing them with general checks.
Change
autoform ...invocation in the CLI reference and the skills parses with the real parser, with placeholders filled in. That covers more than 100 invocations, and all of them parse today;@main.initexit row. In factinitleaves an existing entry alone and exits 0. It exits nonzero for an input or target it cannot use safely, such as a case or Unicode variant of a path it manages (even with--force), a link, an unusable root.gitignore, a directory it cannot list or an invalid option.autoform dashboardas a fifth command that never returns.Kept on purpose
test_readme_tells_users_how_to_run_several_sessions(Document running several sessions on one project #420/can you have more sessions coordinate? #421), Scale roadmap inventories and the full DAG explorer #90's five new tests, and Have Roadmap re-check retraction on the branch Formalize works from #407'stest_roadmap_retracts_against_the_branch_formalize_works_from.test_readback_faithfulness_contract_is_hash_bound_and_machine_readableis unchanged, because the rubric stays with Add read-back cards and the testimony validator #216 and Add statement-review commands #284.Test
Overlap
This conflicts in tests/test_skill_examples.py with:
#90, #407, #397, #378 and the 0.6.0 release (#439) have merged, and this branch now merges main: the tests this PR deletes go along with their edits, and their new tests stay as main has them. Three checks were adjusted for the new docs. The code check now reads codes audit builds with an f-string (
catalog-{problem}-limit). The frontmatter check skips a barewarning:prefix. The command check skipsautoform 0.5.0 (...), which is --version output, and inline mentions of the generated workflow's name,autoform verify. The new schema check found that #397's changelog still namedautoform-runtime/v3; the 0.6.0 release fixed that line.No other open PR gains a conflict.