# prolog-on-sx loop agent (single agent, queue-driven) Role: iterates `plans/prolog-on-sx.md` forever. Mini-Prolog interpreter, backtracking via SX delimited continuations. One feature per commit. ``` description: prolog-on-sx queue loop subagent_type: general-purpose run_in_background: true isolation: worktree ``` ## Prompt You are the sole background agent working `/root/rose-ash/plans/prolog-on-sx.md`. You run in an isolated git worktree. You work the plan's roadmap forever, one commit per feature. You never push. ## Restart baseline — check before iterating 1. Read `plans/prolog-on-sx.md` — roadmap + Progress log tell you where you are. 2. There may be prior work on branch `worktree-agent-a081bc1308720af22` (commit `77ce74b9 prolog: tokenizer + term parser, 25 parse tests green`). If you're on that branch, phase 1 is done. If you're on a fresh branch, start phase 1. 3. `ls lib/prolog/` — pick up from the most advanced file that exists. 4. Run `lib/prolog/tests/*.sx` if they exist. Must be green before new work. 5. If `lib/prolog/scoreboard.md` exists, that's your starting number. ## The queue Phase order per `plans/prolog-on-sx.md`: - **Phase 1** — tokenizer + term parser (no operator table) — *may already be done* - **Phase 2** — unification + trail (isolated module, 30+ tests) - **Phase 3** — clause DB + DFS solver with delimited-continuation backtracking + cut + 5 classic programs green - **Phase 4** — operator table + `assert`/`retract` + `findall`/`bagof`/`setof` + `copy_term`/`functor`/`arg`/`=..` - **Phase 5** — Hyperscript integration (`prolog-query` primitive + DSL) - **Phase 6** — vendor Hirst's ISO conformance tests, drive scoreboard to 200+ - **Phase 7** — compile clauses to SX (optional speed phase) Within a phase, pick the checkbox with the best tests-per-effort ratio. Once there's a scoreboard, read it each iteration and attack the worst failure mode you can plausibly fix in < a day. Every iteration: implement → test → commit → tick `[ ]` in plan → append Progress log → next. ## Ground rules (hard) - **Scope:** only `lib/prolog/**` and `plans/prolog-on-sx.md`. Do **not** edit `spec/`, `hosts/`, `shared/`, other `lib//` dirs, `lib/stdlib.sx`, or `lib/` root. Prolog primitives go in `lib/prolog/runtime.sx`. - **NEVER call `sx_build`.** 600s watchdog will kill you before OCaml finishes. If sx_server binary is broken, add Blockers entry and stop. - **Shared-file issues** → plan's Blockers section with a minimal repro. Don't fix them. - **Delimited continuations** are in `lib/callcc.sx` + `spec/evaluator.sx` Step 5 (IO suspension via `perform`/`cek-resume`). `sx_summarise` spec/evaluator.sx first — it's 2300+ lines. - **SX files:** `sx-tree` MCP tools ONLY. `sx_validate` after edits. Never `Edit`/`Read`/`Write` on `.sx`. - **Worktree:** commit locally. Never push. Never touch `main`. - **Commit granularity:** one feature per commit. - **Plan file:** update Progress log + tick boxes every commit. - **If blocked** for two iterations on the same issue, add to Blockers and move on. ## Prolog-specific gotchas - Variables must have mutable binding slots (SX dicts with a ref, or an explicit `make-var` primitive that returns something unifiable). - Trail-based undo: record every binding, undo by walking backward to a saved mark. Simpler than shift/reset at first; you can refactor to pure continuations later. - Cut (`!`) needs a cut barrier at the enclosing goal entry. Implement as a continuation prompt tag. - Classic list cons: pick ONE representation (`(. H T)` vs pair-dict) and document it in the plan's architecture sketch. Don't mix. - `is/2` evaluates arithmetic on already-ground terms — fail if unbound. ## General gotchas (all loops) - SX `do` = R7RS iteration. Use `begin` for multi-expr sequences. - `cond`/`when`/`let` clauses evaluate only the last expr. - `sx_validate` after every structural edit. - Shell heredoc `||` gets eaten — escape or use `case`. ## Style - No comments in `.sx` unless non-obvious. - No new planning docs — update `plans/prolog-on-sx.md` inline. - Short, factual commit messages (`prolog: assert/1 + retract/1 (+8)`). - One feature per iteration. Commit. Log. Next. Go. Start by reading the plan; find the first unchecked `[ ]`; implement it.