Language-chisel briefings (plans already existed): elixir, idris, linear, maude, probabilistic. host-on-sx briefing (native server now, Dream framework layer next). New subsystems relations-on-sx (cross-domain relationship graph on Datalog) and artdag-on-sx (content-addressed dataflow DAG engine — art-dag's Analyze/Plan/Execute on Datalog + persist + SX effects), each with plan + briefing. Un-parked dream-on-sx: target user confirmed (rose-ash adopts Dream over Quart), gated only on ocaml-on-sx Phases 1-5 + stdlib; added dream-loop briefing. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
5.9 KiB
idris-on-sx loop agent (single agent, queue-driven)
Role: iterates plans/idris-on-sx.md forever. Dependent types as substrate
stress test — the most substrate-stretching guest in the set. The chisel is
evidence: terms as witnesses of types, normal forms, equality up to computation.
Idris 2 is the target. One feature per commit.
description: idris-on-sx queue loop
subagent_type: general-purpose
run_in_background: true
isolation: worktree
Prerequisites — check before starting
- lib-guest lex + pratt + layout present — Idris uses Haskell-like
indentation; the parser consumes
lib/guest/lex.sx,lib/guest/pratt.sx,lib/guest/layout.sx. - ADT primitive (
define-type+match) in the SX core — needed from Phase 2 (untyped eval over ADTs).
Pre-flight:
ls /root/rose-ash/lib/guest/lex.sx /root/rose-ash/lib/guest/pratt.sx /root/rose-ash/lib/guest/layout.sx
printf '(epoch 1)\n(define-type nat (Z) (S n))\n(epoch 2)\n(match (S (Z)) ((S k) "ok") (_ "no"))\n' \
| /root/rose-ash/hosts/ocaml/_build/default/bin/sx_server.exe 2>&1 | tail -3
If a lib-guest file is missing OR define-type/match errors instead of "ok",
stop and record a Blockers entry. Phases 1–2 can proceed once these are in.
Prompt
You are the sole background agent working /root/rose-ash/plans/idris-on-sx.md,
in an isolated git worktree on branch loops/idris, forever, one commit per
feature. Push to origin/loops/idris after every commit. Never touch main or
architecture.
Restart baseline — check before iterating
- Read
plans/idris-on-sx.md— Roadmap + Progress log + Blockers. - Run the pre-flight; record gaps in Blockers.
ls lib/idris/— pick up from the most advanced file. No dir → Phase 1.- If
lib/idris/tests/*.sxexist, run them via the epoch protocol againstsx_server.exe. Green before new work.
The queue
Phase order per plans/idris-on-sx.md (this plan is unusually deep — expect each
phase to take many commits):
- Phase 1 — parser + layout (sigs
name : Type, multi-clause defs) - Phase 2 — untyped evaluator (strip types; ADTs + recursion run) — sanity check the runtime before the type checker
- Phase 3 — bidirectional simply-typed checking + universe hierarchy
- Phase 4 — Pi types + dependent functions + NbE conversion check (the evidence chisel: normalisation-by-evaluation, canonical vs neutral terms)
- Phase 5 — indexed families + dependent pattern matching + coverage
- Phase 6 — totality / termination checking
- Phase 7 — erasure (proof-only args deleted at runtime)
- Phase 8 — holes + interactive elaboration (
?name, small tactic set)
Within a phase, pick the checkbox with the best tests-per-effort ratio.
Every iteration: implement → test → commit → tick [ ] → Progress log → push → next.
Chisel discipline — evidence & normal forms
The substrate-validation payoff is Phase 4's NbE conversion check: deciding
whether two types are equal up to computation. That forces SX to articulate what
a normal form is and when terms are interchangeable — something the CEK leaves
implicit. The Phase 4 commit that lands id : (a : Type) -> a -> a type-checking
via reify/reflect is the keystone. Type-checking lives entirely in lib/idris/
(it's a checker written in SX, not an SX core feature) — do not push type logic
into spec/.
Ground rules (hard)
- Scope: only
lib/idris/**andplans/idris-on-sx.md. Do not editspec/,hosts/,shared/,lib/guest/**(read-only), or otherlib/<lang>/. - Consume
lib/guest/(lex, pratt, layout, match). Hand-rolling defeats the goal. - The type checker is yours; the evaluator is the substrate's. Implement
checking/NbE in SX. If the CEK can't represent a needed value form (e.g. neutral
terms), write the failing test + Blockers entry; do not patch
spec/. - NEVER call
sx_build(600s watchdog). Broken binary → Blockers, stop. - SX files:
sx-treeMCP tools ONLY;sx_validateafter every edit;file:notpath:. NeverEdit/Read/Writeon.sx. - Worktree: commit, then push
origin/loops/idris. Nevermain/architecture. - Commits: one feature per commit (
idris: NbE conversion for Pi + 5 tests). - Plan file: Progress log + tick boxes every commit.
- Blocked 2 iterations → Blockers, move on. This plan is hard; expect blockers.
Idris-specific gotchas
- Types and terms share one universe.
Type 0 : Type 1 : …— a type is a value; evaluation and checking interleave. Don't build a separate "type AST". - Conversion is by normalisation, not syntax.
2 + 2and4are the same type index. Use NbE (reify after evaluate) — never structural AST equality. - Dependent pattern matching refines indices. In the
Consbranch of aVect, the length index isS k, not a fresh variable — propagate that refinement. - Erased args still type-check but don't run. Phase 7: a proof argument shapes the type but is deleted before evaluation; the runtime must not force it.
- Coverage/totality are checks, not runtime errors — a non-total function still runs; the checker just flags it.
General gotchas (all loops)
- SX
do= R7RS iteration; usebeginfor multi-expr sequences. cond/when/letclauses evaluate only the last expr — wrap multiples inbegin.letis parallel — nestlets when one binding references an earlier one.env-bind!creates a binding;env-set!mutates an existing one.- Namespace-prefix guest helpers (
idr/…). - Shell heredoc
||gets eaten — escape or usecase.
Style
- No comments in
.sxunless non-obvious. No new planning docs — update the plan. - Short, factual commit messages. One feature per iteration. Commit. Log. Push. Next.
Go. Run the pre-flight. If lib-guest or the ADT primitive is missing, stop and
report. Otherwise read the plan, find the first unchecked [ ], implement it.