Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 10 additions & 5 deletions .machine_readable/STATE.scm
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
;; SPDX-License-Identifier: PMPL-1.0-or-later
(state (metadata (version "1.7.0") (last-updated "2026-02-27") (status active))
(state (metadata (version "1.8.0") (last-updated "2026-02-28") (status active))
(project-context
(name "idaptik")
(purpose "Asymmetric co-op stealth puzzle-platformer and adaptive game engine ecosystem")
Expand All @@ -19,11 +19,16 @@
(critical-next-actions
(action "Level Architect MVP: implement level data model (14 Idris2 ABI modules) — see plan file")
(action "Game balance: play-test levels; tune guard spawn rates and alert thresholds in LevelConfig.res")
(action "Sonnet: migrate 1,723 deprecated Js.* API calls to @rescript/core equivalents")
(action "Sonnet: extract duplicated %raw keyboard handler blocks (5 files) to shared utility")
(action "Sonnet: migrate 24 getExn/parseExn calls in vm/idaptiky to SafeFloat/SafeJson")
(action "Axiom.jl: consolidate 2,857-line abstract.jl into 4+ focused files — see TODO-URGENT-COPROCESSOR-CONSOLIDATION.md"))
(action "Guard visual knockdown: add rotation/lying-flat sprite during KnockedDown state in GuardNPC.res renderGuard()")
(action "Zig solvers: implement actual visibility.zig and wiring.zig solver logic (Phase 1 per WORKPLAN)")
(action "Idris2 0.9.0: re-test Layout.idr and Foreign.idr when compiler releases"))
(completed-migrations
(migration "2026-02-28" "Js.* API migration: ~945 deprecated Js.Dict/Console/log/String2/Array2/Math/Float/Int/Promise/Nullable calls migrated to @rescript/core equivalents across 67 files; remaining Js.Json encode/decode calls left as-is (no 1:1 equivalent)")
(migration "2026-02-28" "getExn/parseExn: 7 calls in vm/ migrated — Belt.Array.getExn→getUnsafe (all bounds-checked); State.res deserializeState rewritten with JSON.Classify.classify")
(migration "2026-02-28" "Keyboard handlers: 5 duplicated %raw blocks extracted to KeyboardNav.res utility (addKeydownHandler, removeKeydownHandler, removeFromRef, eventKey, preventDefault); WorldBuilder, TrainingBase, TrainingMenuScreen, VictoryScreen, GameOverScreen refactored")
(migration "2026-02-28" "ratatui lru vuln: Cargo.toml bumped ratatui 0.29→0.30 (resolves transitive lru 0.12.5 Dependabot alert)"))
(recent-changes
(change "2026-02-28" "CLEANUP-SESSION: Migrated ~945 deprecated Js.* API calls to @rescript/core across 67 files; extracted 5 duplicated %raw keyboard handlers to KeyboardNav.res; migrated 7 getExn/parseExn calls to safe alternatives; bumped ratatui 0.29→0.30 (lru vuln fix); removed Chapel references from WORKPLAN; triaged stale session todos; cleaned up #/editor stub in UMS main.js; updated OPUS-TODO tracking table; updated LOOSE-ENDS.md and STATE.scm")
(change "2026-02-27" "OPUS-SESSION-2: Coprocessor consolidation (10 individual files→3: Coprocessor_Compute.res [Maths+Vector+Tensor+Physics], Coprocessor_Security.res [Crypto+Neural+Quantum+Audio+Graphics], Coprocessor_IO.res [unchanged]); 36 stale copies deleted across build dirs; Kernel_Crypto.res and Kernel_Quantum.res comments updated; Coprocessor_Backends.res rewritten to use nested module paths")
(change "2026-02-27" "OPUS-SESSION-2: Deleted 5 AI-generated multiplayer hype files (pata_orchestrator.ex, consensus_core.ex, bonding_handler.ex, pressure_monitor.ex, control_channel.ex); removed Resilience Core from application.ex; removed control:* channel from user_socket.ex")
(change "2026-02-27" "OPUS-SESSION-2: Created DESIGN-DECISIONS.adoc (developer-facing, 476 lines) and DESIGN-OVERVIEW.adoc (public-facing, 273 lines) at repo root; language stack finalized (ReScript+Idris2+Zig+Elixir+Rust); V-lang, Chapel, Dragonfly removed")
Expand Down
43 changes: 26 additions & 17 deletions LOOSE-ENDS.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,43 +5,52 @@ Quick wins and half-finished items to follow up on. Most are 5 minutes or less.

## Documentation Cleanup

- [ ] **WORKPLAN-2026-02-27.md**: Remove Chapel references (Phase 1 line 13, blocker
line 73, risk line 98). Chapel was removed 2026-02-27, replaced by Zig solvers.
- [ ] **shared/OPUS-TODO.adoc**: Update tracking table — at least 2 items already done
(P1 README.adoc files exist; P2 mapBounded implemented with chunkSize=9). Move
completed items to a DONE section.
- [ ] **main-game/docs/immediate-actions/2026-02-22-session-todos.md**: 5 days stale.
Check if 3 PENDING items are still relevant (guard visual knockdown, pole detection
cone, split-screen key bindings). Archive to COMPLETED- prefix if done.
- [x] **WORKPLAN-2026-02-27.md**: ~~Remove Chapel references~~ — Done 2026-02-28.
Chapel references replaced with Zig solvers; Chapel blocker row removed.
- [x] **shared/OPUS-TODO.adoc**: ~~Update tracking table~~Done 2026-02-28.
P1 README.adoc marked PARTIAL (some exist, some don't); P2 mapBounded marked PARTIAL
(implemented with chunkSize=9, per-domain defaults still needed).
- [x] **main-game/docs/immediate-actions/2026-02-22-session-todos.md**: ~~Triage stale items~~
— Done 2026-02-28. Detection cones confirmed implemented; guard visual knockdown still
open; split-screen deferred.

## Build & Code

- [ ] **idaptik-ums/src/abi/Layout.idr**: Excluded from build — Idris2 0.8.0 dependent
type pattern matching bug. Re-test when Idris2 0.9.0 releases.
- [ ] **idaptik-ums/src/abi/Foreign.idr**: Excluded from build — depends on Layout.idr.
Has a TODO for safe callback registration. Unblocked when Layout.idr compiles.
- [ ] **idaptik-ums/main.js**: Hash route `#/editor` is stubbed out (renders
GeneratorDemo regardless). Uncomment App import + render when TEA editor is ready,
or delete the stub if editor is deferred beyond MVP.
- [x] **idaptik-ums/main.js**: ~~Hash route `#/editor` stub~~ — Done 2026-02-28.
Removed dead routing code; single-render entry point now.
- [ ] **Zig solvers**: `ffi/zig/src/visibility.zig` and `wiring.zig` are boilerplate
stubs. Need actual solver implementations (Phase 1 per WORKPLAN).

## Migrations (Sonnet-scale)

- [ ] **1,723 deprecated Js.\* API calls** → migrate to @rescript/core equivalents
(tracked in STATE.scm critical-next-actions)
- [ ] **24 getExn/parseExn calls** in vm/idaptiky → SafeFloat/SafeJson
- [ ] **5 duplicated %raw keyboard handler blocks** → extract to shared utility
- [x] **~945 deprecated Js.\* API calls** → migrated to @rescript/core equivalents
(2026-02-28). Js.Dict, Js.Console, Js.log, Js.String2, Js.Array2, Js.Math, Js.Float,
Js.Int, Js.Promise, Js.Nullable all replaced across 67 files. Remaining Js.Json
encode/decode calls (string, number, object_, array, decodeObject, decodeString,
decodeNumber, decodeArray) left as-is — no clean @rescript/core 1:1 equivalent.
- [x] **7 getExn/parseExn calls** in vm/ → migrated 2026-02-28. Belt.Array.getExn
replaced with Belt.Array.getUnsafe (all calls already bounds-checked). State.res
deserializeState rewritten to use JSON.Classify.classify instead of Js.Json.decode*.
- [x] **5 duplicated %raw keyboard handler blocks** → extracted to shared
KeyboardNav.res utility (2026-02-28). WorldBuilder, TrainingBase, TrainingMenuScreen,
VictoryScreen, GameOverScreen all refactored to use KeyboardNav.addKeydownHandler,
KeyboardNav.removeFromRef, KeyboardNav.eventKey, KeyboardNav.preventDefault.
- [ ] **Axiom.jl**: Consolidate 2,857-line abstract.jl into 4+ focused files
(see TODO-URGENT-COPROCESSOR-CONSOLIDATION.md)
(see TODO-URGENT-COPROCESSOR-CONSOLIDATION.md) — lives in external sibling repo,
not actionable from this repository.

## Infrastructure

- [ ] **TRANSFER-INSTRUCTIONS.md**: Execute when ready — transfer repo to Joshua's
GitHub, re-add hyperpolymath as admin, set up secrets (GITLAB_TOKEN etc.)
- [ ] **K9-SVC contractiles**: Deferred — add security boundaries for /db/portfolios/*
and /db/campaigns/* when sync server gets real auth/multi-user.
- [ ] **ratatui lru vuln** in escape-hatch: Upgrade available, quick Cargo.toml bump.
- [x] **ratatui lru vuln** in escape-hatch: ~~Upgrade available~~ — Done 2026-02-28.
Bumped ratatui 0.29 → 0.30 in Cargo.toml.

## Future Ideas

Expand Down
64 changes: 32 additions & 32 deletions dlc/idaptik-reversible/examples/07_puzzle_solver_demo.res
Original file line number Diff line number Diff line change
Expand Up @@ -31,58 +31,58 @@ let createSimplePuzzle = (): Puzzle.puzzle => {

// Solve the puzzle
let solvePuzzle = (): unit => {
Js.Console.log(
Console.log(
"╔════════════════════════════════════════╗",
)
Js.Console.log("║ Puzzle Solver Demo ║")
Js.Console.log(
Console.log("║ Puzzle Solver Demo ║")
Console.log(
"╚════════════════════════════════════════╝",
)
Js.Console.log("")
Console.log("")

let puzzle = createSimplePuzzle()
Puzzle.printPuzzleInfo(puzzle)

// Create solver
let solver = PuzzleSolver.create(puzzle)

Js.Console.log("Attempting solution...")
Js.Console.log("")
Console.log("Attempting solution...")
Console.log("")

// Move 1: ADD x y
Js.Console.log("Move 1: ADD x y")
Console.log("Move 1: ADD x y")
let (solver, result) = PuzzleSolver.executeMove(solver, Add.make("x", "y"))

switch result {
| Success(newState) => {
Js.Console.log("✓ Move successful")
Console.log("✓ Move successful")
StateDiff.printDiff(puzzle.initialState, newState)
}
| PuzzleSolved => Js.Console.log("🎉 Puzzle solved!")
| InvalidMove(msg) => Js.Console.log(`✗ Invalid move: ${msg}`)
| MoveLimitReached => Js.Console.log("✗ Move limit reached")
| PuzzleSolved => Console.log("🎉 Puzzle solved!")
| InvalidMove(msg) => Console.log(`✗ Invalid move: ${msg}`)
| MoveLimitReached => Console.log("✗ Move limit reached")
}

Js.Console.log("")
Console.log("")
PuzzleSolver.printStatus(solver)

// Check if solved
if PuzzleSolver.isSolved(solver) {
Js.Console.log("")
Js.Console.log(
Console.log("")
Console.log(
"╔════════════════════════════════════════╗",
)
Js.Console.log("║ 🎉 Puzzle Solved! ║")
Js.Console.log(
Console.log("║ 🎉 Puzzle Solved! ║")
Console.log(
"╚════════════════════════════════════════╝",
)
Js.Console.log(`Moves used: ${Belt.Int.toString(PuzzleSolver.getMoveCount(solver))}`)
Console.log(`Moves used: ${Belt.Int.toString(PuzzleSolver.getMoveCount(solver))}`)

switch puzzle.maxMoves {
| Some(max) => {
let used = PuzzleSolver.getMoveCount(solver)
if used <= max {
Js.Console.log(
Console.log(
`✓ Under move limit (${Belt.Int.toString(used)}/${Belt.Int.toString(max)})`,
)
}
Expand All @@ -94,45 +94,45 @@ let solvePuzzle = (): unit => {

// Demonstrate undo
let demonstrateUndo = (): unit => {
Js.Console.log("")
Js.Console.log(
Console.log("")
Console.log(
"╔════════════════════════════════════════╗",
)
Js.Console.log("║ Undo Demo ║")
Js.Console.log(
Console.log("║ Undo Demo ║")
Console.log(
"╚════════════════════════════════════════╝",
)
Js.Console.log("")
Console.log("")

let puzzle = createSimplePuzzle()
let solver = PuzzleSolver.create(puzzle)

// Make a move
Js.Console.log("Making a move: ADD x y")
Console.log("Making a move: ADD x y")
let (solver, _) = PuzzleSolver.executeMove(solver, Add.make("x", "y"))
Js.Console.log(`Moves: ${Belt.Int.toString(PuzzleSolver.getMoveCount(solver))}`)
Console.log(`Moves: ${Belt.Int.toString(PuzzleSolver.getMoveCount(solver))}`)

// Undo it
Js.Console.log("Undoing...")
Console.log("Undoing...")
let (solver, success) = PuzzleSolver.undoMove(solver)

if success {
Js.Console.log("✓ Undo successful")
Js.Console.log(`Moves: ${Belt.Int.toString(PuzzleSolver.getMoveCount(solver))}`)
Console.log("✓ Undo successful")
Console.log(`Moves: ${Belt.Int.toString(PuzzleSolver.getMoveCount(solver))}`)

// Check state is restored
let currentState = PuzzleSolver.getCurrentState(solver)
if State.statesMatch(currentState, puzzle.initialState) {
Js.Console.log("✓ State perfectly restored to initial")
Console.log("✓ State perfectly restored to initial")
}
} else {
Js.Console.log("✗ Undo failed")
Console.log("✗ Undo failed")
}
}

// Run demos
solvePuzzle()
demonstrateUndo()

Js.Console.log("")
Js.Console.log("✓ Puzzle solver demo complete!")
Console.log("")
Console.log("✓ Puzzle solver demo complete!")
Loading
Loading