In the Javanese legend, Princess Jonggrang demanded a thousand temples built in a single night. The suitor coordinated an army of spirits to pull it off. He failed — at 999 — and she was turned to stone as the thousandth.
The Prambanan temple complex near Yogyakarta is the physical remnant. Named for the principle, not the curse: large works get built when many small workers coordinate well. We ship sixteen phases, not one thousand.
Every session starts from zero. Conventions, file layout, the gotchas — you explain them, the context fills, the next message forgets.
You become the persistent memory. That doesn't scale past the second feature.
| Feature | Ralph | Claude Code | Superpowers | Jonggrang |
|---|---|---|---|---|
| Scope | Single agent loop |
Cross-session handoff |
Skill framework |
Multi-agent orchestration |
| State | None (loop only) |
YAML handoffs |
Context-based | Dual — ephemeral + persistent |
| Control | Prompt-based | Prompt-based | Skill-based | Deterministic hooks |
| Feedback | None | None | Human-in-loop | Inter-phase loops + escalation advisor |
| Work type | Trigger | Plan path | Runs |
|---|---|---|---|
| Bugfix | "fix", "bug", "issue", "error" | short — 1 AI call → plan.md | ~5 phases |
| Small | < 100 lines, single concern | short — 1 AI call → plan.md | ~6 phases |
| Medium | multi-file, some design | deep — phases 03–07 → plan.md | all 16 |
| Large | new subsystem, architectural | deep — phases 03–07 → plan.md | all 16 |
| Role | Agent | Produces | Hard output |
|---|---|---|---|
| Lead | *-lead | Designs architecture. Decomposes into tasks. | architecture-plan.json |
| Developer | *-developer | Implements specific tasks. Writes tests alongside. | source + tests |
| Reviewer | *-reviewer | Validates design, compliance, quality. Rejects non-compliant. | review-report.json |
| Test Lead | test-lead | Analyzes implementation. Designs test strategy. | test-plan.json |
| Tester | *-tester | Writes and runs tests from the plan. | test-results.json |
| Role | Can use | Cannot use |
|---|---|---|
| Lead, Test Lead | Task · Read · TodoWrite | Edit · Write · Bash |
| Developer, Tester | Edit · Write · Bash · Read | Task |
| Reviewer | Read · Bash | Edit · Write · Task |
Small, always available. The standard vocabulary every agent can assume.
Deep domain knowledge. JIT-loaded when the gateway detects intent.
| L | Claude Code | OpenCode | Jonggrang (Pi) | Enforces |
|---|---|---|---|---|
| 5 | PreToolUse | tool.execute.before | tool_call | Block direct edits (agent-first) |
| 5 | PreToolUse | tool.execute.before | tool_call | Block agent spawn if context > 85% |
| 6 | PostToolUse | tool.execute.after | tool_result | Set dirty bit when files modified |
| 6 | PostToolUse | file.edited | tool_result | Track domain (backend/frontend/testing) |
| 7 | SubagentStop | session.updated | agent_end | Block exit if output in wrong location |
| 8 | Stop | session.idle | agent_end | Block exit until review + tests pass |
| 8 | Stop | session.idle | before_provider_request | Final quality / compaction gate |
When a Developer touches a file, the platform sets a dirty bit for that domain.
That bit cannot be cleared until a Reviewer AND Tester pass for that same domain.
The agent literally cannot exit. The Stop hook blocks it. We don't ask the model to check. We block the exit until it's true.
No "remind the agent what we were doing."
The platform remembers.
$ jonggrang plan --resume
picks up at the exact phase you left.