Five new guest-language plans mirroring the js-on-sx / hs-loop pattern, each with a phased roadmap (Progress log + Blockers), a self-contained agent briefing for respawning a long-lived loop, and a shared restore-all.sh that snapshots state across all seven language loops. Briefings bake in the lessons from today's stall debugging: never call sx_build (600s watchdog), only touch lib/<lang>/** + own plan file, commit every feature, update Progress log on each commit, route shared-file issues to Blockers rather than fixing them. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
75 lines
4.2 KiB
Markdown
75 lines
4.2 KiB
Markdown
# 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/<lang>/` 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.
|