Skip to content

docs: repo-wide documentation refresh — counts, paths, licence status, debt register - #352

Merged
hyperpolymath merged 2 commits into
mainfrom
docs/full-documentation-refresh
Aug 7, 2026
Merged

docs: repo-wide documentation refresh — counts, paths, licence status, debt register#352
hyperpolymath merged 2 commits into
mainfrom
docs/full-documentation-refresh

Conversation

@hyperpolymath

Copy link
Copy Markdown
Owner

Reconciles the documentation surface — human, machine-readable, and the wiki — against what the tree actually contains, and publishes what could not be reconciled as measured debt rather than leaving it unstated.

Prover counts (#251)

Five figures were in circulation — 48, 105, 128, 138, 141 — because four different things are all called "the number of provers". Re-measured:

Figure Value
ProverKind variants 141
Backend implementation files 105
Implementations with suggest_tactics 102
Default-exposed core (all_core()) 12

docs/PROVER_COUNT.md is now canonical, explains the denominators, and ships the command that reproduces each figure — all five were run and reproduce exactly. Present-tense claims elsewhere cite it. Dated historical records (release notes, completed milestones) keep their authoring-time numbers: they are records, not claims about today.

Wiki — corrected and synced

docs/wiki/ is the source and had drifted ahead of the live wiki, which had never been synced. Two substantive errors fixed:

  • the Tier-1 core list named six backends that aren't core (Idris 2, F*, Alt-Ergo, Dafny, Vampire, E Prover). The real set is Metamath, HOL Light, Mizar, PVS, ACL2, HOL4 — anyone trusting that page would have selected backends the default API does not expose.
  • the licence was stated as MPL-2.0 (see below).

The in-repo note claiming the wiki isn't pushable from automation was wrong; it's replaced with a working sync recipe (note: the wiki's default branch is master).

Licence — P0, identified and deliberately NOT acted on

The repository states four different licences:

Surface States
LICENSE, Cargo.toml, README badge AGPL-3.0-or-later
Per-file SPDX headers — 590 source files MPL-2.0
Per-file SPDX headers AGPL — zero files
NOTICE MPL-2.0, citing LICENSE (which is AGPL) for its text
.reuse/dep5 PMPL-1.0 AND Palimpsest-0.6

GitHub reports the licence as "Other" — likely the SPDX line prepended above the GNU text in LICENSE, which stops its detector matching.

This matters beyond tidiness: MPL is file-level weak copyleft with no network clause; AGPL reaches users served over a network. An integrator reading the headers would conclude they may host a modified ECHIDNA without publishing changes. Because per-file headers are themselves a licence grant, that is live exposure.

I have not changed any licence. Re-licensing is an owner decision affecting existing recipients and contributors. docs/DEBT.md sets out a suggested sequence and stops. Meanwhile the README and wiki now tell readers not to rely on any surface but LICENSE.

Also in this PR

  • Stale paths (Resolve structural drift stale path references as lifecycle hygiene #242): .machine_readable/6a2/ no longer exists (descriptiles moved to descriptiles/) — 17 documents repaired. The contractile .ncl write destinations naming 6a2/ were left alone deliberately: 6a2 is a concept name there, and repointing an evidence sink is a semantic decision (recorded as D7).
  • Broken links 19 → 13. The 13 remaining are dated release notes and the playground sub-project — recorded as D4/D5 rather than silently rewritten.
  • Root scaffold removed: ARCHITECTURE.md and GOVERNANCE.md contained generic template text with zero project-specific words while the real documents sat elsewhere. GitHub surfaces the .md, so the page most readers landed on described no particular project. Both are now explicit pointers.
  • OpenSSF badge removed: a hardcoded green shields.io label linking to the registration form — it would have read "passed" whatever the real standing, including now, unregistered. Restore the genuine dynamic badge once registered.
  • Repo description and topics updated: description had a typo (VersisimDB) and the stale 48; topics dropped languages GitHub already surfaces (agda/coq/julia), a duplicate (theorem-prover vs theorem-proving) and a generic (artificial-intelligence), replaced with capability terms — proof-assistants, proof-search, premise-selection, proof-certificates, smt-solvers.

New: docs/DEBT.md

Live debt register — P0 licensing, seven documentation items, four code items. Every entry carries the command that measures it, so entries can be retired on evidence rather than on feeling. Supersedes tech-debt-2026-05-26.md, which is kept and banner-marked as a dated snapshot.

Verification

  • R5a bare-prover-count rule: clean across all scoped top-level docs.
  • All five PROVER_COUNT.md commands run and reproduce their stated figures.
  • DEBT.md's own measurements re-run before commit; one corrected (588 → 590).
  • Wiki push verified by re-cloning and re-reading the live pages.

Known unrelated red: Governance fails on main for a hypatia scanner error (#314), not doc drift.

🤖 Generated with Claude Code

…, debt register

Reconciles the documentation surface (human, machine-readable, wiki)
against the tree, and publishes what could not be reconciled as
measured debt rather than leaving it unstated.

Prover counts (issue #251). Five different figures were in circulation
— 48, 105, 128, 138, 141 — because four different things are all called
'the number of provers'. Re-measured: 141 ProverKind variants, 105
backend implementation files, 102 with suggest_tactics, 12 default-
exposed core. docs/PROVER_COUNT.md is now canonical, explains the
denominators, and ships the command that reproduces each figure; all
five commands were run and reproduce exactly. Present-tense claims
elsewhere now cite it. Dated historical records (release notes,
completed-milestone entries) were deliberately left at their
authoring-time numbers — they are records, not claims about today.

Wiki. docs/wiki/ is the source and had drifted ahead of the live wiki,
which had never been synced. Corrected and pushed: the Tier-1 core list
named six backends that are not in ProverKind::all_core() (Idris 2, F*,
Alt-Ergo, Dafny, Vampire, E Prover — actually Metamath, HOL Light,
Mizar, PVS, ACL2, HOL4); the licence was stated as MPL-2.0. The note
claiming the wiki is not pushable from automation was wrong and is
replaced with a working sync recipe.

Stale paths (issue #242). .machine_readable/6a2/ no longer exists; its
six descriptiles moved to descriptiles/. Repaired 17 documents. The
contractile .ncl write-destinations still naming 6a2/ were left alone
deliberately — 6a2 is a concept name there, and repointing an evidence
sink is a semantic decision. Recorded as D7.

Broken links: 19 -> 13. The 13 remaining are dated release notes and the
playground sub-project, both recorded as D4/D5 rather than silently
rewritten.

Root scaffold. ARCHITECTURE.md and GOVERNANCE.md contained generic
template text with zero project-specific words, while the real documents
sat at docs/ARCHITECTURE.md and GOVERNANCE.adoc. Since GitHub surfaces
the .md member, the document most readers landed on described no
particular project. Both are now explicit pointers.

OpenSSF badge removed: it was a hardcoded green shields.io label linking
to the project registration form, so it would have read 'passed'
whatever the real standing — including now, unregistered. Restore the
genuine dynamic badge once registered.

docs/DEBT.md (new) carries the rest, every item with the command that
measures it. P0 is licensing: the repository states four different
licences, and 590 source files carry MPL-2.0 headers while LICENSE and
Cargo.toml declare AGPL-3.0-or-later. Because per-file headers are
themselves a grant, that is live exposure, not an inconsistency of
record. NOT ACTED ON — re-licensing is an owner decision; the entry
sets out a sequence and stops. README and the wiki now warn readers not
to rely on any surface but LICENSE until it is resolved.

Verified: R5a bare-count rule clean across all scoped top-level docs;
every PROVER_COUNT command reproduces its stated figure; DEBT.md's own
measurements re-run and corrected (588 -> 590) before commit.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Comment thread docs/wiki/FAQ.md
| Surface | States |
|---|---|
| `LICENSE`, `Cargo.toml`, README badge | AGPL-3.0-or-later |
| Per-file `SPDX-License-Identifier` headers (588 source files) | MPL-2.0 |

@gitar-bot gitar-bot Bot Aug 7, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Quality: FAQ.md states 588 SPDX files; canonical DEBT.md says 590

docs/wiki/FAQ.md's licence table reads "Per-file SPDX-License-Identifier headers (588 source files)", but the canonical figure re-measured in this same PR is 590 (584 plain MPL-2.0 + 6 dual with Palimpsest-0.6), and the PR description explicitly notes the 588→590 correction. I reproduced 590 from the tree. Since FAQ.md is a synced live-wiki page presenting licensing debt, leaving the stale 588 recreates exactly the cross-surface count drift this PR sets out to eliminate. Update it to 590 to match docs/DEBT.md.

Align FAQ.md with the canonical 590 figure (584 plain + 6 dual) from DEBT.md.:

| Per-file `SPDX-License-Identifier` headers (590 source files) | MPL-2.0 |

Was this helpful? React with 👍 / 👎

@gitar-bot

gitar-bot Bot commented Aug 7, 2026

Copy link
Copy Markdown

Note

Automatic reviews are paused because your trial's included automatic processing has been used for this period. Upgrade now, or comment "Gitar review" to run a review anytime.
Learn more

Code Review 👍 Approved with suggestions 0 resolved / 1 findings

Comprehensive documentation refresh correcting prover counts, wiki drift, stale paths, and introducing a measured technical debt register. Update FAQ.md to match the canonical 590 SPDX files reported in DEBT.md.

Auto-approved and auto-merge armed: No blocking issues found.
Please see Auto-approve Docs for details on setting custom approval criteria. — merges when pipeline and required approvals pass.

💡 Quality: FAQ.md states 588 SPDX files; canonical DEBT.md says 590

📄 docs/wiki/FAQ.md:60 📄 docs/DEBT.md:36 📄 docs/DEBT.md:44-46

docs/wiki/FAQ.md's licence table reads "Per-file SPDX-License-Identifier headers (588 source files)", but the canonical figure re-measured in this same PR is 590 (584 plain MPL-2.0 + 6 dual with Palimpsest-0.6), and the PR description explicitly notes the 588→590 correction. I reproduced 590 from the tree. Since FAQ.md is a synced live-wiki page presenting licensing debt, leaving the stale 588 recreates exactly the cross-surface count drift this PR sets out to eliminate. Update it to 590 to match docs/DEBT.md.

Align FAQ.md with the canonical 590 figure (584 plain + 6 dual) from DEBT.md.
| Per-file `SPDX-License-Identifier` headers (590 source files) | MPL-2.0 |
🤖 Prompt for agents
Code Review: Comprehensive documentation refresh correcting prover counts, wiki drift, stale paths, and introducing a measured technical debt register. Update FAQ.md to match the canonical 590 SPDX files reported in DEBT.md.

1. 💡 Quality: FAQ.md states 588 SPDX files; canonical DEBT.md says 590
   Files: docs/wiki/FAQ.md:60, docs/DEBT.md:36, docs/DEBT.md:44-46

   docs/wiki/FAQ.md's licence table reads "Per-file SPDX-License-Identifier headers (588 source files)", but the canonical figure re-measured in this same PR is 590 (584 plain MPL-2.0 + 6 dual with Palimpsest-0.6), and the PR description explicitly notes the 588→590 correction. I reproduced 590 from the tree. Since FAQ.md is a synced live-wiki page presenting licensing debt, leaving the stale 588 recreates exactly the cross-surface count drift this PR sets out to eliminate. Update it to 590 to match docs/DEBT.md.

   Fix (Align FAQ.md with the canonical 590 figure (584 plain + 6 dual) from DEBT.md.):
   | Per-file `SPDX-License-Identifier` headers (590 source files) | MPL-2.0 |

Options

Display: compact → Showing less information.

Comment with these commands to change the behavior for this request:

Compact
gitar display:verbose         

Important

Your trial ends in 3 days — upgrade now to keep code review, CI analysis, auto-apply, custom automations, and more.

Was this helpful? React with 👍 / 👎 | Gitar

@gitar-bot gitar-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ This PR is blocked due to unresolved code review findings.

Configure merge blocking · Maintainers can dismiss this review.

@gitar-bot
gitar-bot Bot enabled auto-merge (squash) August 7, 2026 11:39
gitar-bot[bot]
gitar-bot Bot previously approved these changes Aug 7, 2026

@gitar-bot gitar-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gitar has auto-approved this PR and enabled auto-merge (configure)

…ailures

Both observed while verifying this PR's own CI. Recorded with what was
actually confirmed and no more: the K9 error text is quoted verbatim;
the Rust CI failure is identified as a genuine post-build test failure
(exit 101 under llvm-cov) rather than the lockfile-pin startup failure
that masked it until the dtolnay/rust-toolchain relock, but the
individual failing tests are not enumerated and the entry says so.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
hyperpolymath added a commit that referenced this pull request Aug 7, 2026
)

Every Rust-touching workflow currently fails at startup, on `main` and
on every PR:

```
Lockfile pin 4cda84d5c5c54efe2404f9d843567869ab1699d4 for `dtolnay/rust-toolchain`
does not match ref `stable`
```

`stable` is a **moving ref** — dtolnay re-points it at each Rust release
— so a lockfile pin against it goes stale on upstream's schedule, not
ours. Upstream now resolves to `4360b525…`.

**Affected while stale:** Cargo Audit, MVP Smoke, Server Boot Gate, Live
Provers, Rust CI, S4 Loop, Chapel CI, Formal Verification — all fail
*before running a step*.

### Worth knowing for the estate sweep

`gh actions-lock --relock` **alone does not fix this.** A plain
`--relock` leaves pins whose recorded commit is no longer reachable
upstream as errors; **`--accept-moved` is required** to re-resolve them.

Two tool side-effects were reverted rather than committed:

- it re-inserted its `managed by gh actions-lock` marker at **line 1**
of all 31 workflows — duplicating the marker already at line 2 and
displacing the SPDX identifier, which the Workflow Security Linter
requires on line 1 (it greps `head -1`). Deduped and restored.
- it added a lockfile entry for `main-estate-audit.yml`, an untracked
scratch file that is not part of the repository. Removed.

The result is a **one-line diff**.

### Recurrence

This will happen again every time upstream moves `stable`. The durable
fix is either pinning a released tag instead of a moving ref, or
scheduling a periodic relock. Not done here — this PR restores CI and
nothing more.

Split out of #352 (documentation refresh) deliberately: that PR changes
no CI behaviour, and this one changes nothing but.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
@hyperpolymath
hyperpolymath merged commit d81aca7 into main Aug 7, 2026
34 of 52 checks passed
@hyperpolymath
hyperpolymath deleted the docs/full-documentation-refresh branch August 7, 2026 13:42
hyperpolymath added a commit that referenced this pull request Aug 7, 2026
…t split (#354)

Applies your ruling — **AGPL for echidna** — and implements the two
boundary decisions: the playground stays MPL-2.0, and the documentation
surface normalises to CC-BY-SA-4.0.

**Stacked on #352** (base is `docs/full-documentation-refresh`, not
`main`) because it retires that PR's P0 debt entry and rewrites the
licence warnings it added. Merge #352 first; this then targets `main`
automatically.

## Answer to the compatibility question

**Yes — and in exactly the direction needed.** MPL-2.0 §3.3 designates
the GNU licences, *including AGPL-3.0+*, as "Secondary Licenses": MPL
files can be combined into an AGPL work and the combined work
distributed under AGPL, while those files individually remain available
under MPL. I verified no file carries the Exhibit B `Incompatible With
Secondary Licenses` notice that would break this — the only match in the
tree is inside `LICENSES/MPL-2.0.txt`, which is the licence's own
boilerplate.

## What I found looking for the components you expected

You anticipated borrowed code from gossamer, snifs and similar. In this
repo there is essentially none:

| Check | Result |
|---|---|
| `crates/` shared with other estate repos | none — all five are
echidna-only |
| gossamer / snifs code | absent; the gossamer mention is a *pattern*
reference ("same ABI/FFI pattern that runs in `proven`, `burble`,
`gossamer`") |
| vendor / third_party dirs | none |
| Institutional or corporate copyrights | none |
| Copyright holders asserted | all you / ECHIDNA — **except 7 files** |

The only externally-attributed code is
**`echidna-playground/src/*.res`** ("Coq-Jr Contributors"). So the MPL
headers everywhere else were historical residue from the MIT/Palimpsest
→ MPL migration, not a marker of borrowed code — which is what makes
relicensing them straightforward: you hold the copyright.

## The split

| Part | Licence | Files |
|---|---|---|
| Code — `src/`, `crates/`, `ffi/`, `proofs/`, `spark/`,
`verification/`, build system, CI, machine-readable metadata |
**AGPL-3.0-or-later** | 594 + 6 dual |
| Documentation — `docs/`, top-level `.md`/`.adoc` | **CC-BY-SA-4.0** |
92 + 1 dual |
| `echidna-playground/` | **MPL-2.0**, untouched | 35 |

## Method — why this isn't the sweep that went wrong before

Identifiers were **replaced in place on `SPDX-License-Identifier:` lines
only, never inserted**. A previous estate sweep mis-licensed files by
imposing a header where a different one already sat further down the
file. Consequences:

- prose mentioning MPL is untouched
- the **7 files granting `Palimpsest-0.6` keep that grant**
(`AGPL-3.0-or-later OR/AND Palimpsest-0.6`) — dropping half of a dual
withdraws a permission you granted, which isn't a documentation decision
- 3 workflows carrying `PMPL-1.0-or-later` folded into AGPL
- **SPDX stays on line 1 of all 30 workflows** (the linter greps `head
-1`)

Excluded deliberately: `LICENSES/` and `docs/legal/` — restating the
licensing *of a licence text* is confusing.

## Supporting files

- **`NOTICE`** rewritten. It previously said "licensed under the Mozilla
Public License" while citing `LICENSE` — which is AGPL — as its full
text. Now states the split, the §3.3 argument, and the licence history.
- **`.reuse/dep5`** rewritten; it claimed `PMPL-1.0 AND Palimpsest-0.6`
for everything.
- **`LICENSE`**: dropped two prepended SPDX lines, making it
byte-identical to `LICENSES/AGPL-3.0-or-later.txt`. That prepend is why
GitHub reported the licence as **"Other"**; expect it to detect AGPL-3.0
after merge.

## Verification (all re-run before commit)

| Check | Result |
|---|---|
| MPL outside playground / LICENSES / docs-legal | **0** |
| Code identifiers | AGPL-3.0-or-later (+ preserved Palimpsest duals) |
| Playground still MPL-2.0 | **35 files** |
| SPDX on line 1 of every workflow | **clean** |

## One thing left for you

**`Palimpsest-0.6` has no licence text** — not in this repo, not in
`standards/LICENSES/`. Seven files grant it, so REUSE cannot resolve the
identifier. I kept the grants and recorded it as the residual P0 entry.
Either supply `LICENSES/Palimpsest-0.6.txt`, or decide the grant is
retired and remove it deliberately. (Note `PMPL-1.0-or-later` *does*
have a text — different identifier.)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant