Phase 0: fork infrastructure
Some checks failed
CI / configure (push) Has been cancelled
Update stage0 / update-stage0 (push) Has been cancelled
CI / build (push) Has been cancelled
CI / build-secondary (push) Has been cancelled
CI / Build matrix complete (push) Has been cancelled
CI / release (push) Has been cancelled
CI / release-nightly (push) Has been cancelled
Some checks failed
CI / configure (push) Has been cancelled
Update stage0 / update-stage0 (push) Has been cancelled
CI / build (push) Has been cancelled
CI / build-secondary (push) Has been cancelled
CI / Build matrix complete (push) Has been cancelled
CI / release (push) Has been cancelled
CI / release-nightly (push) Has been cancelled
Add FORK_STRATEGY.md documenting: - Purpose: HoTT-compatible kernel extensions (Path types without UIP, transport, HITs) for polytropos's meta-theory. - Why kernel-level: library encodings via Quot leak UIP, incompatible with univalence. Mirrors Cubical Agda's precedent. - Sync strategy: track upstream leanprover/lean4, merge (not rebase), preserve HoTT additions on conflict. - Modification strategy: locality principle (new files under hott/ + src/kernel/hott/ + src/Init/HoTT/); LEAN4-HTT: tag for modifications to upstream files; compile-time feature flag (LEAN_HOTT) gates HoTT. - Patch-series organization for phased primitive additions. - Forbidden moves: no UIP at kernel level, no Quot.sound dependency for HoTT reductions, no Classical.choice in HoTT primitives. Add hott/ directory structure: - hott/README.md describing the fork-specific directory's purpose. - hott/design/ for architectural decisions per phase. - hott/tests/ for HoTT-specific test suites. No kernel modifications in this phase. Subsequent phases: Phase 1: Path + Refl + J primitives Phase 2: transport with computational behavior Phase 3: HIT support Phase 4: cubical primitives if needed Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
ad1c983a43
commit
ba016b2130
4 changed files with 205 additions and 0 deletions
186
FORK_STRATEGY.md
Normal file
186
FORK_STRATEGY.md
Normal file
|
|
@ -0,0 +1,186 @@
|
||||||
|
# lean4-htt: Fork Strategy
|
||||||
|
|
||||||
|
This is a fork of [leanprover/lean4](https://github.com/leanprover/lean4)
|
||||||
|
maintained for HoTT-compatible kernel extensions. The fork exists to add
|
||||||
|
foundational primitives that upstream Lean does not provide: identity Path
|
||||||
|
types without UIP, transport with full computational behavior, higher
|
||||||
|
inductive types (HITs), and (eventually) cubical primitives.
|
||||||
|
|
||||||
|
The fork is the meta-theoretic foundation for the polytropos project (a
|
||||||
|
cubical-transport HoTT engine). Polytropos's σ-calculus and substitution
|
||||||
|
machinery need HoTT-compatible meta-level reasoning that cannot be built
|
||||||
|
out of standard Lean inductive types alone without leaking UIP via
|
||||||
|
`Quot.sound` + `propext`.
|
||||||
|
|
||||||
|
## Why kernel-level, not library-level
|
||||||
|
|
||||||
|
Standard Lean library encodings of HoTT (e.g., via `Quot`) inherit UIP
|
||||||
|
from the kernel's quotient axiom. UIP is incompatible with univalence:
|
||||||
|
in a univalent universe, paths between types can be non-trivially
|
||||||
|
distinct, and UIP collapses this. The fork avoids this by adding Path
|
||||||
|
types as kernel primitives with their own reduction rules — no Quot
|
||||||
|
trapdoor, no inherited UIP.
|
||||||
|
|
||||||
|
This is the same engineering decision Cubical Agda made when extending
|
||||||
|
Agda with cubical primitives. The work is bounded, the precedent exists,
|
||||||
|
the architectural pattern is known.
|
||||||
|
|
||||||
|
## Sync strategy with upstream
|
||||||
|
|
||||||
|
The fork tracks `leanprover/lean4` (`upstream` remote) and publishes to
|
||||||
|
`maxgit.wg/max/lean4-htt` (`origin` remote).
|
||||||
|
|
||||||
|
### Sync cadence
|
||||||
|
|
||||||
|
Merge from upstream regularly. The cadence is "frequently enough that
|
||||||
|
each merge is mechanical" rather than a fixed schedule. Typical triggers:
|
||||||
|
- New upstream release
|
||||||
|
- Significant upstream features (e.g., LLVM backend updates, compiler
|
||||||
|
improvements) that we want to inherit
|
||||||
|
- After any local modification, before extending further
|
||||||
|
|
||||||
|
### Merge over rebase
|
||||||
|
|
||||||
|
The fork uses merges (not rebases) when pulling upstream. Rationale:
|
||||||
|
- Preserves the divergence history visibly in git log
|
||||||
|
- Avoids force-pushing the fork's master branch
|
||||||
|
- Makes each upstream sync a single commit (the merge commit) that can
|
||||||
|
be examined or reverted
|
||||||
|
|
||||||
|
### Conflict resolution discipline
|
||||||
|
|
||||||
|
When upstream and the fork modify the same file:
|
||||||
|
- Resolve in favor of preserving the fork's HoTT additions
|
||||||
|
- Verify the merged result still passes both upstream's tests and the
|
||||||
|
fork's HoTT-specific tests
|
||||||
|
- Document non-trivial conflicts in the merge commit's body
|
||||||
|
|
||||||
|
If upstream restructures something the fork depends on (e.g., changing
|
||||||
|
the `Expr` representation, refactoring `whnf`), the fork's patches need
|
||||||
|
re-application. Keep modifications localized so re-application is
|
||||||
|
mechanical.
|
||||||
|
|
||||||
|
## Modification strategy
|
||||||
|
|
||||||
|
### Locality principle
|
||||||
|
|
||||||
|
Add HoTT primitives in NEW files where possible:
|
||||||
|
- `src/kernel/hott/path.cpp`, `src/kernel/hott/transp.cpp`, etc.
|
||||||
|
- `src/Init/HoTT/` for Lean-side exposure of the new primitives
|
||||||
|
- `hott/` directory at the repo root for fork-specific design docs,
|
||||||
|
rationale, and tests
|
||||||
|
|
||||||
|
Only modify existing upstream files where the kernel architecture
|
||||||
|
requires it:
|
||||||
|
- `src/kernel/expr.h` (or equivalent): add new `Expr::Kind` variants
|
||||||
|
- `src/kernel/whnf.cpp` (or equivalent): add a single hook that
|
||||||
|
dispatches to the HoTT reducer
|
||||||
|
- `src/kernel/type_checker.cpp` (or equivalent): add a single hook for
|
||||||
|
HoTT inference rules
|
||||||
|
|
||||||
|
Every modification to an upstream file is documented with a comment
|
||||||
|
naming what it does and why. The grep-friendly tag is `LEAN4-HTT:`.
|
||||||
|
|
||||||
|
### Feature flag (compile-time gating)
|
||||||
|
|
||||||
|
HoTT primitives are gated behind a compile-time flag (likely a CMake
|
||||||
|
option `LEAN_HOTT=ON`). When `OFF`, the fork builds as vanilla Lean.
|
||||||
|
When `ON`, the HoTT extensions activate.
|
||||||
|
|
||||||
|
This reduces upstream-merge friction: most upstream changes don't touch
|
||||||
|
HoTT code paths, so they merge cleanly into the fork. It also gives a
|
||||||
|
testable "is the fork still upstream-equivalent in vanilla mode?"
|
||||||
|
property.
|
||||||
|
|
||||||
|
### Patch-series organization
|
||||||
|
|
||||||
|
HoTT additions are organized as a series of focused commits, each adding
|
||||||
|
one cohesive feature:
|
||||||
|
- Commit: add `Path` type former
|
||||||
|
- Commit: add `Refl` constructor
|
||||||
|
- Commit: add `J` eliminator + reduction
|
||||||
|
- Commit: add `transport` + reduction
|
||||||
|
- Commit: add HIT support
|
||||||
|
- etc.
|
||||||
|
|
||||||
|
Each commit is self-contained where possible. If upstream restructures
|
||||||
|
something that breaks a commit's assumptions, that commit can be
|
||||||
|
identified and re-applied without disturbing the others.
|
||||||
|
|
||||||
|
## Directory structure
|
||||||
|
|
||||||
|
```
|
||||||
|
lean4-htt/
|
||||||
|
├── FORK_STRATEGY.md # this file
|
||||||
|
├── hott/ # fork-specific design + tests
|
||||||
|
│ ├── README.md # what's in this directory
|
||||||
|
│ ├── design/ # architectural decisions
|
||||||
|
│ └── tests/ # HoTT-specific test suites
|
||||||
|
├── src/ # upstream Lean source (modified per locality principle)
|
||||||
|
│ ├── kernel/
|
||||||
|
│ │ ├── hott/ # new directory for HoTT kernel primitives
|
||||||
|
│ │ └── ... # upstream files; LEAN4-HTT: tags mark modifications
|
||||||
|
│ ├── Init/
|
||||||
|
│ │ ├── HoTT/ # new directory for Lean-side HoTT API
|
||||||
|
│ │ └── ... # upstream files
|
||||||
|
│ └── ... # rest of upstream src
|
||||||
|
├── tests/ # upstream tests (run unchanged)
|
||||||
|
└── ... # rest of upstream files
|
||||||
|
```
|
||||||
|
|
||||||
|
## CI and verification
|
||||||
|
|
||||||
|
Two test suites:
|
||||||
|
1. Upstream's full test suite, run in `LEAN_HOTT=OFF` mode. Must pass
|
||||||
|
with no regression.
|
||||||
|
2. The fork's HoTT-specific test suite under `hott/tests/`, run in
|
||||||
|
`LEAN_HOTT=ON` mode. Verifies the new primitives behave correctly.
|
||||||
|
|
||||||
|
CI runs both on every commit to the fork's master.
|
||||||
|
|
||||||
|
## Forbidden moves
|
||||||
|
|
||||||
|
The fork's HoTT extensions must not:
|
||||||
|
- Introduce UIP at the kernel level (defeats the purpose of forking)
|
||||||
|
- Depend on `Quot.sound` for HoTT primitive reductions
|
||||||
|
- Use `Classical.choice` in HoTT primitive implementations
|
||||||
|
- Add ad-hoc axioms beyond the minimum needed for soundness
|
||||||
|
|
||||||
|
If a HoTT primitive cannot be implemented constructively (no axioms, no
|
||||||
|
UIP-leaky principles), it doesn't go in the fork. This is the same
|
||||||
|
discipline polytropos enforces at the engine's object level.
|
||||||
|
|
||||||
|
## Maintenance
|
||||||
|
|
||||||
|
The fork's maintainer:
|
||||||
|
- Runs upstream sync per the cadence above
|
||||||
|
- Resolves conflicts preserving HoTT additions
|
||||||
|
- Updates `FORK_STRATEGY.md` when the strategy evolves
|
||||||
|
- Documents non-mechanical decisions in `hott/design/`
|
||||||
|
|
||||||
|
The fork is at `maxgit.wg/max/lean4-htt`.
|
||||||
|
|
||||||
|
## Phases
|
||||||
|
|
||||||
|
This is Phase 0: fork infrastructure (this file, directory structure,
|
||||||
|
remotes, sync workflow). No kernel modifications yet.
|
||||||
|
|
||||||
|
Subsequent phases add HoTT primitives:
|
||||||
|
- Phase 1: minimal `Path` + `Refl` + `J` (the foundational core)
|
||||||
|
- Phase 2: `transport` with full computational behavior
|
||||||
|
- Phase 3: HIT support
|
||||||
|
- Phase 4: cubical primitives (interval, faces, Glue) if needed for
|
||||||
|
polytropos's full spec
|
||||||
|
|
||||||
|
Each phase is gated on the previous landing and passing both test
|
||||||
|
suites.
|
||||||
|
|
||||||
|
## Related projects
|
||||||
|
|
||||||
|
- [polytropos](https://maxgit.wg/max/polytropos) — the cubical-transport
|
||||||
|
HoTT engine that depends on this fork.
|
||||||
|
- [Cubical Agda](https://github.com/agda/cubical) — the precedent for
|
||||||
|
adding cubical primitives to a host proof assistant.
|
||||||
|
- [topolei](https://maxgit.wg/max/topolei) — the prior project that
|
||||||
|
used Rust FFI for the computational kernel; informs the architectural
|
||||||
|
pattern for foundational extensions.
|
||||||
19
hott/README.md
Normal file
19
hott/README.md
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
# hott/ — Fork-specific HoTT extensions
|
||||||
|
|
||||||
|
This directory holds fork-specific content that's not part of the
|
||||||
|
upstream Lean tree:
|
||||||
|
|
||||||
|
- `design/` — architectural decisions, rationale documents, design
|
||||||
|
notes for each phase of HoTT primitive additions.
|
||||||
|
- `tests/` — HoTT-specific test suites (compiled with `LEAN_HOTT=ON`).
|
||||||
|
|
||||||
|
Upstream Lean code lives in `../src/` under its normal layout, with
|
||||||
|
modifications tagged `LEAN4-HTT:` per the locality principle in
|
||||||
|
`../FORK_STRATEGY.md`.
|
||||||
|
|
||||||
|
New HoTT kernel primitives live in `../src/kernel/hott/`.
|
||||||
|
New HoTT Lean-side APIs live in `../src/Init/HoTT/`.
|
||||||
|
|
||||||
|
This directory exists at the repo root because it's outside the upstream
|
||||||
|
tree — it documents and tests the fork's additions without intermixing
|
||||||
|
with upstream files.
|
||||||
0
hott/design/.gitkeep
Normal file
0
hott/design/.gitkeep
Normal file
0
hott/tests/.gitkeep
Normal file
0
hott/tests/.gitkeep
Normal file
Loading…
Add table
Reference in a new issue