Project-local agent harness skill for traceable AI workflows
SaferSkills independently audited fable-harness (Agent Skill) and scored it 96/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Install a lightweight project-local harness that turns the Fable decision-loop playbook into repeatable files, scripts, and agent boot instructions.
The harness is instructional plus mechanical: root instructions load the operating rules, templates standardize audit artifacts, and scripts create traces and check closure.
When a user asks to install or update Fable Harness, run the installer from this skill. Do not stop at explaining the command.
python "<skill-dir>\scripts\install_fable_harness.py" "<project-root>" --agent codexUse the directory containing this SKILL.md as <skill-dir>. Use the current workspace as <project-root> unless the user names another target. If the user does not choose an agent mode, use auto.
During an interactive install, the installer checks for Superpowers at <project-root>/.agents/skills/using-superpowers/SKILL.md. If Superpowers is missing, it asks whether to install it from the latest official release. If Superpowers is installed but older than the selected source, it asks whether to update. If the user declines, Fable Harness remains standalone. Do not add Superpowers-specific usage instructions to generated AGENTS.md or CLAUDE.md; Superpowers is discovered as installed skills.
For scripted runs, use explicit flags:
python "<skill-dir>\scripts\install_fable_harness.py" "<project-root>" --agent codex --with-superpowers
python "<skill-dir>\scripts\install_fable_harness.py" "<project-root>" --agent codex --without-superpowers
python "<skill-dir>\scripts\install_fable_harness.py" "<project-root>" --agent codex --upgrade-superpowersAgent options:
| Option | Creates or updates |
|---|---|
codex | AGENTS.md and .codex/ |
claude | CLAUDE.md and .claude/ |
any | AGENTS.md and .agents/ |
both | both Codex, Claude and any surfaces |
auto | Claude if only CLAUDE.md exists, Codex if only .codex/ exists, otherwise any |
The installer preserves existing root instructions and updates only the marked fable-harness block.
<.codex or .claude or .agents>/
templates/
decision-trace.md
semantic-note.md
subagent-brief.md
memory-closure.md
workflow-profile.md
scripts/
new-trace.py
check-closure.py
workflow_core.py
subagent-plan.py
new-note.py
promote-trace.py
memory-search.py
rebuild-memory.py
rag-eval.py
rag-pipeline.py
source-arbitrate.py
graph-query.py
graph-check.py
code_graph_core.py
code-graph-build.py
code-graph-query.py
code-graph-check.py
release-notice.py
subagent-result.py
subagent-sweep.py
selective-revert.py
memory-maintenance.py
memory-touch.py
memory-dream.py
loop_core.py
loop-start.py
loop-event.py
loop-transition.py
loop-check.py
notes/
_index.md
decision-traces/
_index.md
loop/
runs/<run-id>/
state.json
events.jsonl
checklist.md
memory/
manifest.json
promotion_log.jsonl
touches.jsonl
touch_index.json
shards/*.jsonl
cache/documents.json
retrieval/*.md
graph/
nodes.jsonl
edges.jsonl
code-graph/
nodes.jsonl
edges.jsonlrelease-notice.py check when available. It checks at most once every 24 hours and only prints when a newer GitHub release exists; it never downloads or applies updates..codex/, .claude/, or .agents/ first; global/model memory, user-level agent storage, chat summaries, or external notes may only be additional mirrors.new-note.py, promote-trace.py, rebuild-memory.py, and memory-touch.py; prefer local harness scripts over equivalent global or model-native memory actions whenever they exist.memory-search.py, rag-pipeline.py for memory-heavy cited source inspection, lightweight source-arbitrate.py before RAG-informed code/doc edits, notes/_index.md, compact active notes, memory-touch.py, graph-query.py --q, dormant search, traces only when needed, project docs/source files, then closure maintenance.classify-and-act, fan-out-and-synthesize, adversarial-verification, generate-and-filter, tournament, and loop-until-done.loop-start.py --pattern and repeated --recipe flags to record workflow-aware runs; pattern-specific strict checks apply only to workflow-aware runs, while legacy loops remain compatible.Dispatching Parallel Agents or any other trigger phrase, and do not ask for per-prompt permission before dispatching subagents when these conditions are met.loop-event.py, loop-transition.py, or loop-check.py concurrently for the same run.rebuild-memory.py concurrently with memory-maintenance.py, graph-check.py, or memory-dream.py plan; generated state is one-writer by default.release-notice.py check as a notification-only release check. The user decides whether to manually download or update from GitHub..codex/notes/ or .claude/notes/ or .agents/notes/ compact and semantic; use traces as proof of the decision path..codex/notes/<category>/<optional-area>/<topic>.md, using .claude or .agents for those install targets.promote-trace.py instead of making every future agent reread raw traces.memory/: sharded local embeddings, a promotion log, and a JSONL knowledge graph.memory-search.py for semantic recall before broad manual reading. It returns hybrid lexical/vector/graph scores, rerank details, chunk snippets, and citations when available.rag-pipeline.py for memory-heavy answers or plans so the agent follows retrieve -> inspect sources -> answer/plan with citations before relying on memory.source-arbitrate.py when RAG informs work that may change project code or docs: run a lightweight source-arbitration check against real project files before planning or editing; if material conflict is found, escalate to a full Evidence Dispute and ask the user before replacing project facts with RAG-derived facts.rag-eval.py with a local JSON/JSONL eval set to report precision@k, recall@k, hit-rate@k, and MRR when tuning retrieval behavior.rebuild-memory.py after manual note or trace edits.loop-start.py for native loop governance when work needs auditable progress; record events/transitions with loop-event.py and loop-transition.py, and run loop-check.py --strict before reporting completion.state.json, events.jsonl, and checklist.md under loop/runs/<run-id>/; it references traces, notes, verification, and subagent plans instead of replacing them.graph-query.py to inspect generated semantic graph entities/relations, including --q text lookup, and graph-check.py --strict to validate graph integrity after graph-sensitive memory changes.code-graph-build.py and code-graph-query.py before broad source-code edits when symbol, import, call, test, or static impact orientation would reduce risk.memory-dream.py maintain --context "<current task>" --auto-safe --agent-review after memory-heavy work; it applies context-cold safe mechanical actions and writes agent-review.md for semantic decisions.memory-dream.py plan and apply --apply only when a manual two-step review workflow is needed.memory-dream.py search-dormant before declaring older context unavailable, and memory-dream.py reactivate --apply to restore compact active notes from dormant evidence.selective-revert.py when the user asks to revert specific agent changes; create a plan first, inspect it, and apply only with explicit user intent and --apply.subagent-plan.py to generate dispatchable briefs and a manifest before broad execution when the task has independent domains; use --parallel and --depends-on dependent:dependency to create simultaneous dispatch waves.subagent-result.py to record each subagent result in the dispatch package and active trace before accepting it.subagent-sweep.py --close-completed near final closure when a subagent plan was used. Close completed sessions unless a domain is explicitly kept open or closure is unavailable with a reason.memory-maintenance.py after large tasks or periodically to report oversized notes, stale notes, broken sources, and archive-ready promoted traces. It is report-only and does not delete source files.memory-maintenance.py --strict before closing memory-heavy work. Strict mode exits non-zero on high-severity hygiene failures such as umbrella traces, invalid note schema, duplicate active canonical notes, and generic trace titles.memory-touch.py when a note, trace, or dormant item is loaded for task context. It records recency and use count in generated memory state without editing the source file.session-index and migration-trace are the only accepted umbrella trace roles.memory_schema, type, status, scope, canonical, thesis, atomic, tags, properties, moc, links, sources, supersedes, and last_verified. New permanent notes use memory_schema: atomic-v1: one idea, title as thesis, explicit connections, unique scope, and queryable metadata. Use canonical-decision for the active memory of record, trace-summary for compressed historical trace context, operational-note for procedural facts, and migration-note for memory restructuring work.Create a trace when beginning substantial work:
python ".codex\scripts\release-notice.py" check --root "."The release notice check is throttled to once every 24 hours and only prints a warning when a newer GitHub release is available.
python ".codex\scripts\new-trace.py" --root "." --title "Short Task Title"Start a native loop-governance run:
python ".codex\scripts\loop-start.py" --root "." --task "Short Task Title" --trace ".codex\decision-traces\<trace>.md" --json
python ".codex\scripts\loop-event.py" --root "." --run ".codex\loop\runs\<run>" --kind file.read --summary "Read the source file" --path "src/example.py"
python ".codex\scripts\loop-event.py" --root "." --run ".codex\loop\runs\<run>" --kind decision.recorded --summary "Use the smallest compatible change"
python ".codex\scripts\loop-transition.py" --root "." --run ".codex\loop\runs\<run>" --to acting --reason "Decision recorded"
python ".codex\scripts\loop-check.py" --root "." --run ".codex\loop\runs\<run>" --strict --jsonStart a workflow-aware loop with a composable recipe:
python ".codex\scripts\loop-start.py" --root "." --task "Harden workflow" --pattern loop-until-done --recipe classify-and-act --recipe fan-out-and-synthesize --recipe adversarial-verification --budget-max-iterations 3 --jsonRun closure checks before reporting completion:
python ".codex\scripts\check-closure.py" --root "." --trace ".codex\decision-traces\<trace>.md"Use .claude\scripts\... instead for Claude installs. Use .agents\scripts\... instead for any installs.
Create a semantic note directly:
python ".codex\scripts\new-note.py" --root "." --category decisions --area architecture --topic memory-ownershipPromote a trace into semantic memory:
python ".codex\scripts\promote-trace.py" --root "." --trace ".codex\decision-traces\<trace>.md" --category decisions --area workflow --topic memory-ownershipSearch local memory:
python ".codex\scripts\memory-search.py" --root "." --query "protected TDD tests"Run source arbitration before RAG-informed code/doc edits:
python ".codex\scripts\source-arbitrate.py" --root "." --query "protected TDD tests" --source "docs\relevant.md" --jsonRecall from fast to deep:
memory-search.py with a concise task query.rag-pipeline.py for memory-heavy cited source inspection.source-arbitrate.py before RAG-informed code/doc edits.notes/_index.md and compact active notes.memory-touch.py for every loaded note, trace, or dormant item.graph-query.py --q for relationships, sources, and prior verification paths.memory-dream.py search-dormant before saying old context is unavailable.Run agent-reviewed Memory Dreaming maintenance:
python ".codex\scripts\memory-touch.py" --root "." --path ".codex\notes\decisions\memory\example.md" --reason "loaded for task context" --json
python ".codex\scripts\memory-dream.py" maintain --root "." --context "current task" --auto-safe --agent-review --jsonCreate a manual Memory Dreaming run when you need an explicit two-step review:
python ".codex\scripts\memory-touch.py" --root "." --path ".codex\notes\decisions\memory\example.md" --reason "loaded for task context" --json
python ".codex\scripts\memory-dream.py" plan --root "." --json
python ".codex\scripts\memory-dream.py" apply --root "." --run ".codex\memory\dreams\runs\<run>" --applymemory-dream.py maintain can be run by a background memory curator subagent after memory-heavy work. The script applies only context-cold safe mechanical actions; semantic compaction suggestions go to agent-review.md for the orchestrator, not the user by default. Inspect the run's agent-review.md, report.md, and diff.json before changing semantic notes.
Search dormant memory and reactivate compact active notes:
python ".codex\scripts\memory-dream.py" search-dormant --root "." --query "old release decision" --json
python ".codex\scripts\memory-dream.py" reactivate --root "." --query "old release decision" --category decisions --area memory --topic old-release-decision --applyInspect and validate the generated knowledge graph:
python ".codex\scripts\graph-query.py" --root "." --relation promotes
python ".codex\scripts\graph-query.py" --root "." --q "semantic retrieval" --json
python ".codex\scripts\graph-check.py" --root "." --strict --jsonBuild, query, and validate the generated code graph:
python ".codex\scripts\code-graph-build.py" --root "." --json
python ".codex\scripts\code-graph-query.py" --root "." --symbol "install_harness" --json
python ".codex\scripts\code-graph-check.py" --root "." --jsonCreate subagent briefs:
python ".codex\scripts\subagent-plan.py" --root "." --task "Harden harness" --domain "closure gate" --domain "subagent invocation" --trace ".codex\decision-traces\<trace>.md" --verification "python scripts/test_install_fable_harness.py"
python ".codex\scripts\subagent-plan.py" --root "." --task "Harden harness" --domain "graph" --domain "docs" --parallel --depends-on "docs:graph"Record a subagent result:
python ".codex\scripts\subagent-result.py" --root "." --plan-dir ".codex\subagents\<plan>" --domain "closure gate" --status DONE_WITH_CONCERNS --summary "Found exact-promotion risk" --accepted-by orchestratorSweep completed subagent sessions before final closure:
python ".codex\scripts\subagent-sweep.py" --root "." --plan-dir ".codex\subagents\<plan>" --close-completedRun memory maintenance:
python ".codex\scripts\memory-maintenance.py" --root "." --jsonRun strict hygiene before closing memory-heavy work:
python ".codex\scripts\memory-maintenance.py" --root "." --strict --jsonCreate a selective rollback plan for a Git-tracked file:
python ".codex\scripts\selective-revert.py" plan --root "." --path "src/example.py"Create a native checkpoint before risky work, then plan against it later:
python ".codex\scripts\selective-revert.py" checkpoint --root "." --label "before-risky-change" --path "src/example.py"
python ".codex\scripts\selective-revert.py" plan --root "." --checkpoint ".codex\rollback\checkpoints\<checkpoint>\manifest.json" --path "src/example.py"Apply a reviewed rollback plan only when the user explicitly wants it:
python ".codex\scripts\selective-revert.py" apply --root "." --plan ".codex\rollback\plans\<plan>\manifest.json" --applyRebuild generated indexes:
python ".codex\scripts\rebuild-memory.py" --root "."| Mistake | Fix |
|---|---|
| Reading every trace in a new context | Read notes first; open traces only for audit or continuation. |
| Letting subagents update memory silently | Require orchestrator review and acceptance. |
| Asking one agent to do a complex multidisciplinary task alone | Generate briefs with subagent-plan.py and dispatch focused subagents. |
| Treating sequential loop order as a ban on subagents | Serialize only dependent steps inside one domain; dispatch independent domains in parallel waves. |
| Losing subagent results in chat history | Record them with subagent-result.py before closure. |
| Leaving subagent sessions open after all work is integrated | Run subagent-sweep.py --close-completed, or record keep-open / close-unavailable with a reason. |
| Running a complex task as hidden process state | Start a native loop with loop-start.py, record events, and close with loop-check.py --strict. |
| Treating traces as prose summaries | Record evidence: files, commands, decisions, outcomes, risks. |
| Leaving durable trace decisions only in raw traces | Promote them into compact notes before closure. |
| Letting memory grow until retrieval slows down | Run memory-maintenance.py; compact notes, repair sources, and archive promoted traces manually from its report. |
| Treating Memory Dreaming as a user chore | Run memory-dream.py maintain --auto-safe --agent-review; the script applies safe mechanical actions and the agent reviews semantic suggestions. |
| Declaring old context unavailable without checking dormant memory | Run memory-dream.py search-dormant first, then reactivate only a compact note if needed. |
| Using one broad trace for unrelated work | Split the work into one trace per coherent task; use session-index only as an index. |
| Creating duplicate active notes for the same decision | Keep one active canonical-decision per scope; mark older notes superseded or convert them to trace-summary. |
| Treating trace summaries as canonical memory | Link them from the canonical note or mark them non-canonical. |
Reverting with git reset --hard or broad checkout | Use selective-revert.py to plan file/hunk-level rollback with backups and explicit --apply. |
| Treating user edits as regressions because older tests or snapshots fail | Use User Change Arbitration: explain the conflict and ask whether to preserve the new behavior, update tests, or restore the old behavior. |
| Editing protected TDD tests to pass | Stop and explain; only replace a wrong test with an equally strict corrected test. |
| Reporting done without closure | Run the closure checklist or state the blocker. |
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.