Repository navigation
Keep implementation notes separate from mathematical articles - #172
Conversation
Articles are the informal book: frontmatter and mathematics. Formalize's execution notes, and the Lean names, Mathlib gaps, and prior art agents already write into articles, were published as Lean commentary in the book. Give them one place per roadmap directory instead: an agents.md beside the articles, one section per article under a heading naming its file, deleted once the article is proved. The graph and its chapter check, the render copy, the publication revision, and both structure pages skip agents.md, matched ignoring case, so the notes are never nodes, never published, and editing them does not mark a site stale. Formalize and Roadmap write their notes there and nowhere else. A project whose CI pins an older AUTOFORM_REF reads agents.md as an article and fails check, so until the pin moves the skills keep notes in the report.
|
Superseded by the review of f13757c after the per-article notes redesign: #172 (comment) Review of #172 at 8e372ad. The graph, render, and hash changes are sound, but coverage still accepts the notes file as article evidence, and the old-pin caveat is wrong for notes files with an H1. Should fix
Golf
Nits
Checked, no change needed
Posted by PR swarm: PR Swarm Lead |
|
Review of #172 at f13757c (replaces the review of 8e372ad). The per-article hidden-notes design is sound and nothing blocks the merge, but audit reports note errors at wrong paths and the revision contract conflicts with the new audit rule. The earlier coverage, old-pin, dead- Should fix
Golf These edits, applied together with the audit fix and two new tests, keep the suites passing: test_graph 61 (the drop is the 2 agents.md cases), test_audit 27, test_render 78, test_skill_examples 26, ruff clean.
Nits
Checked, no change needed
Posted by PR swarm: PR Swarm Lead |
|
Re-checked at c2528c7. All four should-fix items from the review of f13757c5 are fixed, and each fix has a test that fails without it. Nothing blocks the merge.
The nits are closed too:
Optional golf, still open
Validation at c2528c7: test_audit 29, test_graph 69 and test_skill_examples 26 pass locally. Both mutations above were run against those tests. The CI test jobs are green; real Lean was still running at the time of writing. Posted by PR swarm: PR Swarm Lead |
|
Supersedes the “not ready” review of Final exact-head review at
Validation at this exact head:
|
|
Gap in the stale-note audit: In hartshorne and hatcher-at, the 9 Lean-side notes left after cleaning proved articles are all on chapter READMEs, and some are already stale. Possible fix: flag a container's note once every article it contains is proved. |
|
Supersedes the container stale-note gap reported here: #172 (comment) Fixed at exact head The roll-up is computed once, bottom-up and iteratively. A 1,200-level containment regression verifies that the audit does not recurse or rescan each subtree. Validation at this exact head:
#172 is ready for human review. |
Nothing told an agent whether the blueprint already held a result, so a Roadmap pass could add a second article for it and Formalize could prove a helper twice. `autoform search TARGET QUERY` answers in one local, read-only call, and each hit carries what a reuse decision needs: the statement as authored, the derived state, the Lean targets with file and line, the sources, and the articles that already depend on it. An article is a hit when every term occurs in one of its fields, after folding case, width, accents, typographic punctuation and invisible characters. Filler words such as "of" are dropped from the query and a word of letters loses a common ending, so "recovered" finds "recovers". An article holding the words as typed is listed before one that only a shortened word reaches, so shortening never hides a hit. Fields rank title, Lean name, the article's own path segment, statement, then containing titles. Full path IDs and qualified Lean names rank last, so a chapter directory or a namespace does not bury a statement match. The statement is matched as the site publishes it. Ordering adds one tie-break to the issue's: between hits with the same best field, the one whose weakest term sits in a better field is first. `## Execution notes` is not searched, because facebookresearch#172 moves those notes out of the article. Search keeps no index: each call reads every article and renders its statement. It rereads each article and refuses bytes other than those the graph was built from, so a hit belongs to the reported source revision. `--json` writes `autoform-search/v1`. Part of facebookresearch#143. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Nothing told an agent whether the blueprint already held a result, so a Roadmap pass could add a second article for it and Formalize could prove a helper twice. `autoform search TARGET QUERY` answers in one local, read-only call, and each hit carries what a reuse decision needs: the statement as authored, the derived state, the Lean targets with file and line, the sources, and the articles that already depend on it. An article is a hit when every term occurs in one of its fields, after folding case, width, accents, typographic punctuation and invisible characters. Filler words such as "of" are dropped from the query and a word of letters loses a common ending, so "recovered" finds "recovers". A term sheds the sentence punctuation and quotation marks around it. An article holding the words as typed is listed before one that only a shortened word reaches, so shortening never hides a hit. Fields rank title, Lean name, the article's own path segment, statement, then containing titles. Full path IDs and qualified Lean names rank last, so a chapter directory or a namespace does not bury a statement match. Titles and the statement are matched as the site publishes them. Ordering adds one tie-break to the issue's: between hits with the same best field, the one whose weakest term sits in a better field is first. `## Execution notes` is not searched, because facebookresearch#172 moves those notes out of the article. Search keeps no index: each call reads every article and renders its statement. It rereads each article and refuses bytes other than those the graph was built from, so a hit belongs to the reported source revision. `--json` writes `autoform-search/v1`. Part of facebookresearch#143. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Correction to my earlier comment: its suggested fix ("every article it contains is proved") misses 5 of the 9 book notes, because sub-container READMEs and other non-formalizable pages don't derive Two gaps remain at
|
Nothing told an agent whether the blueprint already held a result, so a Roadmap pass could add a second article for it and Formalize could prove a helper twice. `autoform search TARGET QUERY` answers in one local, read-only call, and each hit carries what a reuse decision needs: the statement as authored, the derived state, the Lean targets with file and line, the sources, and the articles that already depend on it. An article is a hit when every term occurs in one of its fields, after folding case, width, accents, typographic punctuation and invisible characters. Filler words such as "of" are dropped from the query and a word of letters loses a common ending, so "recovered" finds "recovers". A term sheds the sentence punctuation, quotation marks, backticks and wrapping emphasis around it. Only the query is shortened, so shortening adds hits and never removes one. Fields rank title, Lean name, the article's own path segment, statement, then containing titles. Full path IDs and qualified Lean names rank last, so a chapter directory or a namespace does not bury a statement match. Titles and the statement are matched as the site publishes them. Ordering adds two tie-breaks to the issue's. Between hits with the same best field, one holding the words as typed is before one reached only through a shortened word, and then the one whose weakest term sits in a better field is first. `## Execution notes` is not searched, because facebookresearch#172 moves those notes out of the article. Search keeps no index: each call reads every article and renders its statement. It rereads each article and refuses bytes other than those the graph was built from, so a hit belongs to the reported source revision. `--json` writes `autoform-search/v1`. Part of facebookresearch#143. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Nothing told an agent whether the blueprint already held a result, so a Roadmap pass could add a second article for it and Formalize could prove a helper twice. `autoform search TARGET QUERY` answers in one local, read-only call, and each hit carries what a reuse decision needs: the statement as authored, the derived state, the Lean targets with file and line, the sources, and the articles that already depend on it. An article is a hit when every term occurs in one of its fields, after folding case, width, accents, typographic punctuation and invisible characters. Filler words such as "of" are dropped from the query and a word of letters loses a common ending, so "recovered" finds "recovers". A term sheds the sentence punctuation, quotation marks, backticks and wrapping emphasis around it. Only the query is shortened, so shortening adds hits and never removes one. Fields rank title, Lean name, the article's own path segment, statement, then containing titles. Full path IDs and qualified Lean names rank last, so a chapter directory or a namespace does not bury a statement match. Titles and the statement are matched as the site publishes them. Ordering adds two tie-breaks to the issue's. Between hits with the same best field, one holding the words as typed is before one reached only through a shortened word, and then the one whose weakest term sits in a better field is first. `## Execution notes` is not searched, because facebookresearch#172 moves those notes out of the article. Search keeps no index: each call reads every article and renders its statement. It rereads each article and refuses bytes other than those the graph was built from, so a hit belongs to the reported source revision. `--json` writes `autoform-search/v1`. Part of facebookresearch#143. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Nothing told an agent whether the blueprint already held a result, so a Roadmap pass could add a second article for it and Formalize could prove a helper twice. `autoform search TARGET QUERY` answers in one local, read-only call, and each hit carries what a reuse decision needs: the statement as authored, the derived state, the Lean targets with file and line, the sources, and the articles that already depend on it. An article is a hit when every term occurs in one of its fields, after folding case, width, accents, typographic punctuation and invisible characters. Filler words such as "of" are dropped from the query and a word of letters loses a common ending, so "recovered" finds "recovers". A term sheds the sentence punctuation, quotation marks, backticks and wrapping emphasis around it. Only the query is shortened, so shortening adds hits and never removes one. Fields rank title, Lean name, the article's own path segment, statement, then containing titles. Full path IDs and qualified Lean names rank last, so a chapter directory or a namespace does not bury a statement match. Titles and the statement are matched as the site publishes them. Ordering adds two tie-breaks to the issue's. Between hits with the same best field, one holding the words as typed is before one reached only through a shortened word, and then the one whose weakest term sits in a better field is first. `## Execution notes` is not searched, because facebookresearch#172 moves those notes out of the article. Search keeps no index: each call reads every article and renders its statement. It rereads each article and refuses bytes other than those the graph was built from, so a hit belongs to the reported source revision. `--json` writes `autoform-search/v1`. Part of facebookresearch#143. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Pre-merge review of Review. A multi-agent review covered note validation (about 30 edge-case fixtures), the stale-note rule (15 blueprints, a 2,121-article graph, mutated rollups), publication (notes never reach the site, views, search, or publication hash, including under the 1cf2ca8 renderer), docs and skills against the code, test strength (27 mutations), CLI and JSON compatibility, product judgment, and the merge with Fixed:
Left as is: a traceback when the notes directory is not searchable ( Validation: the affected suites pass on this head merged with |
…-notes # Conflicts: # autoform_cli/audit.py # skills/formalize/SKILL.md # skills/roadmap/SKILL.md # tests/test_audit.py
Review at 13a8567Verdict: merge-ready. This head merges
Follow-ups, none blocking:
|
#172 made every command that loads the graph reject malformed, empty, symlinked or orphaned implementation notes. Render and the dashboard load the graph from a private copy without hidden files, so they skipped the check. They now run it against the vault itself; the notes are never published or hashed, so reading them in place changes no output.
Brings in #172 (implementation notes), #111, #168 and #223 to #229. Three files conflicted, each because both sides added text at the same spot; every resolution keeps both: - AGENTS.md: main's rewritten roadmap bullet (implementation notes under blueprint/.implementation-notes/), then this branch's import bullet. - skills/formalize/SKILL.md: this branch's "renew the complete claim set" joined with main's audit run and stale-note deletion, rewrapped. - tests/test_skill_examples.py: this branch's import-scope test and main's implementation-notes test, side by side.
Merge main at 82cca35, which carries the final #168 (b553a92) and #111 (521a940) plus #172, #175, #186, #188, #198, #208, #209 and the audit PRs #223 to #229. Main's changes are kept as they are, and this branch's changes apply on top of them unchanged. Only tests/test_shared_lean_runtime.py conflicted, in two places. The imports keep both sides: main's servers.lsp.server import, which #168's new live-process LSP timeout test needs, and this branch's servers.repl.core header-command import. The second conflict is in test_partial_repl_startup_transfers_cleanup_without_masking_the_error, where #168 relaxed a timing bound from 0.5 to 1.5 seconds. This branch replaces that test with test_dirty_repl_generation_transfers_to_retirement_before_lease_release because a cold pool no longer starts a REPL while it is built, so the replacement stays and #168's edit leaves with the old test. The other files both sides changed merged without conflict: servers/lean_runtime.py, the CI workflow, tests/test_repl_core_protocol.py, tests/test_skill_examples.py, skills/setup/SKILL.md and the example README.
Brings in main at 82cca35: the Lean client's request phases (#175), the skeleton probe's roots passed as JSON (#209), autoform unused-hypotheses (#198), the shared checkout pin check (#186), the tree snapshot scan closure (#188), the statement contract follow-ups (#208), retained project cleanup and LSP process ownership (#168, #111), implementation notes outside articles (#172), and the audit fixes #223 to #229. Conflicts: - autoform_cli/audit.py: this branch's validate_coverage_roles import beside main's IMPLEMENTATION_NOTES_DIR import. - autoform_cli/graph.py: this branch's ATLAS_SCHEMA and _MAX_ATLAS_BYTES beside main's IMPLEMENTATION_NOTES_DIR. - autoform_cli/README.md: this branch's area, atlas and catalog paragraphs, then main's implementation-notes paragraph. The publication contract keeps this branch's explorer description and takes main's "Hidden files, including .implementation-notes, are omitted". - skills/roadmap/SKILL.md: main's implementation-notes paragraph after the article-ids instruction, then this branch's paragraph break before the claim rule. Main's "Assert formalization or mathlib: true only after exact verification" stays out there, because this branch moved that rule into its own assertion paragraph further down. - tests/test_visualization.py: both new tests, this branch's checked catalog labels and main's structure page without implementation notes. One change had no textual conflict. #172 has every command that loads the graph reject malformed, empty, symlinked or orphaned implementation notes. Render loads the graph from its capture, which leaves hidden files out, so it skipped that check. It now checks the notes in the vault, the same fix #165 makes for its own capture. The notes are never published or hashed, so reading them in place changes no output. A new test renders a vault with an orphaned note and expects render to stop before it writes anything.
…-followups Follow up #172: kept-hypothesis reasons, not_ready containers and article moves
…complete the changelog --version now prints debrief_orchestrator.autoform_version(), the string a debrief records, so a plugin checkout shows its commit beside the version main keeps between releases. A custom action reads it only when --version is given, since it runs git. The release test monkeypatches the version lookup instead of skipping when autoform is not installed, checks that only --version reads the version, and checks that the changelog's newest release heading names the project version. The changelog adds the dashboard (#91), implementation notes (#172), unpublished folders (#381), --version, and #376, #380, #392, #394 and #406; corrects the library line; and regroups #362, #365 and #67. The CLI reference documents --version.
Summary
blueprint/.implementation-notes/<article_id>.mdarticle_id, so article moves preserve them and independent article claims never share a note fileautoform checkreject noncanonical, malformed, empty, symlinked, unreadable, or orphaned notes, ignore hidden entries such as editor lock files, and say how to repair an orphanautoform auditreport a note left after its article is proved, or after every formalizable descendant of a container is provedagents.mdand standardAGENTS.mduntouched as normal content/instructionsWhy this design
Implementation details should not clutter the mathematical wiki, but a shared
agents.mdcreated a reserved-name collision, cross-worker merge hotspot, filename-based stale state, and a hard migration for older pinned projects.The hidden per-article directory avoids those problems. Existing and older graph loaders scan only
blueprint/roadmap/, while existing renderers and structure views already omit hidden path components. No renderer exception or pin migration is required.Contract
.md.implementation-notes/<article_id>.md); any worker may delete a stale note, or repair an orphan a merge left behind by restoring a lostarticle_idor by moving useful content to the surviving article's note and deleting the orphanValidation
At exact implementation head before the final clean merge from current
main:make lintandmake check-example: passedAfter merging current
main, the focused tests, lint, diff check, andexample build pass. GitHub CI at
b032c03fwas green, including both Windowsand real-Lean jobs.
At
3e95335, which has Formalize delete stale notes, states the container rule exactly in the README and Roadmap skill, and passes a statement string to_ArticleShapein the deep-containment test to matchmain:make lintpasses locally, and GitHub CI is green for both the push and the merge withmain, including the Python 3.10 and 3.13 test jobs (lint, full suite, example build), Windows, and real-Lean jobs.At
6c46193, after a deep multi-agent review (graph validation, audit rule, publication, docs, tests with mutation checks, compatibility, product judgment, merge interaction withmain, and consumer runs on the bundled example, hartshorne and hatcher-at), four follow-up commits add orphan-note repair guidance, point Agent Review at the notes, add negative container-rollup tests, and tighten edge cases. The affected suites pass on the branch merged withmainat93c5d28(289 passed), lint is clean, and GitHub CI is green for both the push and the merge withmain, including the Python 3.10 and 3.13 test jobs (lint, full suite, example build), Windows, and real-Lean jobs.At
13a8567d, a merge ofmainat76e486d5: four files conflicted (audit.py, the Formalize and Roadmap skills, andtests/test_audit.pyimports), each resolved by keeping both sides, withmain'smigrate article-ids --writewording.migrate article-ids --writerefuses while an orphaned note exists, so a lostarticle_idcannot be replaced by a fresh one. Lint passes and the affected suites pass locally (490 passed), and GitHub CI is green for both the push and the merge withmain, including the Python 3.10 and 3.13 test jobs (lint, full suite, example build), Windows, and real-Lean jobs.