Skip to content

Cut the docs agents read, split the CLI reference, and give them line budgets - #458

Merged
Deicyde merged 35 commits into
mainfrom
docs/cut-and-split
Oct 24, 2026
Merged

Deicyde merged 35 commits into
mainfrom
docs/cut-and-split

Conversation

@Deicyde

@Deicyde Deicyde commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

Stacked on #424: its base is #424's branch, and I'll retarget it to main when #424 merges. Opened above the agent-PR cap with Jack's approval.

Problem

Agents skip a file that is too long, and then the rules in it do nothing. At #424's head, after #451's cut, the CLI reference autoform_cli/README.md was 2,658 lines (163 KB). The largest skills were Roadmap (292 lines), Formalize (284), Setup (232) and Human Review (143).

Change

One commit per area.

  • Split. The contracts move verbatim into five pages under autoform_cli/reference/: validation and audit, search, open statements, claims and revisions, and runtime and publication. The README keeps the article format and the commands, and ends with an index of the pages. Links into the moved sections point at the pages, and the doc checks read them.
  • Cuts.
    • Internals move into the docstrings of the modules that implement them.
    • A rule stated twice keeps one copy, and the other places link to it.
    • Flag prose that --help covers goes, once the help strings it relied on are filled in: claim --ttl and --note, the review flags, project new's toolchain flags, init --autoform-ref and --force, library index --timeout, and work import-impact --module-scope.
    • Old-pin upgrade caveats move into CHANGELOG.md's upgrade list.
    • The Commands section gets subheadings, so a skill can link one command.
  • Budget. tests/test_doc_budgets.py fails when one of these docs grows past its line count today, or when a skill or contract page has no budget.
Files Before After
autoform_cli/README.md 2,658 1,121
autoform_cli/reference/*.md (5 new pages) 1,075 moved 841
skills/roadmap/SKILL.md 292 234
skills/formalize/SKILL.md 284 246
skills/setup/SKILL.md 232 171
skills/human-review/SKILL.md 143 109
Agent Review, debrief and develop-plugin SKILL.md 163 138
skills/*/references/*.md 922 900
AGENTS.md, CONTRIBUTING.md, README.md, servers/README.md 435 367

Every command, flag, exit status, refusal, error code, default, limit, JSON key and safety rule is still stated in a doc a user or agent reads; a fact that went only into a docstring did not count. Before the cut, a critic spot-checked the planned cuts and found 13 that would have lost such a fact, among them the TeX package list, the review exit statuses, the testimony refusals and the catalog ledger rule. All 13 are kept.

Tests

  • The Python changes are docstrings, plus help strings in __main__.py: with those stripped, the AST of all 25 changed files is identical to Test what the docs do, not their wording #424's head. The bundled audit script stays byte-identical to the template.
  • Run directly, because load is too high for pytest: tests/test_skill_examples.py 37 passed; tests/test_doc_budgets.py 2; tests/test_release.py 7; tests/test_readback_testimony.py 117; tests/test_lake_artifact_audit.py 87, with 38 skipped for Lean; test_search's reference examples and test_plugin_runtime's reference set.
  • The budget test fails on each of three mutants: a file one line over, the references one line over, and a skill with no budget.
  • A loss check over the whole diff, with two refuters per finding, confirmed 5 must-fix and 14 should-fix losses. The last five commits restore each fact in a sentence or less, adding 54 lines; the comment below lists them.

Overlap

These open PRs edit the same docs. They will conflict with this one, or have to fit the budgets once it lands:

autoform_cli/README.md held every contract after the command reference,
2,658 lines in one file. Validation and audit, search, open statements,
claims and revisions, and runtime and publication now each have a page
in autoform_cli/reference/, moved verbatim under an H1 title, and the
README ends with an index of them. Links into the moved sections, from
the README, the pages and the skills, point at the new pages, and the
doc checks read the pages along with the README.
Cut autoform_cli/README.md lines 1-260 (title through Assertions and
derived status) to 223 lines. Every heading is kept.

Moved:
- Statement-span fence pairing (bare-line closing, plain-text reading of an
  unclosed fence for an article alone, pairing on chapter pages, the
  backtick-run case, which part keeps an unclosed comment's text) to the
  autoform_cli/markdown.py module docstring. The README keeps the span
  rules, including that an H1 below a ## section resumes the statement and
  that headings deeper than ## never end it, the close-each-fence rule,
  the check warning, unclosed-code-fence, and the unreported unclosed
  HTML comment.
- How overviews draw collections and pagination, and where a relation to
  a collection is drawn, to the autoform_cli/graph_views.py module
  docstring. The README keeps the roles and "depend on an article inside
  the collection".

Condensed:
- Catalogs: the full lean:/ledger naming rule and the hold-back rule stay
  here (the Roadmap skill can link #articles-and-containment). Metric
  exclusion is left to the coverage-completeness section, which already
  states it.
- Implementation notes: the orphan story becomes its repair rule.
- proved vs fully_proved: shortened, keeping the conditional propagation
  sentence; the leanblueprint palette history is cut.
- Old-AUTOFORM_REF caveats in the atlas paragraph and the assertions table
  become one pointer to CHANGELOG.md#upgrading-from-050.
Split the Commands section's opening part under ### init, ### project,
### Publishing and the dashboard, ### check and ### audit and coverage,
keeping the ## Commands heading and every existing anchor. The coverage
completeness heading becomes a #### under audit and coverage.

Cut flag prose that --help gives (--autoform-ref, --force, --json,
--port, --release default, --library's version exclusivity), the case
and Unicode rationale, the v4.27.0 rationale, and the Pages rationale.
Every refusal, error and warning code, limit, default, JSON key and
schema stays in the README.

Moved:
- project new staging details (one concurrent winner, 0755/0644 modes,
  why the artifact cache restores into .lake/build) to the
  autoform_cli/project/create.py docstring; the enableArtifactCache and
  restoreAllArtifacts sentence stays under project.
- Workflow pin inference now lives once, under init; project new links
  to it. The remote order was already in scaffold.py.
- project inspect status transitions after an unlisted pair to
  autoform_cli/project/README.md, whose compatibility row now links its
  own Scope and resolver rules section.
- Citation identifier forms, link-text and last-component matching, and
  when a library is hashed to the autoform_cli/library/citations.py
  docstring. The trigger, the 4 MiB page limit, how to silence a
  declaration or module warning (umbrella imports do not count), and the
  index, verification and Lake-file warnings stay in the README.
- Coverage edge cases (closing fences, HTML-not-CSS hiding, unclosed
  links, heading-ID fragments) to the autoform_cli/coverage.py
  docstring. The refusals a user hits stay as four bullets.
- Pages deploy, redeploy and legacy-switch rules, and the publication
  versus audit gates, condensed under Publishing and the dashboard; the
  report-step YAML became one sentence.
Split the part of ## Commands from skeleton through review check under
### skeleton (with #### Skeleton hashes and #### Read-back cards) and
### review. No existing heading changes; 390 lines become 214.

The five hashes become one table under #### Skeleton hashes. The review
subsection gains the exit statuses that only AGENTS.md's exit table held:
prepare and record exit 2 on input they cannot derive, read or trust,
refused testimony or a card conflict; check exits 1 on findings and 2 on
evidence it cannot derive or a blueprint that changed during the run. It
also names review-article-shape. The testimony refusals stay as one
sentence (invisible or reordering characters, stray or stacked combining
marks, no letter or digit, 32 KiB or 500 lines, unassigned code points on
write). Every limit (32 KiB/500 lines, 4 MiB, 10 s lock, 600 s, eight
probes), code, schema and safety rule stays in the README. The two
"checksum, not authorization" paragraphs become one, and it links Open
statements for activating CODEOWNERS instead of restating the steps.

Moved:
- probe visibility (later global notation, attributes), per-probe limits
  vs selection-independent hashes, structure folding, why partial def is
  refused, probe failure kinds, report blueprint identity and coherence,
  POSIX process-group cleanup, drift and statement hash field detail,
  raw-printing rationale, as-written cutting, output replacement
  mechanics and atomicity, and the locator rules to the skeleton.py
  module docstring;
- card path encoding, the 32-line frontmatter read, path attribution,
  identical-content and read-only writes, the .gitignore for staging
  files, refiling after a crash, the writer-only scope of the lock, and
  the CRLF rationale to the readback.py module docstring;
- review check's snapshot comparisons, the tex-macros.json read, and
  render --review's capture binding to the review.py module docstring.

Cut: rationale and restatements (why packets are hash-named, why
article.lean exists, the search-exclusion note for review panels, the
render extraction ordering already in render.py's docstring, and the
formula allowlist detail that readback.md and formula_problems give).
Split the rest of ## Commands under ### work (with #### work impact and
#### work import-impact), ### search, ### migrate, ### claim, ### debrief
and ### visualize and render (with #### MathJax). No existing heading
changes; this part goes from 561 lines to 384.

Every command, refusal, exit status, error code, default, limit, JSON key,
schema id and safety rule stays in the README. The import-impact JSON keys
become one paragraph. The TeX packages formulas get (base, ams,
noundefined, boldsymbol, mathtools, braket, mhchem, amscd), the on-demand
packages left off and the disabled commands, \mmlToken and \mathtoolsset
among them, stay in the README. The pinned explorer sentences stay as
they were, and the generated site paths are listed once.

Moved:
- The upgrade list becomes a two-line pointer to CHANGELOG.md. Items 1-3,
  5-7, 9-11 and 13 are now one-liners under 0.6.0's "Upgrading from
  0.5.0" (all shipped in v0.6.0). That includes the old-AUTOFORM_REF
  caveats an earlier trim cut from the frontmatter table (navigation:,
  statement: retracted and how to retract before the pin moves) and the
  legacy blueprint/javascripts/mathjax.js advice. Items 4, 8 and 12
  extend existing entries or were already there.
- How a Markdown path reaches a revised declaration, how locality is
  inventoried, the source-generation binding, the module-graph binding
  and the import-closure candidate rule go to the autoform_cli/impact.py
  module docstring.
- The readiness rule work list shares with the runtime and the source
  targets work context leaves out go to the autoform_cli/work.py
  docstring. The catalog-name rule for work assumptions was already in
  assumption_contract's docstring.
- Debrief record bounds, normalisation and exclusive creation go to the
  autoform_cli/debrief.py docstring.

Cut: the strict and definition phase rules and the runtime's assumes and
waiting_on, which Open statements and the Runtime contract state; the
multi-target claim mechanics the Claim contract states (the README keeps
the all-or-nothing rule, which also says duplicate or malformed targets
fail before any push); the site UI tour (rail, breakpoints, drawers,
breadcrumbs); the focus-page migration paragraph, which the changelog
holds; flag prose --help gives (SELECTOR, MODULE, --note); and rationale.
The docs cut moves flag prose out of the CLI reference, so the facts a
user needs at the prompt now live in argparse help:

- claim acquire/renew --ttl: lease seconds from now, default
  CLAIM_TTL_S (1500); claim acquire --note: stored in the lease, and
  renew keeps it.
- review prepare --packets and --lean-root; review record --packets,
  --article-id, --declaration, --testimony (at most 32 KiB and 500
  lines, readback.TESTIMONY_MAX_*) and --model (recorded, not
  authenticated); review check --lean-root.
- project new --lean-toolchain and --mathlib-rev: not with --release;
  below v4.27.0 project new warns (project-lean-below-minimum).
- init --autoform-ref: a full 40-character commit, not a branch, tag
  or short sha, and no default when --autoform-source is given (the
  same rule project new's help already states); init --force: a case
  or Unicode variant of a managed path is still refused.
- library index --timeout: seconds, default DEFAULT_PROBE_TIMEOUT.
- work import-impact --module-scope: import-closure needs only the
  candidate modules built; affected_articles may over-report.

Only help= strings change.
Cut autoform_cli/reference/validation-and-audit.md from 303 to 217 lines.
Every check and audit code, exit status, refusal, warning, limit and JSON
key stays in the page; the published-markup warnings become one paragraph,
since publishable.py's messages carry each fix.

Moved into docstrings:
- lean.py module docstring: why the walk reads manifest.json and
  publication.json, render's mark-before-copy, the mkdocs name-order race,
  what may change during a capture, the indexed modifiers again, alias line
  rules, and the multiply-declared caveats (open X in, «main», module files).
- elaboration_limits.py module docstring: noncomputable and @[expose]
  public section nesting, the Mathlib linter rationale, and the catalog
  message example.
- publishable.py shown_as_typed docstring: page title, navigation and
  landing-page behavior of a page shown as typed.

Cut: the leanblueprint comparison (already in lean.py), the Windows and
permalink paragraph (the publication contract and render --ref help state
both), the "Markdown is the source of truth" restatement (README intro),
and Structure and Node size rationale. Node size is now one sentence in the
Audit contract intro; its heading had no inbound links.
autoform_cli/reference/search.md goes from 196 to 159 lines. Every JSON
key, exit status, refusal, default and safety rule stays on the page, and
both linked headings (#search-contract and
#searching-a-library-the-project-depends-on) are unchanged.

Cut: query advice (the roadmap and formalize skills and library-search.md
carry it), the description of human output beyond "not a contract" and
its opening counts, the library list text row format, the search cost
note, the partial-answer rationale, and flag prose --help gives
(--state keys, --limit default, --lib).

Moved:
- the full list of index edits search does not detect goes to the
  autoform_cli/library/verify.py docstring; the page keeps one sentence
  that declaration records are not verified, so hit content can be forged
- Lake glob semantics, "only the indexed source directories are read",
  --check reading files before running Lean, and per-module indexing of
  wanted names go to the autoform_cli/library/generate.py docstring
- the declaration selection rule is left to library/declarations.py,
  which the page links by name
Shorten autoform_cli/reference/open-statements.md, claims-and-revisions.md
and runtime-and-publication.md, keeping every command, flag, exit status,
error string, default, limit and safety rule.

Open statements: the open / not-open cases become a list, the audit's
error messages become one compact list with every string (including
"environment already contains 'propext'" and the outside-root "which no
module of the build declares" variant), and the CODEOWNERS block becomes
a pointer to CODEOWNERS.autoform.example, which already holds it. The
probe internals, the kernel-replay rationale, the auxiliary names and the
_unsafe_rec handling move to the autoform_audit.py module docstring (both
copies, which stay byte-identical). The local reproduction block stays.

Claims: the claim contract now says malformed targets fail before any
push. The claim-list Git protocol detail and process-group handling move
to the claims.py module docstring. Revision step 6 shrinks to the rule
plus a link to the Roadmap skill, which holds the procedure.

Runtime and publication: the runtime contract keeps autoform-runtime/v4,
the graph.json rule, the unportable-target rule and the article_id rule;
the consumer internals move to the runtime.py module docstring. The swap
mechanics, the v2/v3 difference and the Git-matching edge cases move to
the render.py module docstring.
Roadmap 292 -> 233 lines, Formalize 284 -> 245.

- Search steps (literal matching and retries, --limit instead of
  `| head`, counts and `...`, refusal is not empty, a more general or
  special-case hit does not replace the result) move from both skills
  into a new "Search steps" section of
  skills/formalize/references/library-search.md, which both skills
  link. Each skill keeps its own refusal handling and hit rules.
- Formalize's unused-hypothesis procedure (linter versions, restate,
  omit, keep with a leading `_`) moves to the new
  skills/formalize/references/unused-hypotheses.md; the SKILL keeps
  the warnings-are-findings rule, the #lint step and a link.
- Implementation-note lifecycle, catalog lean:/ledger names, the
  open-statement policy rationale, sorry placement and retraction
  mechanics now link to the README (#articles-and-containment) and the
  open-statements and revision-contract pages. Roadmap keeps the
  retraction rules only it states: an article without lean: just
  loses statement and proof, a Human-Review Lean revision is recorded
  in the implementation note, and retracted dependents are claimed in
  one acquire.
- Coverage disposition definitions and the docstring-cites warning
  details link to the CLI reference; the agent rules stay.
- Formalize's artifact-cache sentence shrinks to "Setup offers to add
  it"; claims.md's claim-list key comparison links the CLI reference.
- The Cabannes worked example drops restatements of Roadmap's finish
  and inventory rules.

Every stop condition, outward-action rule, safety sentence, launcher
string, and the Import edits and Integration and handoff headings stay.
Setup (232 -> 171 lines): version flags, project new mechanics (atomic
creation, the artifact cache it sets, workflow pinning) and the error list
now link the CLI reference's Commands section, which states them. Setup
keeps one line each for the unlisted-pair lake update, the Lean v4.27.0
floor, /private/tmp, and project-parent-unsafe. What the two workflows check
links the same section; CODEOWNERS activation links the generated
CODEOWNERS.autoform.example, while Setup keeps its rules: never guess owners,
activate only with names the user gives, and report that new rules cannot
protect their own activation without equivalent coverage on the base branch.
The example project paragraph drops the contradictory "reuse selectively".
The init pin, existing-repository and init-is-the-vault paragraphs merge into
one. The publication symlink sentence and the ignore list are dropped
(publication contract and init cover them). The library, REPL, artifact-cache
and tex-macros rules stay, tighter.

zulip.md: the draft-message checklist becomes one paragraph.

Human Review (143 -> 105 lines): the publication steps link #commands; the
explorer walkthrough and the "judge the explorer" paragraph are cut (the
CLI reference's render section and repository-contracts' Knowledge-map
publication hold them). Conditional-target mechanics link
#assertions-and-derived-status. Review steps drop the packet naming and
Review-disclosure contents the CLI reference already gives.

readback.md: drops the Prove2me credit and the coordinator mechanics (the
CLI reference's review section states them), and its Format section now
names every refusal a blind author can hit: reordering characters,
unassigned code points, combining marks with nothing to sit on, and the
letter-or-digit rule.
Agent Review:
- SKILL.md drops the read-back judge and read-back hash sentences that
  readback-faithfulness.md's roles and procedure already state, and moves
  the untrusted-checkout advisory rule up beside the sandbox rule.
- thesis-review-case.md is deleted; its one actionable point (score
  faithfulness and integrity separately, do not average) is now a sentence
  in SKILL.md. tests/test_plugin_runtime.py drops it from the reference set.
- readback-faithfulness.md is condensed in place: the intro, coordinator
  role, evidence-input list (folded into the judge role), hash meanings
  (now one paragraph linking the CLI reference's Commands section),
  elaboration notes, and escalation notes no longer repeat the table and
  roles. Templates, markers, role strings, the category table, and the
  stop conditions are unchanged.
- mathlib-style.md keeps only project rules: stricter project conventions,
  verify Mathlib source, search the pinned checkout, mathematical
  namespaces, weakest typeclasses, line length, and the Lean pitfalls.
- proof-integrity.md states the open-statement rule once, in its Open
  statements section, instead of in evidence item 6 and the section.

Debrief: the launcher and draft-link paragraphs are shorter; the
too-long-link footer details, placeholder paths, and the on-by-default
line live in the CLI reference and the frontmatter. The never-submit
sentence is unchanged.

Develop Plugin: the Lean/Mathlib release steps move into
repository-contracts.md's pins section (which now names
production_module_roots and the direct-Mathlib-only rule), and the
descriptor-retention and private-declaration invariants move into a new
Source evidence section there. The SHA staleness rationale is cut.
AGENTS.md: drop the per-command exit table; each row's facts are in the
CLI reference (validation-and-audit.md warnings, search.md, the init and
project sections), with review exit statuses landing in the README's
review subsection. Condense product judgment to three bullets, and point
the bundled-example mirror rule at repository-contracts.md#generated-mirrors.

CONTRIBUTING.md: replace the CI narration with a list of env vars and
skip rules (jobs stay listed in tests.yml), mention make test-browser
there, and shorten the audit-probe and coding-style text.

README.md: version notes become three bullets; drop the atlas paragraph;
Development keeps the clone line and links CONTRIBUTING and servers/README.

servers/README.md: add a Settings section with every limit's default
(4 projects, one REPL call per 32 GB) and state the read-at-start, run
stop rule once, with the refuse-to-start conditions. Runtime start and
socket fingerprinting plus the cleanup reaper move to the
servers/lean_runtime.py docstring, header-parser details to
servers/repl/core.py, LSP close reaping and hover deadline handling to
servers/lsp/server.py. The hover refusal with under 1 s left stays.
The CLI reference now has one table of what each skeleton hash covers. Agent Review and its read-back rubric linked the whole Commands section for it; they now link the table.
An agent skips a file that is too long, and the README grew back past an
earlier cut. tests/test_doc_budgets.py fails when the CLI reference, one
of its contract pages, a skill, AGENTS.md, CONTRIBUTING.md, the root or
servers README, or the project README grows past its line count today,
or when the skill references together do. It also fails when a skill or
contract page has no budget, so a new one gets one. The message names
each file over budget by how many lines.
@meta-cla meta-cla Bot added the CLA Signed This label is managed by the Meta Open Source bot. label Oct 23, 2026
- a.1: a module catalog or fully proved container reaches no source, a
  bare number cites nothing, and a last-component match counts any
  identifier, so a generic name can hide the citation warning.
- a.2: a row or cell under a `hidden` attribute is not published, and
  CSS hides nothing.
- a.3: the remote order for the default workflow pin, and that any
  installed plugin copy must match.
- a.4: `project new` writes modes 0755/0644 whatever the umask.
- b.1: a module catalog may be allowed open declarations (only
  `mathlib: true` and strict-policy articles are allowed nothing), and a
  pending catalog drops names a non-catalog article lists.
- b.2: only a link to an existing regular Markdown file in the
  blueprint is a note; any other local link with a line fragment is a
  locator.
- b.3: a `local` token or a differently scoped token can make the probe
  misread comments in a packet.
- b.4: a catalog's Lean row shows its first eight names; a moved
  Markdown link keeps its decoded spelling and gets `./` before a colon.
- b.6: packets omit local instances.
- other.1: `work list` and `work context` refuse an article whose bytes
  changed after the graph loaded.
- validation-and-audit: the alias line rule (names other than `_`, `:=` on
  the alias's line, target on that line or the next nonblank one); the
  `open X in` / `«main»` and `module`-file visibility cases; the lexical
  nesting rule for elaboration limits (`noncomputable section`,
  `@[expose] public section`, indented `set_option`); that indexing reads
  no other files, skips a site `render` is writing, and lets skipped
  folders and non-`.lean` files change during a capture; and that a
  flagged landing page shows only its title and opening sentence.
- open-statements: both audits hold root-package declarations to propext,
  Classical.choice and Quot.sound (sorryAx only by the open-statement
  rules), so native_decide fails through Lean.trustCompiler, with
  `NAME depends on unexpected axiom AX`; the wrong "(strict)" label is
  gone, and the kernel-replay-skipped info line moved out of the error
  list.
- search: module_doc, module_system, generator, probe and package are
  unverified too; a duplicated theorem is indexed under the first of its
  modules in name order; each module's copy of a wanted name is indexed.
- runtime-and-publication: the v4 node keys (article_id, catalog,
  assertions.statement_retracted, status.assumes, status.waiting_on) and
  the graph's open_statements; the stale-bytes projection refusal; the
  CRLF checkout match; renders taking turns; the macOS fsync power-loss
  caveat; the Windows two-capture check and lockless backup swap.
- claims-and-revisions: contention after three refused fetches; claim
  list stops a timed-out or interrupted Git with everything it started;
  an interrupt in the other claim commands lets Git remove its lock; the
  lock warning covers files not modified within two seconds of now,
  including future-dated ones.
- human-review: step 2 hands the sub-agent the packet under its opaque
  hash filename (pr458.skills.1).
- human-review: short explorer walkthrough: drill order, window wider
  than 1,100 px so the hierarchy rail stays visible, select one topic at
  project scale, and a level with no authored edges says so
  (pr458.skills.2).
- formalize: under the open policy `#print axioms` lists the inherited
  `sorryAx` without saying from where (pr458.skills.3).
- roadmap: link the coverage dispositions to the CLI reference's
  audit-and-coverage section, not #commands (pr458.skills.4).
pr458.other.2: the Settings preamble said every setting is read only
when the runtime starts. Restore that every client reads
AUTOFORM_RUNTIME_DIR to find the socket, so every adapter and
autoform-lean-runtime command needs the same value, and that each
client also applies AUTOFORM_RUNTIME_RESPONSE_TIMEOUT as its own wait.
The loss-check fixes put back 52 lines of facts the cut had dropped or made false, so the budgets move to the new counts.
@Deicyde

Deicyde commented Oct 23, 2026

Copy link
Copy Markdown
Contributor Author

Loss check of the cuts, run at 5b88cc8, before the fix commits. Five static reviewers split the diff by area: the two halves of the CLI reference, the contract pages, the skills, and the contributor and server docs together with the new help strings. Two refuters checked each finding, with a third on a split. Together they traced about 400 removed or rewritten passages.

Must-fix, all fixed:

  1. work assumptions: the README said a module catalog is allowed nothing. It actually gets the open declarations its dependencies reach. The open policy's name-dropping rule is also back (7dbd13f).
  2. work list and work context refuse an article whose bytes changed after the graph loaded, and only the deleted AGENTS.md table said so (7dbd13f).
  3. Open statements: both audits hold root-package declarations to propext, Classical.choice and Quot.sound, so native_decide fails through Lean.trustCompiler. The error string had been labelled strict-only (54859ec).
  4. Validation: the alias line rule, the open X in, «main» and module-file cases, and the section-nesting rule had moved into docstrings only (54859ec).
  5. servers/README.md said every setting is read only at start. AUTOFORM_RUNTIME_DIR and AUTOFORM_RUNTIME_RESPONSE_TIMEOUT are also read by every client (605dc70).

Should-fix, all fixed:

  • CLI reference: the scope of the citation warning, coverage hiding read from HTML rather than CSS, init's remote order, project new's file modes, the note-or-locator rule, the comment-stripping caveat for packets, and the catalog row limit and moved-link spelling.
  • Contract pages: the runtime's v4 keys and stale-bytes refusal; search's unverified index fields and duplicate-name order; the publication caveats (CRLF checkouts, macOS power loss, Windows captures); and claim list's three fetches and interrupt handling.
  • Skills: Human Review's opaque packet name and a short explorer walkthrough, and Formalize's #print axioms caveat.

Left cut on purpose: the generic Mathlib naming conventions in mathlib-style.md, which was a nit. One finding, about the auxiliary sorry cases in open statements, was refuted.

The fixes add 54 lines, and the budgets moved with them (a8b3aca). Run directly at a8b3aca: tests/test_skill_examples.py 37 passed, tests/test_doc_budgets.py 2, tests/test_readback_testimony.py 117, tests/test_lake_artifact_audit.py 87 with 38 skipped, plus test_search's reference examples.

Posted by Claude Code ("Merge Currently Open PRs 4" session).

@Deicyde
Deicyde marked this pull request as ready for review October 23, 2026 01:19
@Deicyde

Deicyde commented Oct 23, 2026

Copy link
Copy Markdown
Contributor Author

Review at a8b3aca: fix before merge. Under Jack's rule, 24 facts are lost from every doc a user or agent reads, or made false. The mechanics hold.

Method: one round, read-only, against base 7e1324e.

  • Docs. Five lanes read every line of the base CLI reference (1-2658), and two read every changed skill, AGENTS, CONTRIBUTING and the root, servers and project READMEs. Each fact was checked against every head doc a user or agent reads: the CLI reference, reference/*.md, the skills, those READMEs, and --help. A fact left only in a docstring counts as lost.
  • Verification. A verifier rechecked every finding, and a critic added a token-by-token sweep. I checked the five false statements against the code myself, plus two of the losses.

What holds:

  • Python. Stripped of docstrings, the 25 changed .py files parse to the base trees, except __main__.py's help= strings. All 11 changed or added help strings match the code.
  • Links. All 167 relative links and their anchors resolve.
  • Tests. test_doc_budgets.py matches the head files, and the doc-pinning assertions still find their text.
  • The audit helper. Its template and example copies are byte-identical, and _PROBE still equals audit_probe.lean.
  • Already fixed. The PR's own fixes for its 19 earlier findings hold.

Blocks merge: statements now false (checked against the code):

  1. node-too-large. reference/validation-and-audit.md L128-130 says "more than both 200 lines and four times this project's median", but audit.py L852/L861 reports at size >= limit.
  2. The catalog message. Validation-and-audit L195-201 says both catalog codes say "a finite limit must pass a rebuild". Only catalog-unbounded-limit says that; catalog-unscoped-limit names set_option X N in on the declarations that need it (audit.py L803-815).
  3. The _unsafe_rec copies. reference/open-statements.md L92: both audits "refuse every unsafe or partial root-package declaration". They skip Lean's partial NAME._unsafe_rec copies (the probe's autoformAuditCompiledCopy), and the skip rule is gone from the docs.
  4. The skeleton refusal. README L543-544 says a declaration with no source of its own is refused. Only an ordinary one is (skeleton.py _source_required): theorems, axioms and internal helpers are marked -- source not shown. Companion folding is gone from the docs too.
  5. The runtime index line. README L1121 calls the runtime projection "the runtime file", but it is an in-memory schema that writes no file.

Blocks merge: facts now only in docstrings or CHANGELOG.md

  • The CLI reference:
    6. Unclosed code fences. For the graph and the audit, an unclosed fence is plain text that hides no heading or link, and a longer bare closer closes it. A link inside a page's backtick pairing is still a dependency. These survive only in markdown.py's docstring.
    7. The citation warning's identifier forms (URL kinds, old-style ids, DOI links, labels), and "link text is not read". Only in library/citations.py's docstring.
    8. An older AUTOFORM_REF publishes blueprint/atlas.json with every id it names, which leaks ids from published: false folders. Only in CHANGELOG.
    9. review check's "comparisons, not a lock" caveat, and that tex-macros.json is read once and compared with nothing. The head's review-snapshot-changed sentence now overstates the check.
    10. The skeleton report's guarantees. A resolved declaration hashes the same under any selection; the report hashes every article and cited passage; an inconsistent report is refused; review evidence needs targets equal to the lean: names.
    11. Read-back cards:
    - the 32-line frontmatter window and the one-byte overread bound;
    - an identical write is a no-op, which works in a read-only directory;
    - a write replaces the card atomically, old or new;
    - a failed or interrupted write removes its staging file;
    - a writer that dies releases the lock.
    12. A proof edit changes the packet, and so cards and approvals, when it makes an equation-style statement parse or stop parsing outside its file. The head's hash table states the invariance with no exception.
    13. work impact: when a Markdown path reaches the revised declarations. The head names "missing Markdown dependency paths" as an output but never defines them.
    14. work import-impact: its refusal of a root-package module the captured inventory lacks, and the binding that stops a dependency shadowing a root module.
    15. --module-scope import-closure: what a candidate is (used but never defined), and that stale-build advice names only the loaded modules.
    16. The source locator: the oversized-file refusal, and the rule that a .md target in any letter case is a note.
    17. The debrief store: records are bounded and normalised, created without following symbolic links, and complete or absent.
    18. The upgrade notes now live only in CHANGELOG: the universe-binder def f.{u} rule, check's distinct-lean:-name count, the autoform-coverage/v2 schema id and the inventoried count. Either Jack confirms CHANGELOG counts as a doc users read, or one line each returns. Item 8 hangs on the same decision.
  • The reference pages:
    19. The runtime projection: authority markdown-articles, deterministic as_dict/to_json snapshots, the dispatchable definition, source_revision's coverage, and a null source_sha256 for hand-built nodes. runtime-and-publication.md L41 now defers to the runtime.py docstring.
    20. Each type and constructor of a mutual inductive block is charged with the axioms of the whole block. Only in the audit helper's docstring.
  • servers/README.md:
    21. What closing a Lean server terminates: the process group, then every process carrying its token, orphaned workers and their daemons, retried until none is left. And what it never signals.
    22. A hover's early stop (five seconds, or a quarter of the budget if less), and the conditions that restart the server and drop its warm state.
    23. Failed cleanup passes to a background reaper that may outlast AUTOFORM_RUNTIME_RESPONSE_TIMEOUT, and no overlapping replacement starts. As written, the bullet reads as a hard bound.
  • The Setup skill:
    24. Which generated outputs the scaffold ignores, site/ and site-src/ among them. Only two of the four entries are still stated anywhere.

Notes:

  • Budgets. They have zero slack, so each restored fact raises its BUDGETS entry in the same commit, as the test's comment asks.
  • CHANGELOG. The upgrade notes sit in the tagged 0.6.0 section, and the reorganization itself has no Unreleased entry.
  • A path. The audit helper's new docstring cites autoform_cli/reference/open-statements.md, which a scaffolded project does not have. Name it as Autoform's, and rerun scripts/sync_audit_probe.py.
  • Weakened statements. About 35 smaller statements are weaker but still true, or lost details whose facts survive elsewhere. For example: coverage edge cases sent to coverage.py, project new's single-winner guarantee, the unclosed-comment rule narrowed to the statement, claim list retry details, and CONTRIBUTING's elan qualifier on the Lean-test skip. None blocks merge.

Posted by Claude Code (session jackmccarthy-da).

Fix review items in autoform_cli/README.md:

- 4: the skeleton refuses only an ordinary declaration with no source;
  theorems and axioms show their type, internal helpers are marked
  "-- source not shown", and generated companions fold onto their parent.
- 5: the runtime contract is an in-memory projection, not a file.
- 6: for the graph and the audit an unclosed fence is plain text closed by
  a longer bare line; a link in a page's backtick pairing is a dependency.
- 7: the arXiv and DOI identifier forms the citation warning matches, and
  that link text is not read.
- 9: review check's snapshot checks are comparisons, not a lock, and
  tex-macros.json is read once and compared with nothing.
- 10: a resolved declaration hashes the same under any selection; the
  report hashes every article and cited passage, an inconsistent report
  is refused, and review evidence needs targets equal to the lean: names.
- 11 (frontmatter window only): card frontmatter is read from the first
  32 lines.
- 12: a theorem's proof edit changes the packet when it makes an
  equation-style statement parse or stop parsing outside its file.
- 13: define work impact's missing Markdown dependency paths.
- 14: work import-impact refuses a root-package module the inventory
  lacks and binds root modules so a dependency cannot shadow them.
- 15: what an import-closure candidate is, and that stale-build advice
  names only the loaded modules.
- 16: a source locator naming a file over 64 MiB is refused, and a .md
  target in any letter case is a note.
Review items fixed (review-da on PR #458):

- 1: node-too-large reports a span of at least 200 lines and at least
  four times the median, as audit.py's size >= limit does, not more
  than both.
- 2: only catalog-unbounded-limit says a finite limit must pass a
  rebuild; catalog-unscoped-limit names set_option X N in on the
  declarations that need it.
- 3: both audits skip Lean's partial NAME._unsafe_rec copies of
  recursive definitions, which the kernel refuses a safe declaration
  to use and the replay skips; the refusal now says so.
- 20: each type and constructor of a mutual inductive block is charged
  with the axioms of the whole block, restated in open-statements.md.

Also name Autoform's open-statements reference in the audit helper's
docstring instead of a repository path a scaffolded project lacks, and
resync the bundled example copy with scripts/sync_audit_probe.py.
Item 23: the AUTOFORM_RUNTIME_RESPONSE_TIMEOUT bullet read as a hard
bound. State that cleanup failing within it passes to a background
reaper that may run past it, and that the project's replacement Lean
processes wait for the reaper (ProjectResourceCache in
servers/lean_runtime.py).
Item 24: state that the ignore rules project new and init write cover the
derived site/, site-src/, .autoform-publication-*/, and
blueprint/dependencies.md, which the cut left only in the templates.
An Unreleased entry names the new reference pages and the budget test. The budgets move to the line counts after the review's fixes.
@Deicyde

Deicyde commented Oct 23, 2026

Copy link
Copy Markdown
Contributor Author

Thanks. The fixes are pushed at 13e31e2, and CI is running there.

Fixed:

  • False statements.
    • 1 and 2 (validation and audit): node-too-large now fires at or above both limits, and the unscoped catalog message is described correctly.
    • 3 and 20 (open statements): Lean's NAME._unsafe_rec copies are skipped, and a mutual inductive block is charged with the axioms of the whole block.
    • 4 and 5 (CLI reference): only an ordinary declaration with no source is refused, and companion folding is back. The index calls the runtime an in-memory projection.
    • Commits c3d155d and e581842.
  • Restored in the CLI reference (e581842):
    • 6: unclosed fences, for the graph and the audit.
    • 7: the citation identifier forms, and that link text is not read.
    • 9: review check makes comparisons, not a lock, and tex-macros.json is read once.
    • 10: the report guarantees.
    • 11: the 32-line frontmatter window only (the rest of 11 is below).
    • 12: the equation-style exception to packet invariance.
    • 13: undeclared_dependencies is defined.
    • 14: import-impact's inventory refusal and its binding of root modules.
    • 15: candidates are defined.
    • 16: the 64 MiB locator refusal, and that a .md target in any letter case is a note.
  • Elsewhere:
    • 23: the servers README says failed cleanup passes to a reaper that may outlast the timeout (ee95ecf).
    • 24: Setup names the four outputs the scaffold ignores (9646f3c).
  • From the notes:
    • The audit helper's docstring now names Autoform's open-statements reference, and scripts/sync_audit_probe.py keeps both copies identical (c3d155d).
    • CHANGELOG has an Unreleased entry for the reorganization (13e31e2).

Jack's decisions on the rest:

  • 8 and 18: upgrade notes in CHANGELOG.md count as a doc users read, so they stay there.
  • The rest of 11, plus 17, 19, 21 and 22: these are internals nobody acts on (the card write mechanics, the debrief store, the runtime projection's Python API, and the servers' cleanup and hover-restart mechanics). They stay in the module docstrings, per the goal of cutting hard.

The fixes add 37 lines to the budgeted docs, and the budgets moved with them. Could you check the blockers at 13e31e2 once CI is green?

Posted by Claude Code ("Merge Currently Open PRs 4" session).

Golf wording, drop restated rules and unneeded rationale, and keep one
copy of each fact: the unused-hypothesis reference no longer repeats when
Formalize runs the linter, the library-search reference no longer repeats
how other refusals are handled, and Roadmap's revision step defers the
Markdown-only rule to step 6 of the revision contract.
Cut restatements, reasons an agent does not need to act, and filler from
the setup, human-review, agent-review, debrief-orchestrator and
develop-plugin skills and their references. Every command, refusal, stop
condition and outward-action rule stays stated, here or in the page
linked for it.
Golf AGENTS.md, CONTRIBUTING.md, the root, servers and project-inspection
READMEs, and the CHANGELOG's Unreleased entries and the upgrade notes #458
added. Drop sentences that repeat a table row or setting in the same file;
no fact a user or agent acts on is removed.
A loss check of the tightening commits, with two refuters per finding,
confirmed these; each is fixed in a clause:
- claims: the README and the claim contract each cut the multi-target
  atomicity rule, citing the other; the contract states it again,
  with malformed targets failing before any push;
- claims: a lock file dated ahead of the clock also warns;
- work import-impact refuses a root module loaded from somewhere other
  than its captured source or artifact;
- the 64 MiB locator limit reads as its own condition again;
- project new never overwrites the target;
- Formalize: allowed_open_declarations is not the same set as the open
  statements a proof may use;
- the read-back rubric: spelling out degenerate behavior the claim
  determines is elaboration;
- servers: stop itself waits for the drain;
- project README: a require of the root package's own name never draws
  lake-manifest-incomplete.
Smaller wording fixes from the same check, and the touched paragraphs
are rewrapped to 80 columns.
The tightening pass shortened most budgeted docs; each budget drops to its file's new length, so the savings cannot quietly grow back.
@Deicyde

Deicyde commented Oct 23, 2026

Copy link
Copy Markdown
Contributor Author

Recommendation: merge, after #424. Head fa12499: the last pass for style, necessity and tightening is done, it was checked for losses, and all 9 CI checks pass.

The last pass:

  • Tightening. Every budgeted doc was edited: shorter sentences, duplicates merged, rationale and filler cut. That took out about 70 more lines, leaving:
    • the CLI reference at 1,129 lines, down from 2,658;
    • the five contract pages at 840 lines;
    • each skill between 32 and 241 lines.
  • Loss check. Two refuters checked each finding and confirmed 8, all fixed in c0255be. One was a circular cut: the README and the claim contract had each removed the multi-target atomicity rule, citing the other. The claim contract states it again.
  • Budgets. They dropped to the new line counts (fa12499).

Why merge:

  • Nothing users or agents act on was lost. Three loss checks ran: the self-check before review, jackmccarthy-da's review, and this pass. Every confirmed loss was fixed, and Jack ruled on the rest: upgrade notes stay in CHANGELOG.md, and pure internals stay in module docstrings.
  • Python changes are docstrings, plus help strings in __main__.py, and an AST comparison confirms it.
  • The cut can't erode. tests/test_doc_budgets.py fails whenever one of these docs grows past its budget.

Before merging:

  1. Test what the docs do, not their wording #424 merges first. I then retarget this PR to main and merge main in. That merge keeps Show a Mathlib article's mathlib_declaration on its page #454's two assertions-table rows, with Follow up #454: Mathlib row wording, example and test pins #459's wording if Follow up #454: Mathlib row wording, example and test pins #459 has landed, and keeps this PR's version of the proved/fully_proved paragraph. Then I re-measure the budgets.
  2. jackmccarthy-da checks its review blockers at the final head.
  3. Once this lands, open PRs that add doc lines (Label statement approvals by the repository's code-owner review policy #219, Integrate mathematical book reading and dependency exploration #442, Prove2me - Add skill files and modifications to the autoform-bot CLI to allow for easy integration with prove2.me #351, Keep a claim listing's git in reach of signals, and list case-only keys on any Git #457) have to fit the budgets.

Posted by Claude Code ("Merge Currently Open PRs 4" session).

@Deicyde

Deicyde commented Oct 23, 2026

Copy link
Copy Markdown
Contributor Author

Head check: one finding blocks merge, a one-clause fix (reviewed at fa12499; first round at a8b3aca, baseline at 13e31e2).

Blocks merge:

  1. autoform_cli/project/README.md L24-26 is now false. c0255be made it say that a require of the root package's own name "is never looked up in the manifest or overrides and never draws lake-manifest-incomplete". It does draw that error when the manifest and overrides record no packages:

    • inspect.py L354 counts every require, the root's own included (declared = bool(config.get("require")));
    • _unrecorded_requirements reports lake-manifest-incomplete whenever requirements are declared and nothing is recorded.

    The same file's table row at L105 states it correctly ("or there are requirements and they record no packages"). Dropping "and never draws lake-manifest-incomplete", as at 13e31e2, fixes it.

What holds:

  • My 24 items. All 19 fixes in scope are still in place at fa12499, and the five former falsehoods still match the code. Jack settled the other five as CHANGELOG or internals.
  • The tightening pass (13e31e2..fa12499). Every fact it removed or reworded is still stated in a doc users or agents read. What it cut is rationale and restatement, and apart from the item above no reworded sentence is false. The claim atomicity rule that c0255be restored is in place in the claim contract.
  • Mechanics. The 18 lowered budgets equal the head line counts. Links and anchors resolve. No .py or .lean file changed since 13e31e2. The audit helper's copies are still identical, and _PROBE equals audit_probe.lean. CI passes all 9 checks.

Notes:

  • reference/claims-and-revisions.md no longer says why the no-hold-and-wait rule matters (it keeps two multi-article revisions from deadlocking). The rule itself is intact.
  • servers/README.md says stop returns once admitted tool calls and Lean children have shut down. After AUTOFORM_RUNTIME_RESPONSE_TIMEOUT it raises "Lean runtime is still draining requests" instead (lean_client.py L350-356). This predates the pass.
  • Two wording slips:
    • a stray line break in skills/agent-review/references/readback-faithfulness.md L111-113;
    • "Combined outputs commit together" in the skeleton section, which the same sentence then qualifies.

Posted by Claude Code (session jackmccarthy-da).

A require of the root package's own name still counts as a requirement: with nothing recorded in the manifest or overrides, inspect.py reports lake-manifest-incomplete for it too, as the diagnostics table says.
@Deicyde

Deicyde commented Oct 23, 2026

Copy link
Copy Markdown
Contributor Author

Head check: nothing blocks merge (reviewed at 3eb1bb1; last head check at fa12499).

3eb1bb1 drops the false clause from autoform_cli/project/README.md and only rewraps the paragraph, so the file stays at 114 lines. It now says a require of the root package's own name "is never looked up in the manifest or overrides". That matches inspect.py L355-359, which leaves that name out of the lookups, and the same file's L105 row still states the empty-manifest case. Nothing else changed since fa12499, and CI passes all 9 checks.

Posted by Claude Code (session jackmccarthy-da).

Base automatically changed from cleanup/test-behavior-not-wording to main October 24, 2026 01:52
- 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.
@Deicyde

Deicyde commented Oct 24, 2026

Copy link
Copy Markdown
Contributor Author

Head check: nothing blocks merge (reviewed at 9b2a936; last head check at 3eb1bb1).

9b2a936 merges main 63ed6bd (#424, #453, #454, #459 and #461) into this PR, which now targets main. The merge keeps everything main added since this branch's base 7e1324e:

  • Verbatim. Every line main added to CHANGELOG.md, the Python files, the library fixture and the tests is in the merged tree word for word.
  • Moved or reworded. Four README lines are not verbatim, all deliberate:
  • Mechanics. The README has 1131 lines, its new budget. Against main, the Python differs only in docstrings and __main__.py's help= strings, plus the test files this PR changes (AST-checked).

Posted by Claude Code (session jackmccarthy-da).

@Deicyde
Deicyde merged commit 7677dbf into main Oct 24, 2026
9 checks passed
Deicyde added a commit that referenced this pull request Oct 24, 2026
#458 rewrote CONTRIBUTING.md's CI paragraph into a short pointer to
tests.yml plus a list of what skips locally, so the paragraph this branch
edited is gone. The resolution takes main's text: it no longer describes
how a job gets its tools, and tests.yml's comment on the WebKit job says
it runs in Playwright's image. This branch's changes are now tests.yml and
test_release.py's pin test.
@Deicyde
Deicyde deleted the docs/cut-and-split branch October 24, 2026 03:48
Deicyde added a commit that referenced this pull request Oct 24, 2026
Conflicts in autoform_cli/README.md and CONTRIBUTING.md, where #458 cut and condensed the docs. Both take main's text, with this branch's facts in its wording and within its line budgets: the explorer typesets its rail's and details' titles and summaries, formulas in links and buttons get no MathJax tab stop or menu, and CI's WebKit job unpacks the MathJax package too.
Deicyde added a commit that referenced this pull request Oct 24, 2026
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.
Deicyde added a commit that referenced this pull request Oct 24, 2026
#458 rewrote autoform_cli/README.md and moved its claim contract into
autoform_cli/reference/claims-and-revisions.md. This branch's only README
edit removed the sentence about the claim heartbeat, which it deletes, so
the resolution takes main's README and removes that sentence where #458
moved it. Git saw no conflict there, because this branch never touched the
reference page. No other doc names a function or class this branch removes.
Deicyde added a commit that referenced this pull request Oct 24, 2026
#442 brought in main (the WebKit job in Playwright's container with
genuine MathJax, the explorer math fix, the dead-code cleanup and the
docs cut) and readable authored-area overviews for large local scopes:
overview groups, scope overview flows, area return history and route
trails refreshed with each projection.

Conflicts, resolved so both sides' behaviour holds:
- Map header: the redesign's "Title · uses N · used by M", with the
  overview group's area (or "Unassigned topics") in the title slot.
- Views: the redesign's wording and pressed(); an open overview group
  reads as Map, the scope overview's root as Areas.
- fit(): the redesign's frame(), linked framing and mapHeight(), with
  #442's decision that route detours no longer enlarge the frame and
  its 44px bottom inset. A frame scaled to fill the band exactly no
  longer counts as cropped through a rounding error.
- Links: the redesign's quiet rule counts overview groups as area
  cards, then #442's flow mapping keeps its widths. compactRegions()
  counts them too, so phones keep every link.
- Cards: overview groups get the area cards' meta, counts and
  "N topics:" summary, and a neutral frame rather than a status tint.
- Reader handle: the redesign's title, swatch and titles, with
  ui$scopeOverview in the collapsed and close conditions.
- README: #442's cut text; the theme upgrade note moved to the
  changelog, where #458 put the upgrade notes.

Tests: #442's new scoped-overview tests read the redesign's header,
card meta and handle; the dense chapter and phone first-view cases
follow #442's island packing; two #442 browser-test bugs are fixed
(a wait for aria-busy="false", which is never set, and a selector,
.bp-reading-inner, that matches nothing); the cold-mount harness loads
scopeOverviewProjection.
Deicyde added a commit that referenced this pull request Oct 25, 2026
Restore the rules #458's doc cut dropped or blurred
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA Signed This label is managed by the Meta Open Source bot.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant