foundry-j / spec /GAP_DECISIONS.md
SNAPKITTYWEST's picture
October 2026 main drop: mirror from GitHub
fadf040 verified
|
Raw History Blame Contribute Delete
7 kB
<!--
Copyright (C) 2026 Foundry J contributors
SPDX-License-Identifier: AGPL-3.0-or-later
-->
# Gap Decisions — DRAFT for Core handoff
**Status:** DRAFT. Spec rulings for Core against gaps listed in `spec/PROPERTIES.md` § Gaps.
**Target commit:** `194e588`.
**Policy:** Prefer **Match C++ as coded** when README prose and implementation disagree, unless README is the only statement of a math identity (then say so). **No invented numeric constants.** Alapeno remains out of scope.
Sources for gap list: `spec/PROPERTIES.md` lines 269–276 (Gaps section).
---
## 1. EPSILON naming (README name vs `0xFFFFFFFFULL` literal)
**Sources**
- PROPERTIES Gaps: “Named C++ identifier `EPSILON`: named only in README Key Constants; code uses literal `0xFFFFFFFFULL` in mulmod, not a `types.h` symbol.”
- Prop 6 cites: README.md § “Key Constants” (line 320); `src/goldilocks.cpp:27,31`.
- `J_API.md` already exposes fold constant as noun `EPSILON_FOLD` (= `0xFFFFFFFF` = \(2^{32}-1\)), noting README name `EPSILON`.
**Ruling:** **Match C++ as coded** (literal fold mask in mulmod path).
**Rationale:** README supplies the name; the implementation never defines an `EPSILON` symbol in `types.h` — Core must implement the fold arithmetic with the same literal value, not invent a C++ identifier.
**Done for Core**
- Provide a named J noun for the fold constant (e.g. `EPSILON_FOLD` per `J_API.md`) equal to `0xFFFFFFFF` (= \(2^{32}-1\)).
- Use that value in `fp_mulmod` / fold exactly as `src/goldilocks.cpp` uses `eps` / `hi_lo` mask.
- Do not require a `types.h`-style C++ symbol named `EPSILON`; README naming is documentation alias only.
---
## 2. BARRITT_MU unused
**Sources**
- PROPERTIES Gaps: “`BARRITT_MU`: defined equal to `P` and unused (`src/goldilocks.cpp:9–10`); no Barrett algorithm steps beyond the comment.”
- No numbered property asserts Barrett reduction; Goldilocks reduction is props 5–12 (fold / mulmod as coded).
**Ruling:** **Match C++ as coded** (define-equal-to-`P`, unused; no Barrett path).
**Rationale:** Sources define the constant and leave it unused; there is no Barrett algorithm identity to implement beyond the comment. Inventing Barrett steps would invent math not present in the cited cpp.
**Done for Core**
- May omit `BARRITT_MU` entirely, or expose a synonym equal to `GOLDILOCKS_PRIME` / `P` with no call sites.
- Do **not** implement Barrett reduction; keep reduction as fold/mulmod per props 5–12 and `src/goldilocks.cpp`.
---
## 3. PMat grading unchecked in `insert` / `validate_grading`
**Sources**
- PROPERTIES Gaps: “PMat per-entry grading vs indices: stated in `pmat.h:3` but not checked in `insert` / `validate_grading`.”
- Prop 28: header/README narrative says grading `tgt_sig - src_sig = monomial` is enforced; **Gap note** — `insert` does not compare signatures to row/col grades; `validate_grading` always returns `true` (`src/pmat.cpp:19–22`). Cite: `include/pmat.h:3,21–25`.
**Ruling:** **Match C++ as coded** (stub / always-true validate; insert domain checks only).
**Rationale:** The stated grading condition is narrative in the header; the coded surface that tests and callers see is domain checks on `insert` (prop 27) plus a no-op `validate_grading`. Enforcing full grading now would change observable C++ behavior Core is recreating. README/header is not a separate coded math identity here — the stub is the behavior.
**Done for Core**
- `pmat_insert`: fail only on `row ≥ rows`, `col ≥ cols`, or `sign ∉ {1,-1}` (prop 27); do not compare signatures to row/col grades.
- `validate_grading` (or J equivalent): return success / true unconditionally, matching `src/pmat.cpp:19–22`.
- Document that prop 28 “stated” grading remains a future Spec upgrade, not Core F1 obligation.
---
## 4. Compose deltas (`a.delta_source + b.delta_target` only vs README/full both signatures)
**Sources**
- PROPERTIES Gaps: “Compose monomial rule vs ‘sum of both signatures’: coded as `a.delta_source` + `b.delta_target` only (`src/pmat.cpp:54–55`), not full addition of both signatures from both factors.”
- Prop 31 (as coded): on matching `a.col == b.row`: `sign_acc *= a.sign * b.sign`; `monom_acc.delta_source += a.monomial.delta_source`; `monom_acc.delta_target += b.monomial.delta_target`. Cite: `src/pmat.cpp:51–55`.
- Prop 30 states composition preserves grading (narrative); prop 29 conservation is separately tested on entry monomials.
**Ruling:** **Match C++ as coded** (accumulate `a.delta_source` into result source and `b.delta_target` into result target only).
**Rationale:** Prop 31 already records the coded rule with a precise cite. A “sum of both signatures from both factors” reading is the prose disagreement; Core must reproduce the cpp accumulation, not invent a fuller bilinear sum.
**Done for Core**
- On compose match `a.col == b.row`: multiply signs; add **only** `a.monomial.delta_source` to accumulated `delta_source`; add **only** `b.monomial.delta_target` to accumulated `delta_target`.
- Do not add `a.delta_target` or `b.delta_source` into the composed monomial unless/until Spec revises prop 31 against a code change.
---
## 5. PHI unused in math cpp
**Sources**
- PROPERTIES Gaps: “PHI usage in UAC/recurrence math: constant present; no consuming identity in the cited math cpp files.”
- Prop 22: `PHI = 1.618033988749895`. Cite: `include/types.h:21`. “(Sources do not state further mathematical use in the UAC/recurrence core.)”
**Ruling:** **Match C++ as coded** (constant present; unused in field / PMat / spectral / recurrence math paths).
**Rationale:** Value is sourced from `types.h`; no cited math cpp consumes it. README is not supplying a PHI identity to implement — absence of use is the coded fact.
**Done for Core**
- Expose noun `PHI` with the value from `include/types.h:21` / prop 22 (do not invent a different constant).
- Do not wire PHI into Goldilocks, PMat, spectral governor, or Banach recurrence steps unless a later Spec cites a consuming identity.
---
## Summary table
| # | Gap | Spec ruling | Done for Core (one line) |
|---|-----|-------------|---------------------------|
| 1 | EPSILON naming | Match C++ as coded | Named fold noun = `0xFFFFFFFF`; use in mulmod; no required C++ `EPSILON` symbol |
| 2 | BARRITT_MU unused | Match C++ as coded | Omit or synonym-of-P; no Barrett algorithm |
| 3 | PMat grading unchecked | Match C++ as coded | Insert domain checks only; validate always true |
| 4 | Compose deltas | Match C++ as coded | `a.delta_source` + `b.delta_target` only (prop 31) |
| 5 | PHI unused | Match C++ as coded | Expose constant; no math consumer in Core F1 |
---
## Handoff note
This document is **DRAFT for Core**. It does not modify `PROPERTIES.md`, `j/`, `verify/`, `include/`, `src/`, or Alapeno. Core should treat the five “Done for Core” bullets as the F1 obligation for these gaps; reopen Spec only if a later commit changes the cited cpp behavior.