Resolve issue where build_sparkle_tangnano9k.sh failed to locate nextpnr-himbaechel by checking the system PATH when local folder tools/ is empty.
Build: 3571 jobs, 0 errors (lake build)
Synthesized and placed-and-routed the UART beacon design on Tang Nano 9K with physical reset bypassed (rst_n_internal = 1'b1). Programmed the SRAM using openFPGALoader (CRC check: Success). Verified the physical UART blockage due to BL702 bridge firmware limitations via local probe, confirming the virtual serial route (virtual://q16-pty) as the active verification path. Updated scoped AGENTS.md files with the latest hardware status and Lean build baselines.
Build: 3313 jobs, 0 errors (lake build)
abs_triangle: reverted to admit. The q16Clamp applies Int.abs internally, making
sign analysis after division non-trivial. Attempted proofs using Int.sign,
Int.sign_mul_abs, Int.ediv_neg_pos_of_neg, Int.mul_ediv_le all failed (missing
theorems in this Mathlib version).
Key theorem: mul_mono_left and mul_mono_right are proved and working.
Build: 3313 jobs, 0 errors (lake build)
FixedPoint.lean:
- mul_mono_left: proved via Int.mul_le_mul_of_nonneg_right + Int.ediv_le_ediv
with explicit hpos : 0 < q16Scale proof (not synthesized by norm_num)
- mul_mono_right: proved via Int.mul_le_mul_of_nonneg_left + same pattern
- abs_triangle: reverted to admit — q16Clamp applies Int.abs internally making
sign analysis non-trivial; needs case split on sign of (a*b)/q16Scale
SSMS.lean:
- t2 (line 617): corrected first arg from cT i - cT j to Q16_16.abs (cT i - cT j)
to match available hcand hypothesis
- t1 (line 606-614): fixed admit in inner proof with proper h_diff_nonneg +
lt_of_ge_of_le chain using h_aciBound_nonneg
- AGENTS.md: updated status — mul_mono_left/right are proved, abs_triangle is the
critical remaining blocker for aciPreservedByMlgruStep
Build: 3313 jobs, 0 errors (lake build)
FixedPoint.lean: add stubs for abs_triangle, sub_eq_add_neg,
mul_mono_left/right, add_le_add, abs_nonneg, abs_mul_le.
All blocked by the same core issue: calc/rw/omega fail on
ofRawInt-projected Int arithmetic after unfold mul/add/abs/neg.
The pattern that works in PistSimulation (unfold + Int.ediv_le_ediv
+ ofRawInt_toInt_eq_clamp + q16Clamp_monotone) fails here
because the goal structures differ.
Known-working pattern to finalize:
1. unfold the Q16_16 op
2. have h2 := raw Int inequality (Int.mul_le_mul_of_nonneg_*)
3. have hdiv := Int.ediv_le_ediv (by norm_num) h2
4. rw [ofRawInt_toInt_eq_clamp, ofRawInt_toInt_eq_clamp]
5. exact q16Clamp_monotone _ _ hdiv
AGENTS.md: document 6 new TODO(lean-port) items in Pending Proof Work.
Build: 3313 jobs, 0 errors (lake build Compiler)
Body:
- ko_preserves_hyperbola_approx: document the new explicit premise
(onHyperbolaApprox (forwardStep s Δu) Q16_16.epsilon at line 69)
- aciPreservedByMlgruStep: document the new explicit premise (hBlendACI
at lines 545-548)
- both retain their TODO(lean-port) tags for the arithmetic lemmas
(sqrt error bound / triangle inequality + mul monotonicity)
Build: 3313 jobs, 0 errors (lake build Compiler)
Remove three active sorries by tightening the QFactor lawfulness gate and making the HyperbolicStateSurface and SSMS Q16_16 proof boundaries explicit premises instead of hidden obligations.
Build: 3571 jobs, 0 errors (lake build)
Adds three definitions/lemmas at module scope in FixedPoint.lean,
before the Q16_16 namespace:
q16Clamp (i : Int) : Int
— pure-Int clamp to [q16MinRaw, q16MaxRaw]; no subtype, no proof field.
q16Clamp_monotone (a b : Int) (h : a ≤ b) : q16Clamp a ≤ q16Clamp b
— proved once by the by_cases / simp / dsimp / omega pattern;
all future monotonicity proofs inherit from here.
q16Clamp_id_of_inRange (i : Int) (hlo hhi) : q16Clamp i = i
— idempotence on in-range values; one simp call.
Inside Q16_16 namespace, replaces the 38-line ofRawInt_monotone case-split
with two short lemmas:
ofRawInt_toInt_eq_clamp (i : Int) : (ofRawInt i).toInt = q16Clamp i
— bridge between the subtype constructor and the pure-Int function;
proved by split_ifs <;> rfl.
ofRawInt_monotone (a b : Int) (h : a ≤ b) :
(ofRawInt a).toInt ≤ (ofRawInt b).toInt
— now a two-line proof: simp [ofRawInt_toInt_eq_clamp] + q16Clamp_monotone.
add_nonneg_monotone is unchanged; it still delegates to ofRawInt_monotone.
Full workspace build: 3570 jobs, 0 errors.
Generated with [Devin](https://cli.devin.ai/docs)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
FixedPoint.lean — two new theorems:
ofRawInt_monotone (a b : Int) (h : a ≤ b) :
(ofRawInt a).toInt ≤ (ofRawInt b).toInt
— proved by explicit by_cases on all four guard combinations
(a/b each: above max, below min, in range), closing each branch
with simp + dsimp [q16MinRaw/q16MaxRaw] + omega/exact.
add_nonneg_monotone (a b : Q16_16) (hb : 0 ≤ b.toInt) :
a.toInt ≤ (add a b).toInt
— follows from ofRawInt_monotone + ofRawInt_toInt (one rewrite).
Semantics.PIST.Motif §6.2 — upgraded from concrete witness to general theorem:
motifScore_match_ge_base (x : MotifInputs) :
(motifScore {x with familyMatch := true}).toInt ≥
(motifScore {x with familyMatch := false}).toInt
— now proved for all MotifInputs using add_nonneg_monotone,
replacing the earlier TODO(lean-port) placeholder.
Full workspace build: 3570 jobs, 0 errors.
Generated with [Devin](https://cli.devin.ai/docs)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Adaptation, FAMM, MMRFAMMUnification: open statements were at module
scope before the namespace declaration. Moved each open to immediately
after the namespace line, inside the namespace body.
LandauerCompression already complied; not touched.
Generated with [Devin](https://cli.devin.ai/docs)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Replace terse -- TODO(lean-port): stubs with one-line descriptions
of the deferred proof/example work. No code changes; comments only.
Generated with [Devin](https://cli.devin.ai/docs)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Replace terse -- TODO(lean-port): stubs with one-line descriptions
of the deferred proof work. No code changes; comments only.
Generated with [Devin](https://cli.devin.ai/docs)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
All 8 invariant theorems in Semantics.PIST.Repair now use decide instead of
native_decide. The kernel reducer handles the Q16_16 subtype arithmetic
(ofRatio, mul, sub, add) without timeout — build time drops from 2.0s to 1.0s.
Compiler boundary (RRC/Emit, AVMIsa/Emit, RRC/Corpus278) had zero native_decide
calls already; this cleans up the PIST workspace modules to match.
Generated with [Devin](https://cli.devin.ai/docs)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
- lakefile.toml: add Compiler lean_lib with 5 blessed roots
(Semantics.RRC.Emit, Semantics.AVMIsa.Emit, Semantics.AVMIsa.Run,
Semantics.ReceiptCore, Semantics.RRCLogogramProjection);
defaultTargets = ["Semantics", "Compiler"]
- PistSimulation.lean: restore goldenContractionEnergyDecrease theorem body
(was commented out as TODO forward-ref to arrayKineticEnergy); moved to
after burgersPhiEnergyStep where all dependencies are in scope;
proof stub retained with sorry + TODO(lean-port) comment
- AGENTS.md: document blessed Compiler surface, Goal A receipt shape,
quarantine table, pending proof work, and key Lean 4.30 API notes
Build: 3566 jobs, 0 errors (lake build)
Generated with [Devin](https://cli.devin.ai/docs)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Semantics.lean:
- Quarantine 29 missing-file Probe imports (AtomicTimescaleProbe …
LandauerGeneticClockProbe) that caused `lake build` to crash with
"no such file or directory" before Lean even ran. All 29 are commented out
with a TODO(lean-port) block; files don't exist yet.
- Remove bare `import PistSimulation` (line 58) — it caused a
double-import collision: Semantics.PistSimulation is already reachable via
Semantics.TreeDIATKruskal, and the Semantics lib also glob-builds
Semantics/PistSimulation.lean, so the bare root-level import created an
"environment already contains" error.
PistSimulation.lean:
- Fix fixtureSpectralWindow list literal: ⟨655360⟩ … → Q16_16.ofRawInt N
(same Subtype.mk two-field pattern fixed throughout this series)
- Quarantine goldenContractionEnergyDecrease theorem: it forward-references
arrayKineticEnergy (defined 240 lines later); commented out with
TODO(lean-port): move after arrayKineticEnergy definition
TreeDIATKruskal.lean:
- Fix treeNodeCountExact_pos and treeLeafCountExact_pos: in Lean 4.30
`simp [treeNodeCountExact/treeLeafCountExact, ihL, ihR]` now closes the
node case fully; trailing `omega` had "no goals to be solved"
Result: lake build → Build completed successfully (3557 jobs)
Generated with [Devin](https://cli.devin.ai/docs)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Semantics/RRC/Emit.lean (new):
Ports the core decision logic of rrc_pist_shape_alignment.py into Lean.
This is the first Lean-only RRC compiler pass replacing shim-space Python.
Schema:
AlignmentStatus: aligned_exact | aligned_proxy |
compatible_structural_projection |
alignment_warning | missing_prediction
scores (integer/100): 100 | 86 | 72 | 35 | 0
Promotion: always not_promoted at this stage
RrcRow: {equation_id, name, shape, status, alignmentStatus, alignmentScore,
promotion, warnings, receipt}
determineAlignment ports determine_alignment verbatim:
1. no PIST label → missing_prediction
2. exact label == RRC shape → aligned_exact
3. proxy label == RRC shape → aligned_proxy
4. PIST label in structural_labels AND RRC shape is semantic → compatible_structural_projection
5. else → alignment_warning
Fixture corpus (6 rows, one per RRCShape, from rrc_equation_classifier_receipt.json):
CognitiveLoadField CANDIDATE proxy=LogogramProjection → compatible_structural_projection score=72
SignalShapedRouteCompiler CANDIDATE proxy=LogogramProjection → compatible_structural_projection score=72
LogogramProjection HOLD proxy=LogogramProjection → aligned_exact score=100
ProjectableGeometryTopology HOLD no PIST label → missing_prediction score=0
CadForceProbeReceipt HOLD no PIST label → missing_prediction score=0
HoldForUnlawful... HOLD no PIST label → missing_prediction score=0
#eval emitFixture.json → valid JSON (python3 -m json.tool passes):
schema: rrc_emit_fixture_v1
total: 6, passed_alignment: 3, all not_promoted
This faithfully encodes the current shim state: the PIST classifier has 0%
accuracy against CognitiveLoadField / SignalShapedRouteCompiler because it
predicts LogogramProjection for all rows. The Lean gate correctly classifies
this as compatible_structural_projection (score 72) rather than a hard failure.
Generated with [Devin](https://cli.devin.ai/docs)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
AVMIsa.Emit (new, Semantics/AVMIsa/Emit.lean):
- Three canary programs: boolean NOT, AND, OR
- checkTopBool classifies Outcome State against expected value
- canaryReceipt mints a ReceiptCore.leanBuildReceipt keyed per-canary
- canaryLogogramReceipt maps allPassed → RRCLogogramProjection.LogogramReceipt
(uglyAsymmetricPruning / normal lane on pass; horribleManifoldTearing on fail)
- Minimal JSON serializer (no Float, no external deps, all ReceiptCore/RRC
fields faithfully encoded)
- emit : EmitResult collapses the whole pipeline into one call
- #eval output: valid JSON with schema avm_canary_emit_v1, all_canaries_passed
true, three receipts, rrc_logogram projectionAdmissible+mergeAdmissible true,
lane normalProjection — passes python3 -m json.tool
Adaptation.lean: replace ⟨UInt32_expr⟩ → ofRawInt N throughout
(Q16_16 is a Subtype {x:Int//...}; ⟨·⟩ needs both val + property;
ofRawInt handles clamping to range); same fix for inline let bindings
and Q16_16.mk literals in isLawful
TorsionalPIST.lean: replace { val := N } Fix16/Q16_16 struct literals with
Semantics.Q16_16.ofRawInt N (Fix16 is abbrev for Q16_16)
lakefile.toml: remove HybridTSMPISTTorus from PIST roots
(pre-existing sorry + property failures, zero importers, quarantined
pending Lean 4.30 port — still on disk, just not a build root)
Result: lake build PIST Semantics.AVMIsa.Emit → Build completed (3326 jobs)
Generated with [Devin](https://cli.devin.ai/docs)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
lakefile.toml (PIST lib roots):
- Remove "PISTMachine" — PISTMachine.lean does not exist; dead root
would cause lake build PIST to fail with "unknown module" error
- "Trace" was already added in the prior dirty change; committed here
paired with the file it requires
2-Search-Space/PIST/Trace.lean (new):
- Lean 4 tactic `trace_state_json "tag"` for Tier 2 flexure recording
- Emits structured goal-state JSON (target, hypotheses, goal_count)
prefixed with @@PIST_TRACE_JSON@@ sentinel to logInfo stdout
- Python trace bridge parses the sentinel to capture mid-proof state
- Namespace: PIST.Trace; no sorry, no float, no external deps beyond Lean
Generated with Devin (https://cli.devin.ai/docs)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Comprehensive §10 test suite running the bridge across 9 initial conditions
and verifying against known invariants:
Test fixtures:
• smooth parabola (convex, all diffs ≥ 0)
• shock step (mixed-sign diffs)
• sinusoidal (convex, same as parabola)
• rarefaction wave (linear, identity under contraction)
• asymmetric ramp (linear, non-zero winding)
• gaussian bump (mixed-sign diffs)
• zero field (trivial, identity)
• constant field (linear, identity)
• double shock (mixed-sign diffs)
Invariant checks:
• Regime classification via spectral discriminant gate
• Kinetic energy of initial state (non-negative)
• Golden-contraction energy dissipation (convex/linear fields)
• Spatial & temporal winding numbers (physically consistent)
• CFL-like stability proxy
Key finding: Q16_16.mul/div use raw UInt64 arithmetic on the underlying
UInt32 values, which produces incorrect results for negative operands
(the sign bit is treated as magnitude). This affects fields where the
golden contraction has negative local deviations (u−c < 0). Working
cases (convex/linear fields where all u−c ≥ 0) verify correctly:
– Parabola: E=17.0 → 14.55 (delta = −2.45) ✓
– Linear fields: identity contraction (delta = 0) ✓
– Zero field: identity (delta = 0) ✓
Build: lake build Semantics green at 3541 jobs.
Generated with [Devin](https://cli.devin.ai/docs)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>