3.6 KiB
Handoff — 2026-09-19 (written before a full /clear)
Read this, then delete it. Style: user wants extreme concision, plain language,
no filler, decisions discussed one at a time BEFORE dispatching, agents
dispatched one at a time. No commit watermarks. dune test stays fast.
State of the repo
- Branch
dev-loop, tip73ab213(merge of the x86 dyn + conditions lane). All green after merge: dune test 287/0, @x86 137 match / 0 differ, @sanitize clean. - dyn now works on the default x86 dev daemon. handler-bind is now a value (body's last form) on both backends.
sand.flanis the author's UNCOMMITTED WIP. Never commit it. Stash around merges (git stash push sand.flan -m wip, pop after).game-data.ednuntracked, leave it.- Known open hole (flagged, not fixed):
dune testexits 0 even when test_acceptance prints failures — nothing surfaces them.
In flight: M2 item 1 — dyn maps + keywords
Agent worktree: .claude/worktrees/agent-a3009901a950e8daa
(branch worktree-agent-a3009901a950e8daa). NOT committed yet — uncommitted
changes across lib/{ast,check,emit,load,parse,prelude}.ml, runtime/flan_dyn.{h,c},
test/dune; it was writing checker/parse tests in test/test_flan.ml when it hit
the session limit (resets 7:20pm Asia/Bangkok).
To finish: spawn an agent IN THAT WORKTREE (don't reset it) with: "Finish the in-progress dyn maps + keywords lane. Read the uncommitted diff first to see what exists. Remaining: tests in test_flan.ml, acceptance rows (LLVM, -O0, --x86; run programs for real output, never guess wording; no double-quotes in OCaml comments), then ONCE at the end: dune test --force, dune build @x86 --force, dune build @sanitize --force. Commit in the repo's prose voice." Then: stash sand.flan, merge, run the three sweeps, pop stash.
M2 queue (FIX.org "M2 queue" section, line ~408) — dispatch ONE AT A TIME
- dyn maps + keywords (in flight, above)
- per-type descriptors — use Opus-class agent (representation change)
- typed containers into dyn as views (rides on 2)
- nil↔None at (Option T)
- typed =/!= grow strings
- defclass = named dyn map + CLOS/Clojure dispatch (after 1)
- dyn if truthiness
- return slot stays mandatory — decision only, no work
Model plan agreed with user: session on Opus, Sonnet agents for items 3–8, Opus agents for item 2 and for reviews of merges.
Not yet recorded in FIX.org (do this early, cheap)
Append a section on the syntax-family discussion (2026-09-19):
- User wants an F#-ish indentation/ML surface syntax, side by side with s-exprs. Languages that "disappear" for them: Python > Odin > F#.
- Agreed architecture if it happens: one AST (the existing forms), second reader; macros stay usable from both; Nim-style quote-block could allow writing macros in ML syntax too.
- Middle options discussed: Parinfer (editor-only), wisp/sweet-exprs (indentation-implied parens), simplified in-paren syntax. Rhombus = the maximal reference.
- DECISION: deferred, no spike queued. User's current hypothesis: their Clojure friction may be immutability/planning-ahead, not parens — they will write imperative Flan as-is and see if parens still grate. Revisit with that evidence.
Environment notes
- /tmp (7.6G tmpfs) was 100% full; freed ~470M of stale dune test dirs, now ~95%. Remaining bulk: 2.6G Refold-Defold Claude scratch + ~850M numeric JVM/Defold dirs — user hasn't said whether that session is closed; ask before deleting.
- Verify agents' worktree bases: every past agent arrived stale. Prompt must demand git log check + reset to dev-loop tip.
- Repeated full sweeps are the main time sink — tell agents to verify incrementally, full sweeps once at the end.