Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 19s
Plans for acl-on-sx (Datalog), flow-on-sx (Scheme), feed-on-sx (APL), mod-on-sx (Prolog), search-on-sx (Haskell). Each is a 4-phase queue sitting on its respective guest language, targeting rose-ash needs: access control, durable workflows, activity feeds, moderation, search. Federation extension in Phase 4 of each (plugs into fed-sx). Briefings for the three loops we're kicking off now: acl-loop, flow-loop, feed-loop. mod-sx and search-sx briefings will follow once the first three have surfaced any shared infrastructure worth extracting to lib/guest/. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
94 lines
4.1 KiB
Markdown
94 lines
4.1 KiB
Markdown
# acl-on-sx loop agent (single agent, queue-driven)
|
|
|
|
Role: iterates `plans/acl-on-sx.md` forever. **First subsystem loop after fed-sx.**
|
|
Sits on `lib/datalog/` — rule engine reused, schema/api/audit/federation added on
|
|
top. The deliverable isn't "implement Datalog ACL"; it's *also* to surface shared
|
|
rule-engine plumbing into `lib/guest/` (the mod-sx loop will be the second consumer,
|
|
validating extraction).
|
|
|
|
```
|
|
description: acl-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/acl-on-sx.md`.
|
|
Isolated worktree, forever, one commit per feature. Push to `origin/loops/acl`
|
|
after every commit.
|
|
|
|
## Restart baseline — check before iterating
|
|
|
|
1. Read `plans/acl-on-sx.md` — roadmap + Progress log.
|
|
2. `ls lib/acl/` — pick up from the most advanced file.
|
|
3. If `lib/acl/tests/*.sx` exist, run them via `bash lib/acl/conformance.sh`. Green
|
|
before new work.
|
|
4. If `lib/acl/scoreboard.md` exists, that's your baseline.
|
|
5. Read `lib/datalog/datalog.sx` public API once — that's your substrate.
|
|
|
|
## The queue
|
|
|
|
Phase order per `plans/acl-on-sx.md`:
|
|
|
|
- **Phase 1** — direct grants. Schema, EDB facts, engine, api, 15+ tests
|
|
- **Phase 2** — inheritance (member_of, child_of, role expansion, deny-overrides)
|
|
- **Phase 3** — explanation + audit (proof tree, audit log)
|
|
- **Phase 4** — federation (peer trust, delegation, cross-instance permit chain)
|
|
|
|
Within a phase, pick the checkbox that unlocks the most tests per effort.
|
|
|
|
Every iteration: implement → test → commit → tick `[ ]` → Progress log → next.
|
|
|
|
## Ground rules (hard)
|
|
|
|
- **Scope:** only `lib/acl/**` and `plans/acl-on-sx.md`. Do **not** edit `spec/`,
|
|
`hosts/`, `shared/`, other `lib/<lang>/` dirs, `lib/stdlib.sx`, or `lib/` root.
|
|
May **import** from `lib/datalog/` only (its public API).
|
|
- **NEVER call `sx_build`.** 600s watchdog. If sx_server binary broken → Blockers
|
|
entry, stop.
|
|
- **Shared-file issues** → plan's Blockers with minimal repro.
|
|
- **SX files:** `sx-tree` MCP tools ONLY. `sx_validate` after edits.
|
|
- **Worktree:** commit, then push to `origin/loops/acl`. Never touch `main` or
|
|
`architecture`.
|
|
- **Commit granularity:** one feature per commit. Short factual messages
|
|
(`acl: child_of resource inheritance + 8 tests`).
|
|
- **Plan file:** update Progress log + tick boxes every commit.
|
|
- **Watch for shared infrastructure** with future mod-sx (Prolog moderation). If you
|
|
build a generic rule-engine adapter, note it in Progress log so the eventual
|
|
`lib/guest/rules/` extraction has both consumers identified.
|
|
|
|
## ACL-specific gotchas
|
|
|
|
- **Datalog is bottom-up.** No goal-directed search. Don't reach for cut or
|
|
backtracking — that's mod-sx's job. Your decisions emerge from fixpoint.
|
|
- **Deny-overrides** is the policy: if both an allow and deny rule fire, deny wins.
|
|
Encode this via stratified negation; document the choice clearly in plan.
|
|
- **Inheritance termination:** recursive rules with `member_of` chains must
|
|
terminate. Datalog guarantees this absent function symbols — don't introduce them
|
|
in your schema.
|
|
- **Proof tree shape:** Datalog's derivation graph is a DAG, not a tree, when the
|
|
same fact is derived multiple ways. For audit, pick one canonical derivation
|
|
(shortest, or first); document choice.
|
|
- **Federation isn't transitive trust.** A peer's `delegate(...)` fact only applies
|
|
if local `trust(peer, level)` covers the action class. Re-check trust on every
|
|
query, not at fact-ingestion time.
|
|
|
|
## General gotchas (all loops)
|
|
|
|
- SX `do` = R7RS iteration. Use `begin` for multi-expr sequences.
|
|
- `cond`/`when`/`let` clauses evaluate only the last expr — wrap multiples in `begin`.
|
|
- `env-bind!` creates a binding; `env-set!` mutates an existing one (walks scope chain).
|
|
- `sx_validate` after every structural edit.
|
|
- `list?` returns false on raw JS Arrays — host data must be SX-converted.
|
|
|
|
## Style
|
|
|
|
- No comments in `.sx` unless non-obvious.
|
|
- No new planning docs — update `plans/acl-on-sx.md` inline.
|
|
- Short, factual commit messages.
|
|
- One feature per iteration. Commit. Log. Push. Next.
|
|
|
|
Go. Start by reading the plan; find the first unchecked `[ ]`; implement it.
|