Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
81e00c6
docs: fold the feature-vs-ADR boundary into the sweep successor packet
levifig Jul 15, 2026
edf1af2
docs: materialize intent-exploration-foundation and amend the success…
levifig Jul 19, 2026
d07e8bf
feat: establish the intent and exploration relational foundation
levifig Jul 19, 2026
0518bfb
feat: add deterministic intent, exploration, and conversation primitives
levifig Jul 19, 2026
ab0916e
feat: connect intake, links, and state surfaces to the intent model
levifig Jul 19, 2026
658f5a9
fix: harden operation-key binding and close review coverage gaps
levifig Jul 19, 2026
73145ac
feat: surface canonical intent and checkpoint continuity in journal c…
levifig Jul 19, 2026
0695ee2
feat: add read-only maintenance diagnosis and legacy deferral conversion
levifig Jul 19, 2026
d662916
chore: build update bundled CLI reference and target artifacts
levifig Jul 19, 2026
5dcec36
feat: converge explore, triage, and capture skills on the intent model
levifig Jul 19, 2026
6b85319
chore: build distribute the converged skill surface to all targets
levifig Jul 19, 2026
c6f9ab2
docs: record the proven state-authority boundary in architecture guid…
levifig Jul 19, 2026
85feba6
feat: plan install upgrades deterministically without mutation
levifig Jul 19, 2026
bcc2a5e
chore: build refresh bundled CLI reference and target artifacts
levifig Jul 19, 2026
d203f18
docs: record implementation evidence in the immediate successor packet
levifig Jul 19, 2026
974773f
fix: document the required spark resolve --by flag across help surfaces
levifig Jul 19, 2026
211b75f
chore: build refresh generated skills after the spark resolve contrac…
levifig Jul 19, 2026
d5e196e
test: re-record installed smoke evidence against current harness vers…
levifig Jul 19, 2026
6a39354
fix: resolve Codex adversarial review findings across state and guidance
levifig Jul 19, 2026
5b75f22
fix: quiet codex tracing in the installed smoke and re-record clean e…
levifig Jul 19, 2026
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
Binary file modified bin/native/darwin-arm64/loaf
Binary file not shown.
41 changes: 33 additions & 8 deletions cli/scripts/eval-skill-routing.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ const API_URL = "https://api.anthropic.com/v1/messages";
const API_KEY = process.env.ANTHROPIC_API_KEY;
const DEFAULT_MODEL = "claude-opus-4-6";
const MAX_DESC_CHARS = 250;
const EXPECTED_SKILL_COUNT = 34;
const EXPECTED_SKILL_COUNT = 35;

const PRICING = {
"claude-opus-4-6": { input: 15, output: 75 },
Expand Down Expand Up @@ -51,9 +51,14 @@ const TEST_CASES = {
"Bootstrap this repo with the standard project scaffolding",
],
brainstorm: [
"Help me think through options for notifications",
"Apply the brainstorm divergence stance to this exploration",
"What does the brainstorm technique say about capturing sparks during divergence?",
"Use the structured brainstorm questioning stance on this problem",
],
explore: [
"Explore several approaches before we choose one",
"What are the tradeoffs between these product ideas?",
"Resume the workflow exploration where we left off",
"Start an exploration of the caching options and checkpoint it",
],
breakdown: [
"Break this spec into implementation tasks",
Expand All @@ -64,6 +69,8 @@ const TEST_CASES = {
"Which loaf command shows the recent project journal?",
"Show me the Loaf CLI command for task status",
"What flags does loaf journal recent support?",
"Upgrade Loaf and bring this project current",
"Diagnose why the installed Loaf targets are stale and repair them",
],
council: [
"Convene a council on this architecture decision",
Expand Down Expand Up @@ -226,17 +233,35 @@ const CONFLICT_PROBES = [
prompt: "Go through the unresolved sparks and decide which ones become tasks",
},
{
group: "research-brainstorm",
choices: ["research", "brainstorm"],
expected: "brainstorm",
group: "research-explore",
choices: ["research", "explore"],
expected: "explore",
prompt: "Let's generate a few possible directions before choosing one",
},
{
group: "research-brainstorm",
choices: ["research", "brainstorm"],
group: "research-explore",
choices: ["research", "explore"],
expected: "research",
prompt: "Survey the current project and external options, then report findings",
},
{
group: "explore-triage",
choices: ["explore", "triage"],
expected: "triage",
prompt: "Go through the deferred intents and decide which to resume",
},
{
group: "explore-shape",
choices: ["explore", "shape"],
expected: "shape",
prompt: "This direction is settled; turn it into a bounded change we can implement",
},
{
group: "maintenance-workflow",
choices: ["loaf-reference", "triage"],
expected: "loaf-reference",
prompt: "Bring this project's Loaf installation current after the upgrade",
},
{
group: "strategy-reflect",
choices: ["strategy", "reflect"],
Expand Down
8 changes: 4 additions & 4 deletions cli/scripts/u8-claude-smoke.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ import { spawnSync } from "node:child_process";
const scriptDir = dirname(fileURLToPath(import.meta.url));
const repoRoot = resolve(scriptDir, "../..");
const researchDir = join(repoRoot, "docs/changes/20260710-journal-reliability-foundation/research");
const evidencePath = join(researchDir, "u8-claude-code-2.1.207-candidate-smoke.json");
const expectedVersion = "2.1.207";
const evidencePath = join(researchDir, "u8-claude-code-2.1.215-candidate-smoke.json");
const expectedVersion = "2.1.215";
const platform = `${process.platform}-${process.arch}`;
const candidatePluginPath = "plugins/loaf";

Expand Down Expand Up @@ -92,7 +92,7 @@ function main() {
if (buildClaude.status !== 0) throw new Error("candidate Claude build failed");
if (!existsSync(candidateBinary)) throw new Error("candidate plugin binary is missing");
const version = run("claude", ["--version"], repoRoot);
if (version.status !== 0 || !claudeVersionMatches(version.stdout, expectedVersion)) throw new Error("installed Claude version is not 2.1.207");
if (version.status !== 0 || !claudeVersionMatches(version.stdout, expectedVersion)) throw new Error("installed Claude version is not 2.1.215");
if (run("git", ["init", "-q"], disposableRepo).status !== 0) throw new Error("disposable Git initialization failed");
const candidateEnv = { LOAF_DB: dbPath };
if (run(candidateBinary, ["state", "init", "--json"], disposableRepo, candidateEnv).status !== 0) throw new Error("isolated Loaf state initialization failed");
Expand Down Expand Up @@ -154,7 +154,7 @@ function main() {
cleanup();
}
writeFileSync(evidencePath, `${JSON.stringify(smoke, null, 2)}\n`);
process.stdout.write(`${JSON.stringify({ evidence_path: "docs/changes/20260710-journal-reliability-foundation/research/u8-claude-code-2.1.207-candidate-smoke.json", exit_code: smoke.exit_code, assistant_marker_match: smoke.assistant_marker_match }, null, 2)}\n`);
process.stdout.write(`${JSON.stringify({ evidence_path: "docs/changes/20260710-journal-reliability-foundation/research/u8-claude-code-2.1.215-candidate-smoke.json", exit_code: smoke.exit_code, assistant_marker_match: smoke.assistant_marker_match }, null, 2)}\n`);
if (smoke.exit_code !== 0 || !smoke.assistant_marker_match) process.exitCode = 1;
}

Expand Down
6 changes: 3 additions & 3 deletions cli/scripts/u8-claude-smoke.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ test("rejects a stream without SessionStart hook response", () => {
});

test("requires the exact Claude Code version token", () => {
assert.equal(claudeVersionMatches("2.1.207 (Claude Code)\n", "2.1.207"), true);
assert.equal(claudeVersionMatches("2.1.2070 (Claude Code)", "2.1.207"), false);
assert.equal(claudeVersionMatches("Claude Code 2.1.207", "2.1.207"), false);
assert.equal(claudeVersionMatches("2.1.215 (Claude Code)\n", "2.1.215"), true);
assert.equal(claudeVersionMatches("2.1.2150 (Claude Code)", "2.1.215"), false);
assert.equal(claudeVersionMatches("Claude Code 2.1.215", "2.1.215"), false);
});
12 changes: 6 additions & 6 deletions cli/scripts/u8-codex-smoke.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ import { tmpdir } from "node:os";
const scriptDir = dirname(fileURLToPath(import.meta.url));
const repoRoot = resolve(scriptDir, "../..");
const researchDir = join(repoRoot, "docs/changes/20260710-journal-reliability-foundation/research");
const evidencePath = join(researchDir, "u8-codex-0.144.1-isolated-smoke.json");
const expectedVersion = "0.144.1";
const evidencePath = join(researchDir, "u8-codex-0.144.5-isolated-smoke.json");
const expectedVersion = "0.144.5";
const platform = `${process.platform}-${process.arch}`;
const candidateHooksPath = "dist/codex/.codex/hooks.json";
const candidateNativeRoot = join(repoRoot, "bin", "native");
Expand Down Expand Up @@ -148,7 +148,7 @@ function main() {
if (buildCodex.status !== 0) throw new Error("candidate Codex build failed");
if (!existsSync(candidateBinary)) throw new Error("candidate native binary is missing");
const version = run("codex", ["--version"], repoRoot);
if (version.status !== 0 || !codexVersionMatches(version.stdout, expectedVersion)) throw new Error("installed Codex version is not 0.144.1");
if (version.status !== 0 || !codexVersionMatches(version.stdout, expectedVersion)) throw new Error("installed Codex version is not 0.144.5");
if (run("git", ["init", "-q"], disposableRepo).status !== 0) throw new Error("disposable Git initialization failed");
const authPath = join(process.env.CODEX_HOME ?? join(process.env.HOME ?? "", ".codex"), "auth.json");
if (!existsSync(authPath)) throw new Error("installed Codex auth.json is unavailable");
Expand All @@ -164,7 +164,7 @@ function main() {
hooks: group.hooks.map((hook) => ({ ...hook, command: hook.command.replace("{{LOAF_EXECUTABLE}} journal context --from-hook --codex-hook", hookCommand) })),
}));
writeFileSync(join(codexHome, "hooks.json"), `${JSON.stringify(sourceHooks, null, 2)}\n`, { mode: 0o600 });
const candidateEnv = { CODEX_HOME: codexHome, LOAF_DB: dbPath };
const candidateEnv = { CODEX_HOME: codexHome, LOAF_DB: dbPath, RUST_LOG: "off" };
if (run(candidateBinary, ["state", "init", "--json"], disposableRepo, candidateEnv).status !== 0) throw new Error("isolated Loaf state initialization failed");
if (run(candidateBinary, ["journal", "log", `discover(smoke): ${marker}`], disposableRepo, candidateEnv).status !== 0) throw new Error("isolated journal marker write failed");
const codexArgs = ["exec", "--ephemeral", "--ignore-rules", "--dangerously-bypass-hook-trust", "--sandbox", "read-only", "--json", "-C", "<disposable-repo>", "Return exactly the unique marker supplied by SessionStart context, and nothing else."];
Expand All @@ -186,7 +186,7 @@ function main() {
adapter: "codex-session-start-v1",
mode: "isolated-codex-home",
invocation: { command: "codex", args: codexArgs, cwd: "<disposable-repo>" },
setup: ["build candidate Go binary and Codex target", "create disposable Git repository", "create isolated CODEX_HOME with hooks enabled", "copy installed auth.json into isolated CODEX_HOME with mode 0600", "initialize absolute disposable LOAF_DB", "write random marker to isolated journal", "observe hook stdout through a mode-0700 disposable wrapper and mode-0600 file"],
setup: ["build candidate Go binary and Codex target", "create disposable Git repository", "create isolated CODEX_HOME with hooks enabled", "copy installed auth.json into isolated CODEX_HOME with mode 0600", "initialize absolute disposable LOAF_DB", "write random marker to isolated journal", "observe hook stdout through a mode-0700 disposable wrapper and mode-0600 file", "disable Codex tracing logs (RUST_LOG=off) so backend transport noise cannot contaminate the stderr cleanliness gate"],
exit_code: codex.status,
stderr_empty: codex.stderr.length === 0,
stderr: sanitizedStderr(codex.stderr),
Expand Down Expand Up @@ -219,7 +219,7 @@ function main() {
cleanup();
}
writeFileSync(evidencePath, `${JSON.stringify(smoke, null, 2)}\n`);
process.stdout.write(`${JSON.stringify({ evidence_path: "docs/changes/20260710-journal-reliability-foundation/research/u8-codex-0.144.1-isolated-smoke.json", exit_code: smoke.exit_code, assistant_marker_match: smoke.assistant_marker_match }, null, 2)}\n`);
process.stdout.write(`${JSON.stringify({ evidence_path: "docs/changes/20260710-journal-reliability-foundation/research/u8-codex-0.144.5-isolated-smoke.json", exit_code: smoke.exit_code, assistant_marker_match: smoke.assistant_marker_match }, null, 2)}\n`);
if (smoke.exit_code !== 0 || !smoke.assistant_marker_match) process.exitCode = 1;
}

Expand Down
6 changes: 3 additions & 3 deletions cli/scripts/u8-codex-smoke.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ test("rejects malformed JSONL", () => {
});

test("requires the exact Codex CLI version token", () => {
assert.equal(codexVersionMatches("codex-cli 0.144.1\n", "0.144.1"), true);
assert.equal(codexVersionMatches("codex-cli 0.144.10\n", "0.144.1"), false);
assert.equal(codexVersionMatches("other-cli 0.144.1\n", "0.144.1"), false);
assert.equal(codexVersionMatches("codex-cli 0.144.5\n", "0.144.5"), true);
assert.equal(codexVersionMatches("codex-cli 0.144.50\n", "0.144.5"), false);
assert.equal(codexVersionMatches("other-cli 0.144.5\n", "0.144.5"), false);
});
8 changes: 4 additions & 4 deletions cli/scripts/u8-opencode-smoke.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ import { tmpdir } from "node:os";
const scriptDir = dirname(fileURLToPath(import.meta.url));
const repoRoot = resolve(scriptDir, "../..");
const researchDir = join(repoRoot, "docs/changes/20260710-journal-reliability-foundation/research");
const evidencePath = join(researchDir, "u8-opencode-1.17.18-isolated-smoke.json");
const expectedVersion = "1.17.18";
const evidencePath = join(researchDir, "u8-opencode-1.18.3-isolated-smoke.json");
const expectedVersion = "1.18.3";
const platform = `${process.platform}-${process.arch}`;
const candidateHooksPath = "dist/opencode/plugins/hooks.ts";
const candidateNativePath = `bin/native/${platform}/loaf`;
Expand Down Expand Up @@ -273,7 +273,7 @@ function main() {
const pluginURL = pathToFileURL(candidatePlugin).href;
const env = disposableEnvironment(tempRoot, dbPath, pluginURL);
const version = run(installedOpenCode, ["--version"], repoRoot, env);
if (version.status !== 0 || !opencodeVersionMatches(version.stdout)) throw new Error("installed OpenCode version is not exactly 1.17.18");
if (version.status !== 0 || !opencodeVersionMatches(version.stdout)) throw new Error("installed OpenCode version is not exactly 1.18.3");
if (run("git", ["init", "-q"], disposableRepo, env).status !== 0) throw new Error("disposable Git initialization failed");
if (run(candidateBinary, ["state", "init", "--json"], disposableRepo, env).status !== 0) throw new Error("isolated Loaf state initialization failed");
if (run(candidateBinary, ["journal", "log", `discover(smoke): ${marker}`], disposableRepo, env).status !== 0) throw new Error("isolated journal marker write failed");
Expand Down Expand Up @@ -312,7 +312,7 @@ function main() {
smoke.cleanup_succeeded = cleanupSucceeded;
}
writeFileSync(evidencePath, `${JSON.stringify(smoke, null, 2)}\n`);
process.stdout.write(`${JSON.stringify({ evidence_path: "docs/changes/20260710-journal-reliability-foundation/research/u8-opencode-1.17.18-isolated-smoke.json", exit_code: smoke.exit_code, assistant_marker_match: smoke.assistant_marker_match, plugin_loaded: smoke.plugin_loaded, root_session_lookup_proven: smoke.root_session_lookup_proven, cleanup_succeeded: smoke.cleanup_succeeded }, null, 2)}\n`);
process.stdout.write(`${JSON.stringify({ evidence_path: "docs/changes/20260710-journal-reliability-foundation/research/u8-opencode-1.18.3-isolated-smoke.json", exit_code: smoke.exit_code, assistant_marker_match: smoke.assistant_marker_match, plugin_loaded: smoke.plugin_loaded, root_session_lookup_proven: smoke.root_session_lookup_proven, cleanup_succeeded: smoke.cleanup_succeeded }, null, 2)}\n`);
if (smoke.exit_code !== 0 || !smoke.assistant_marker_match || !smoke.plugin_loaded || !smoke.root_session_lookup_proven || !smoke.cleanup_succeeded) process.exitCode = 1;
}

Expand Down
8 changes: 4 additions & 4 deletions cli/scripts/u8-opencode-smoke.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ import assert from "node:assert/strict";
import { collectTextValues, modelVisibleProof, opencodeVersionMatches, parseOpenCodeJSONL, sanitizeError, sanitizedStderr } from "./u8-opencode-smoke.mjs";

test("requires the exact OpenCode version token", () => {
assert.equal(opencodeVersionMatches("1.17.18\n"), true);
assert.equal(opencodeVersionMatches("1.17.180"), false);
assert.equal(opencodeVersionMatches("v1.17.18"), false);
assert.equal(opencodeVersionMatches("1.17.18-dev"), false);
assert.equal(opencodeVersionMatches("1.18.3\n"), true);
assert.equal(opencodeVersionMatches("1.18.30"), false);
assert.equal(opencodeVersionMatches("v1.18.3"), false);
assert.equal(opencodeVersionMatches("1.18.3-dev"), false);
});

test("recursively extracts only string values at text keys", () => {
Expand Down
8 changes: 4 additions & 4 deletions cmd/loaf/routing_eval_content_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ func TestRoutingEvalDryRunValidatesCurrentSkillSuite(t *testing.T) {
}

for _, want := range []string{
"Loaded 34 skills",
"Selected cases: 119",
"Loaded 35 skills",
"Selected cases: 127",
"Suite validation passed.",
} {
if !strings.Contains(output, want) {
Expand Down Expand Up @@ -52,10 +52,10 @@ func TestRoutingEvalContentHasNoPhantomSkillCases(t *testing.T) {
func TestSkillArchitectureCountMatchesCurrentTaxonomy(t *testing.T) {
root := repoRoot(t)
body := readTextFile(t, filepath.Join(root, "docs", "knowledge", "skill-architecture.md"))
if !strings.Contains(body, "34 skills total: 19 workflow/default-invocable, 15 reference/knowledge") {
if !strings.Contains(body, "35 skills total: 19 workflow/default-invocable, 16 non-invocable") {
t.Fatalf("skill architecture doc missing current 34-skill taxonomy")
}
if strings.Contains(body, "33 skills") || strings.Contains(body, "35 skills") {
if strings.Contains(body, "33 skills") || strings.Contains(body, "34 skills") {
t.Fatalf("skill architecture doc still contains stale skill count")
}
}
18 changes: 9 additions & 9 deletions config/target-capabilities.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
{
"target": "claude-code",
"surface": "cli",
"version": "2.1.207",
"version": "2.1.215",
"platform": "darwin-arm64",
"installed_mode": "plugin-dir",
"context": {
Expand All @@ -20,9 +20,9 @@
"status": "supported",
"model_visible": true,
"evidence": {
"source": "docs/changes/20260710-journal-reliability-foundation/research/u8-claude-code-2.1.207-candidate-smoke.json",
"source": "docs/changes/20260710-journal-reliability-foundation/research/u8-claude-code-2.1.215-candidate-smoke.json",
"level": "installed-smoke",
"summary": "Claude Code 2.1.207 startup smoke returned SessionStart additionalContext and the isolated marker was model-visible exactly."
"summary": "Claude Code 2.1.215 startup smoke returned SessionStart additionalContext and the isolated marker was model-visible exactly."
}
},
{
Expand Down Expand Up @@ -243,7 +243,7 @@
{
"target": "codex",
"surface": "cli",
"version": "0.144.1",
"version": "0.144.5",
"platform": "darwin-arm64",
"installed_mode": "isolated-codex-home",
"context": {
Expand All @@ -259,9 +259,9 @@
"status": "supported",
"model_visible": true,
"evidence": {
"source": "docs/changes/20260710-journal-reliability-foundation/research/u8-codex-0.144.1-isolated-smoke.json",
"source": "docs/changes/20260710-journal-reliability-foundation/research/u8-codex-0.144.5-isolated-smoke.json",
"level": "installed-smoke",
"summary": "Codex 0.144.1 isolated CODEX_HOME startup smoke observed exact native SessionStart hookSpecificOutput and the random marker was returned by the model."
"summary": "Codex 0.144.5 isolated CODEX_HOME startup smoke observed exact native SessionStart hookSpecificOutput and the random marker was returned by the model."
}
},
{
Expand Down Expand Up @@ -324,7 +324,7 @@
{
"target": "opencode",
"surface": "cli",
"version": "1.17.18",
"version": "1.18.3",
"platform": "darwin-arm64",
"installed_mode": "isolated-xdg",
"context": {
Expand All @@ -340,9 +340,9 @@
"status": "supported",
"model_visible": true,
"evidence": {
"source": "docs/changes/20260710-journal-reliability-foundation/research/u8-opencode-1.17.18-isolated-smoke.json",
"source": "docs/changes/20260710-journal-reliability-foundation/research/u8-opencode-1.18.3-isolated-smoke.json",
"level": "installed-smoke",
"summary": "OpenCode 1.17.18 isolated-XDG request smoke returned the exact random continuity marker through the model-visible plugin system transformation."
"summary": "OpenCode 1.18.3 isolated-XDG request smoke returned the exact random continuity marker through the model-visible plugin system transformation."
}
},
{
Expand Down
2 changes: 1 addition & 1 deletion content/skills/brainstorm/SKILL.claude-code.yaml
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
# Claude Code skill configuration
user-invocable: true
user-invocable: false
argument-hint: "[idea or problem]"
Loading
Loading