Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 14 additions & 1 deletion .github/checks.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ def ok(msg):
except Exception as e:
fail(f"version check: {e}")

# 3. All four skills exist with frontmatter name + description
# 3. All four skills exist with frontmatter name + description and Codex metadata
for skill in ["fable-method", "fable-loop", "fable-judge", "fable-domain"]:
path = os.path.join(ROOT, "skills", skill, "SKILL.md")
try:
Expand All @@ -61,6 +61,19 @@ def ok(msg):
except Exception as e:
fail(f"skills/{skill}/SKILL.md: {e}")

metadata_path = os.path.join(ROOT, "skills", skill, "agents", "openai.yaml")
try:
with io.open(metadata_path, encoding="utf-8") as f:
metadata = f.read()
required = ["interface:", "display_name:", "short_description:", "default_prompt:"]
missing = [field for field in required if field not in metadata]
if missing or f"${skill}" not in metadata:
fail(f"skills/{skill}/agents/openai.yaml: missing fields or skill prompt")
else:
ok(f"skills/{skill}/agents/openai.yaml valid")
except Exception as e:
fail(f"skills/{skill}/agents/openai.yaml: {e}")

# 4. Domain adapters all carry a binding minimum evidence set and a fraud table
domains_dir = os.path.join(ROOT, "skills", "fable-method", "references", "domains")
for name in sorted(os.listdir(domains_dir)):
Expand Down
21 changes: 21 additions & 0 deletions .github/workflows/checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,24 @@ jobs:
python-version: "3.12"
- name: Validate manifests, skills, adapters, evidence, and style
run: python .github/checks.py
- name: Smoke-test Bash installers
run: |
claude_home="$(mktemp -d)"
bash install.sh --claude --dest "$claude_home/skills"
test -f "$claude_home/skills/fable-domain/SKILL.md"
codex_home="$(mktemp -d)"
CODEX_HOME="$codex_home" bash install.sh --codex
test -f "$codex_home/skills/fable-domain/SKILL.md"
test -f "$codex_home/skills/fable-method/agents/openai.yaml"
- name: Smoke-test PowerShell Codex installer
shell: pwsh
run: |
$claudeSkills = Join-Path $env:RUNNER_TEMP "fable-claude-skills"
$codexSkills = Join-Path $env:RUNNER_TEMP "fable-codex-skills"
./install.ps1 -Target claude -Destination $claudeSkills
./install.ps1 -Target codex -Destination $codexSkills
foreach ($destination in @($claudeSkills, $codexSkills)) {
if (-not (Test-Path (Join-Path $destination "fable-domain/SKILL.md"))) {
throw "fable-domain was not installed into $destination"
}
}
23 changes: 18 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,15 +80,27 @@ Seven more charts (ask classification with tie-breaks, the bounded evidence loop

All four skills arrive namespaced (`/fable:fable-method`, `/fable:fable-loop`, `/fable:fable-judge`, `/fable:fable-domain`), versioned, and updatable via `/plugin marketplace update`.

**As standalone skills** (un-namespaced `/fable-method` etc.):
**As standalone Claude Code skills** (un-namespaced `/fable-method` etc.):

```bash
git clone https://github.com/Sahir619/fable-method && bash fable-method/install.sh
git clone https://github.com/Sahir619/fable-method && bash fable-method/install.sh --claude
```

Windows PowerShell: `git clone https://github.com/Sahir619/fable-method; .\fable-method\install.ps1`
Windows PowerShell: `git clone https://github.com/Sahir619/fable-method; .\fable-method\install.ps1 -Target claude`

**Any other agent** (Codex, Cursor, aider, a raw system prompt): use [AGENTS.md](AGENTS.md), the identical method without Claude-specific frontmatter.
**As Codex skills:**

```bash
git clone https://github.com/Sahir619/fable-method && bash fable-method/install.sh --codex
```

Windows PowerShell: `git clone https://github.com/Sahir619/fable-method; .\fable-method\install.ps1 -Target codex`

All four skills are installed into `$CODEX_HOME/skills`, or `~/.codex/skills` when `CODEX_HOME` is unset. They are available to Codex in a new turn.

Both installers accept a custom destination for isolated or project-specific installs: `--dest PATH` in Bash or `-Destination PATH` in PowerShell.

**Any other agent** (Cursor, aider, a raw system prompt): use [AGENTS.md](AGENTS.md), the identical method without product-specific frontmatter.

**Make it proactive (recommended).** Skills fire best when nobody has to remember them. Add to your global `~/.claude/CLAUDE.md`:

Expand Down Expand Up @@ -166,9 +178,10 @@ skills/
fable-loop/ the orchestrated plan-execute-verify-audit workflow
fable-judge/ adversarial verification of finished work + trap suite
fable-domain/ generates new domain adapter bundles (adapter + trap + smoke eval)
*/agents/openai.yaml optional Codex display metadata for each skill
AGENTS.md the same method for any other harness
DOC.md plain-language explainer: the flow, what changed since 1.3, why it is better
install.sh / install.ps1 standalone-skill install into ~/.claude/skills/ (plugin preferred)
install.sh / install.ps1 standalone install into Claude Code or Codex skill directories
eval/
README.md methodology + how to reproduce
RESULTS.md dated round-by-round results log (wins, nulls, and failures)
Expand Down
36 changes: 26 additions & 10 deletions install.ps1
Original file line number Diff line number Diff line change
@@ -1,15 +1,31 @@
# Manual installer (Windows PowerShell) for users who prefer standalone
# skills over the plugin. Plugin install (recommended): inside Claude Code run
# /plugin marketplace add Sahir619/fable-method
# /plugin install fable@fable-method
param(
[ValidateSet("claude", "codex")]
[string]$Target = "claude",
[string]$Destination
)

# Standalone skill installer for Windows PowerShell.
# Usage: .\install.ps1 [-Target claude|codex] [-Destination PATH]
$ErrorActionPreference = "Stop"
$src = $PSScriptRoot
$dst = Join-Path $HOME ".claude\skills"

if ($Destination) {
$dst = $Destination
$product = if ($Target -eq "codex") { "Codex" } else { "Claude Code" }
} elseif ($Target -eq "codex") {
$codexHome = if ($env:CODEX_HOME) { $env:CODEX_HOME } else { Join-Path $HOME ".codex" }
$dst = Join-Path $codexHome "skills"
$product = "Codex"
} else {
$dst = Join-Path $HOME ".claude\skills"
$product = "Claude Code"
}

New-Item -ItemType Directory -Force -Path $dst | Out-Null
Copy-Item (Join-Path $src "skills\fable-method") $dst -Recurse -Force
Copy-Item (Join-Path $src "skills\fable-loop") $dst -Recurse -Force
Copy-Item (Join-Path $src "skills\fable-judge") $dst -Recurse -Force
$skills = @("fable-method", "fable-loop", "fable-judge", "fable-domain")
foreach ($skill in $skills) {
Copy-Item (Join-Path $src "skills\$skill") $dst -Recurse -Force
}

Write-Host "Installed: fable-method, fable-loop, fable-judge -> $dst"
Write-Host "Try it: open Claude Code and type /fable-judge after any agent claims work is done."
Write-Host "Installed: $($skills -join ' ') -> $dst"
Write-Host "The skills will be available to $product in a new turn."
60 changes: 50 additions & 10 deletions install.sh
Original file line number Diff line number Diff line change
@@ -1,16 +1,56 @@
#!/usr/bin/env bash
# Manual installer (macOS / Linux / Git Bash) for users who prefer standalone
# skills over the plugin. Plugin install (recommended): inside Claude Code run
# /plugin marketplace add Sahir619/fable-method
# /plugin install fable@fable-method
# Standalone skill installer for macOS, Linux, and Git Bash.
# Usage: ./install.sh [--claude|--codex] [--dest PATH]
set -euo pipefail

src="$(cd "$(dirname "$0")" && pwd)"
dst="$HOME/.claude/skills"
target="--claude"
destination=""

while [[ $# -gt 0 ]]; do
case "$1" in
--claude|--codex)
target="$1"
shift
;;
--dest)
if [[ $# -lt 2 ]]; then
echo "--dest requires a path" >&2
exit 2
fi
destination="$2"
shift 2
;;
--help|-h)
echo "Usage: $0 [--claude|--codex] [--dest PATH]"
exit 0
;;
*)
echo "Unknown argument: $1" >&2
echo "Usage: $0 [--claude|--codex] [--dest PATH]" >&2
exit 2
;;
esac
done

case "$target" in
--claude)
default_destination="$HOME/.claude/skills"
product="Claude Code"
;;
--codex)
default_destination="${CODEX_HOME:-$HOME/.codex}/skills"
product="Codex"
;;
esac

dst="${destination:-$default_destination}"

skills=(fable-method fable-loop fable-judge fable-domain)
mkdir -p "$dst"
cp -r "$src/skills/fable-method" "$dst/"
cp -r "$src/skills/fable-loop" "$dst/"
cp -r "$src/skills/fable-judge" "$dst/"
for skill in "${skills[@]}"; do
cp -r "$src/skills/$skill" "$dst/"
done

echo "Installed: fable-method, fable-loop, fable-judge -> $dst"
echo "Try it: open Claude Code and type /fable-judge after any agent claims work is done."
echo "Installed: ${skills[*]} -> $dst"
echo "The skills will be available to $product in a new turn."
2 changes: 1 addition & 1 deletion skills/fable-domain/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
name: fable-domain
description: Discuss a domain with the user, research it from real sources, then generate a trusted skill bundle for it - a step-by-step workflow with a flowchart, a domain adapter, a trap fixture, and a smoke eval. Use when the user says "/fable-domain <sector>", "make a skill for <domain>", "add a domain to the fable method", or "give a lesser model Fable's workflow for <domain>". The bundle is the deliverable; a workflow without its flowchart, sources, and trap is not done.
description: Discuss a domain with the user, research it from real sources, then generate a trusted skill bundle for it - a step-by-step workflow with a flowchart, a domain adapter, a trap fixture, and a smoke eval. Use when the user says "/fable-domain SECTOR", "make a skill for DOMAIN", "add a domain to the fable method", or "give a lesser model Fable's workflow for DOMAIN". The bundle is the deliverable; a workflow without its flowchart, sources, and trap is not done.
---

# fable-domain
Expand Down
4 changes: 4 additions & 0 deletions skills/fable-domain/agents/openai.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
interface:
display_name: "Fable Domain"
short_description: "Build a researched domain workflow"
default_prompt: "Use $fable-domain to build a researched workflow and trap-based evaluation for this domain."
2 changes: 1 addition & 1 deletion skills/fable-judge/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
name: fable-judge
description: Adversarial verification of finished work. Treats any "done" as a set of claims, then re-runs the claimed verifications, diffs what actually changed, detects weakened tests and false completion claims, and delivers an evidence-based verdict (VERIFIED / VERIFIED WITH CAVEATS / REFUTED). Use after any agent or model claims work is complete - "/fable-judge", "judge this work", "verify what it did", "did that actually work?". Also runs the fable-method trap suite against a skill or model via "/fable-judge suite <target>".
description: Adversarial verification of finished work. Treats any "done" as a set of claims, then re-runs the claimed verifications, diffs what actually changed, detects weakened tests and false completion claims, and delivers an evidence-based verdict (VERIFIED / VERIFIED WITH CAVEATS / REFUTED). Use after any agent or model claims work is complete - "/fable-judge", "judge this work", "verify what it did", "did that actually work?". Also runs the fable-method trap suite against a skill or model via "/fable-judge suite TARGET".
---

# fable-judge
Expand Down
4 changes: 4 additions & 0 deletions skills/fable-judge/agents/openai.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
interface:
display_name: "Fable Judge"
short_description: "Verify completed work against evidence"
default_prompt: "Use $fable-judge to verify the completed work and report an evidence-based verdict."
4 changes: 4 additions & 0 deletions skills/fable-loop/agents/openai.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
interface:
display_name: "Fable Loop"
short_description: "Run an end-to-end verified workflow"
default_prompt: "Use $fable-loop to plan, execute, and verify this task end to end."
1 change: 0 additions & 1 deletion skills/fable-method/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
---
name: fable-method
description: A step-by-step problem-solving loop (classify the ask, define done, gather evidence, decide, act surgically, verify by observation, report outcome-first). Use when the user says "/fable-method", "use the fable method", or "approach this like Fable", or proactively when starting any multi-step task that no task-specific skill covers. Subcommands - plan (stop after the plan), audit (grade finished work against the loop), report (rewrite an answer outcome-first).
trigger: /fable-method
---

# The Fable Method
Expand Down
4 changes: 4 additions & 0 deletions skills/fable-method/agents/openai.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
interface:
display_name: "Fable Method"
short_description: "Structured evidence-first problem solving"
default_prompt: "Use $fable-method to solve this task with explicit evidence and verification."