Merge feat/substrate-path-atoms-2026-05-01 → main
Substrate-unified-registry — 5-commit feature branch consolidating the leak-scrub root cause + visibility layer over the existing kit artefact graph. Commits in chronological order:3422bdcfeat(path-atoms): atomize ~/.claude memory + rules path referencesd6dbdeefeat(kei-registry): status subcommand — cross-cutting substrate dashboardcb1fddefeat(model-tier+branch-dna): activate cost router + give branches DNAbe1a864feat(outcome-hook): PostToolUse:Agent backfills outcome + stubs in ledgeraf46684feat(secrets+catalog): orphan-detector for env vars + image/video/voice models Pre-merge verify (RULE 0.16): cargo check --workspace → exit 0 cargo test --no-run --workspace → exit 0 agent-assembler test --no-run → exit 0 Coverage: 120 atoms (incl 3 path: user-memory, user-rules, user-hooks) 40 hooks, 106 primitives, 174 rules, 68 skills 21 model catalog entries (8 providers; was 11/5) 26 secrets indexed (11 orphan flagged for cleanup) 205 agent forks + 17 branches with DNA (100%) Net effect: - 0 username paths in tracked files (allowlisted: NOTICE, README, leak-check.yml) - All 38 agent manifests refactored to model = "sonnet" (4 stay opus) - kei-model-router learning loop closed via outcome-backfill hook - kei-registry status / secrets / list — three queries cover the substrate Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
commit
3b9133a311
92 changed files with 2884 additions and 458 deletions
|
|
@ -157,8 +157,84 @@ fn write_references(m: &Manifest, out: &mut String) {
|
||||||
out.push_str(&format!("- `{pc}` — project CLAUDE.md\n"));
|
out.push_str(&format!("- `{pc}` — project CLAUDE.md\n"));
|
||||||
}
|
}
|
||||||
if let Some(refs) = &m.references {
|
if let Some(refs) = &m.references {
|
||||||
|
// Open registry for path-atom resolution. Missing DB is non-fatal —
|
||||||
|
// references then fall through unchanged (advisory only).
|
||||||
|
let conn = {
|
||||||
|
let db_path = registry_client::default_db_path();
|
||||||
|
if db_path.exists() {
|
||||||
|
registry_client::open_read_only(&db_path).ok()
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
};
|
||||||
for r in &refs.extra {
|
for r in &refs.extra {
|
||||||
out.push_str(&format!("- `{r}`\n"));
|
let resolved = resolve_path_atom_ref(r, conn.as_ref());
|
||||||
|
out.push_str(&format!("- `{resolved}`\n"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Resolve a `path:NAME/file.md` reference to an opaque content-addressed
|
||||||
|
/// form `{path::NAME}/file.md` if `NAME` is a registered path-atom.
|
||||||
|
///
|
||||||
|
/// Behaviour:
|
||||||
|
/// - Input does not start with `path:` → return unchanged.
|
||||||
|
/// - Input starts with `path:` but lookup fails (no atom / not a path-atom /
|
||||||
|
/// no registry) → emit a stderr warning and return the input unchanged.
|
||||||
|
/// This is advisory: the warn surfaces typos in manifests but never
|
||||||
|
/// blocks rendering.
|
||||||
|
/// - Lookup succeeds → return `{path::NAME}/<suffix>`.
|
||||||
|
fn resolve_path_atom_ref(r: &str, conn: Option<&rusqlite::Connection>) -> String {
|
||||||
|
let Some(rest) = r.strip_prefix("path:") else {
|
||||||
|
return r.to_string();
|
||||||
|
};
|
||||||
|
let (name, suffix) = match rest.split_once('/') {
|
||||||
|
Some((n, s)) => (n, s),
|
||||||
|
// `path:NAME` with no `/file` part — atom-only ref. Resolve to
|
||||||
|
// `{path::NAME}` so the public output is still opaque.
|
||||||
|
None => (rest, ""),
|
||||||
|
};
|
||||||
|
let Some(c) = conn else {
|
||||||
|
eprintln!(
|
||||||
|
"warn [assembler]: 'path:{name}' reference but registry DB not open — passing through"
|
||||||
|
);
|
||||||
|
return r.to_string();
|
||||||
|
};
|
||||||
|
match registry_client::is_path_atom(c, name) {
|
||||||
|
Ok(true) => {
|
||||||
|
if suffix.is_empty() {
|
||||||
|
format!("{{path::{name}}}")
|
||||||
|
} else {
|
||||||
|
format!("{{path::{name}}}/{suffix}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(false) => {
|
||||||
|
eprintln!(
|
||||||
|
"warn [assembler]: 'path:{name}' not found in registry as path-atom — passing through"
|
||||||
|
);
|
||||||
|
r.to_string()
|
||||||
|
}
|
||||||
|
Err(e) => {
|
||||||
|
eprintln!("warn [assembler]: registry lookup for path-atom '{name}': {e}");
|
||||||
|
r.to_string()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod write_references_tests {
|
||||||
|
use super::resolve_path_atom_ref;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn passthrough_non_path_ref() {
|
||||||
|
let r = "~/.claude/memory/foo.md";
|
||||||
|
assert_eq!(resolve_path_atom_ref(r, None), r);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn passthrough_path_ref_when_no_db() {
|
||||||
|
// No registry conn → emit warn (suppressed in test) + passthrough.
|
||||||
|
let r = "path:user-memory/foo.md";
|
||||||
|
assert_eq!(resolve_path_atom_ref(r, None), r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -83,3 +83,111 @@ impl<T> OptionalExt<T> for rusqlite::Result<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Check if `name` is a registered path-atom.
|
||||||
|
///
|
||||||
|
/// Convention: a path-atom is an atom whose source file is
|
||||||
|
/// `_blocks/path-<name>.md` and whose YAML frontmatter declares
|
||||||
|
/// `kind: path`. The DB stores only the file path (not body), so this
|
||||||
|
/// function uses the filename convention as a fast first check, then
|
||||||
|
/// reads the file and parses the frontmatter to confirm `kind: path`.
|
||||||
|
///
|
||||||
|
/// Returns:
|
||||||
|
/// - `Ok(true)` — atom registered under `name`, file exists, frontmatter
|
||||||
|
/// declares `kind: path`. Caller may emit an opaque resolved reference.
|
||||||
|
/// - `Ok(false)` — atom not found, or found but not a path-atom. Caller
|
||||||
|
/// should pass the original reference through unchanged (with optional
|
||||||
|
/// warn-and-skip in caller).
|
||||||
|
/// - `Err(msg)` — DB query failure. Propagate.
|
||||||
|
pub fn is_path_atom(conn: &Connection, name: &str) -> Result<bool, String> {
|
||||||
|
let mut stmt = conn
|
||||||
|
.prepare(
|
||||||
|
"SELECT path FROM blocks \
|
||||||
|
WHERE name = ?1 AND block_type = 'atom' AND superseded_by IS NULL \
|
||||||
|
LIMIT 1",
|
||||||
|
)
|
||||||
|
.map_err(|e| format!("prepare path-atom query for {name}: {e}"))?;
|
||||||
|
let path: Option<String> = stmt
|
||||||
|
.query_row(rusqlite::params![name], |r| r.get(0))
|
||||||
|
.optional()
|
||||||
|
.map_err(|e| format!("query path-atom {name}: {e}"))?;
|
||||||
|
let Some(p) = path else { return Ok(false) };
|
||||||
|
// Filename convention check: `_blocks/path-<name>.md`. Cheap O(1) string
|
||||||
|
// contains, avoids the file read on the common non-path-atom case.
|
||||||
|
let expected_suffix = format!("/_blocks/path-{name}.md");
|
||||||
|
if !p.ends_with(&expected_suffix) {
|
||||||
|
return Ok(false);
|
||||||
|
}
|
||||||
|
// Read frontmatter to confirm `kind: path`. Defensive — convention is
|
||||||
|
// not authoritative on its own; explicit declaration is.
|
||||||
|
let body = match std::fs::read_to_string(&p) {
|
||||||
|
Ok(b) => b,
|
||||||
|
Err(_) => return Ok(false),
|
||||||
|
};
|
||||||
|
Ok(frontmatter_has_kind_path(&body))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Return true if `body` starts with a YAML frontmatter block (`---\n...---\n`)
|
||||||
|
/// containing a line whose key is `kind` and value is `path`. Tolerates
|
||||||
|
/// `---\r\n`, surrounding whitespace, and YAML quoting.
|
||||||
|
fn frontmatter_has_kind_path(body: &str) -> bool {
|
||||||
|
let stripped = match body
|
||||||
|
.strip_prefix("---\n")
|
||||||
|
.or_else(|| body.strip_prefix("---\r\n"))
|
||||||
|
{
|
||||||
|
Some(s) => s,
|
||||||
|
None => return false,
|
||||||
|
};
|
||||||
|
let end = match stripped
|
||||||
|
.find("\n---\n")
|
||||||
|
.or_else(|| stripped.find("\r\n---\r\n"))
|
||||||
|
{
|
||||||
|
Some(i) => i,
|
||||||
|
None => return false,
|
||||||
|
};
|
||||||
|
let frontmatter = &stripped[..end];
|
||||||
|
for line in frontmatter.lines() {
|
||||||
|
let line = line.trim();
|
||||||
|
if let Some(rest) = line.strip_prefix("kind:") {
|
||||||
|
let val = rest.trim().trim_matches(&['\'', '"'][..]);
|
||||||
|
return val == "path";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::frontmatter_has_kind_path;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn detects_kind_path_in_frontmatter() {
|
||||||
|
let body = "---\ntype: atom\nkind: path\nname: foo\n---\n\n# body\n";
|
||||||
|
assert!(frontmatter_has_kind_path(body));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn rejects_kind_other() {
|
||||||
|
let body = "---\ntype: atom\nkind: other\n---\n";
|
||||||
|
assert!(!frontmatter_has_kind_path(body));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn rejects_no_frontmatter() {
|
||||||
|
let body = "# just markdown\n";
|
||||||
|
assert!(!frontmatter_has_kind_path(body));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn tolerates_quoted_value() {
|
||||||
|
let body = "---\nkind: \"path\"\n---\n";
|
||||||
|
assert!(frontmatter_has_kind_path(body));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn rejects_kind_path_substring() {
|
||||||
|
// `kind: pathological` must NOT match `kind: path`.
|
||||||
|
let body = "---\nkind: pathological\n---\n";
|
||||||
|
assert!(!frontmatter_has_kind_path(body));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
28
_blocks/path-user-hooks.md
Normal file
28
_blocks/path-user-hooks.md
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
---
|
||||||
|
type: atom
|
||||||
|
kind: path
|
||||||
|
name: user-hooks
|
||||||
|
template: ~/.claude/hooks
|
||||||
|
expand_at: render
|
||||||
|
---
|
||||||
|
|
||||||
|
# Path atom — user-hooks
|
||||||
|
|
||||||
|
Resolves to the user's `~/.claude/hooks/` directory (PreToolUse / PostToolUse / UserPromptSubmit / Stop hook scripts like `agent-stub-scan.sh`, `agent-outcome-backfill.sh`, `numeric-claims-guard.sh`, etc.).
|
||||||
|
|
||||||
|
Used by agent manifests (`_manifests/*.toml`) to reference hook scripts without leaking the absolute path (with the maintainer's home `/Users/<user>/...`) into public artefacts under `_generated/`.
|
||||||
|
|
||||||
|
**Usage in manifests:**
|
||||||
|
```toml
|
||||||
|
[references]
|
||||||
|
extra = [
|
||||||
|
"path:user-hooks/agent-outcome-backfill.sh",
|
||||||
|
"path:user-hooks/agent-stub-scan.sh",
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Resolution:** the assembler detects the `path:user-hooks/` prefix, looks up this atom in the registry, and emits an opaque DNA reference into the rendered `_generated/<agent>.md`. Same content-addressing semantics as `path-user-memory` and `path-user-rules` — published artefact has DNA hashes, not paths. A reader with a local kit + registry resolves the DNA back to the file; a reader without the kit sees only the opaque hash.
|
||||||
|
|
||||||
|
**Expand timing:** `render` — substitution happens at `_assembler` time, before the `_generated/` markdown is written.
|
||||||
|
|
||||||
|
**Constructor Pattern:** one cube, one path. No code, no logic. Body bytes + frontmatter ARE the atom. Hash → DNA via standard registry pipeline.
|
||||||
28
_blocks/path-user-memory.md
Normal file
28
_blocks/path-user-memory.md
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
---
|
||||||
|
type: atom
|
||||||
|
kind: path
|
||||||
|
name: user-memory
|
||||||
|
template: ~/.claude/memory
|
||||||
|
expand_at: render
|
||||||
|
---
|
||||||
|
|
||||||
|
# Path atom — user-memory
|
||||||
|
|
||||||
|
Resolves to the user's `~/.claude/memory/` directory.
|
||||||
|
|
||||||
|
Used by agent manifests (`_manifests/*.toml`) to reference companion memory files without leaking the absolute path (with maintainer's home `/Users/<user>/...`) into public artefacts under `_generated/`.
|
||||||
|
|
||||||
|
**Usage in manifests:**
|
||||||
|
```toml
|
||||||
|
[references]
|
||||||
|
extra = [
|
||||||
|
"path:user-memory/wrong-paths-specialized-ml.md",
|
||||||
|
"path:user-memory/fal-ai-models.md",
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Resolution:** the assembler detects the `path:user-memory/` prefix, looks up this atom in the registry, and emits an opaque DNA reference into the rendered `_generated/<agent>.md`. The published markdown therefore contains a content-addressed atom-DNA link, not an absolute path. A reader with a local kit + registry resolves the DNA back to the file; a reader without the kit sees only the opaque hash.
|
||||||
|
|
||||||
|
**Expand timing:** `render` — substitution happens at `_assembler` time, before the `_generated/` markdown is written.
|
||||||
|
|
||||||
|
**Constructor Pattern:** one cube, one path. No code, no logic. Body bytes + frontmatter ARE the atom. Hash → DNA via standard registry pipeline.
|
||||||
28
_blocks/path-user-rules.md
Normal file
28
_blocks/path-user-rules.md
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
---
|
||||||
|
type: atom
|
||||||
|
kind: path
|
||||||
|
name: user-rules
|
||||||
|
template: ~/.claude/rules
|
||||||
|
expand_at: render
|
||||||
|
---
|
||||||
|
|
||||||
|
# Path atom — user-rules
|
||||||
|
|
||||||
|
Resolves to the user's `~/.claude/rules/` directory (umbrella rule files like `api-cost-guard.md`, `paradigm-native-measurement.md`, `manifold-tangent-sanity.md`, etc.).
|
||||||
|
|
||||||
|
Used by agent manifests (`_manifests/*.toml`) to reference rule files without leaking the absolute path into public artefacts under `_generated/`.
|
||||||
|
|
||||||
|
**Usage in manifests:**
|
||||||
|
```toml
|
||||||
|
[references]
|
||||||
|
extra = [
|
||||||
|
"path:user-rules/api-cost-guard.md",
|
||||||
|
"path:user-rules/paradigm-native-measurement.md",
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Resolution:** the assembler detects the `path:user-rules/` prefix, looks up this atom in the registry, and emits an opaque DNA reference into the rendered `_generated/<agent>.md`. Same content-addressing semantics as `path-user-memory` — published artefact has DNA hashes, not paths.
|
||||||
|
|
||||||
|
**Expand timing:** `render` — substitution at `_assembler` time.
|
||||||
|
|
||||||
|
**Constructor Pattern:** one cube, one path. Body + frontmatter is the atom.
|
||||||
|
|
@ -242,8 +242,8 @@ Blockers / next: <list>
|
||||||
|
|
||||||
- `~/.claude/CLAUDE.md` — baseline umbrella
|
- `~/.claude/CLAUDE.md` — baseline umbrella
|
||||||
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
||||||
- `~/.claude/rules/code-style.md`
|
- `{path::user-rules}/code-style.md`
|
||||||
- `~/.claude/rules/doc-conventions.md`
|
- `{path::user-rules}/doc-conventions.md`
|
||||||
- `~/.claude/rules/dev-workflow.md`
|
- `{path::user-rules}/dev-workflow.md`
|
||||||
- `~/.claude/rules/debugging.md`
|
- `{path::user-rules}/debugging.md`
|
||||||
- `~/.claude/rules/no-downgrade-constructive.md`
|
- `{path::user-rules}/no-downgrade-constructive.md`
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
name: code-implementer-flutter
|
name: code-implementer-flutter
|
||||||
description: Flutter / Dart implementation specialist. Riverpod state, Clean Architecture, multi-platform apps.
|
description: Flutter / Dart implementation specialist. Riverpod state, Clean Architecture, multi-platform apps.
|
||||||
tools: Glob, Grep, Read, Edit, Write, Bash, Agent
|
tools: Glob, Grep, Read, Edit, Write, Bash, Agent
|
||||||
model: opus
|
model: sonnet
|
||||||
---
|
---
|
||||||
|
|
||||||
<!-- GENERATED by _assembler (Rust) from _manifests/code-implementer-flutter.toml — DO NOT EDIT. Edit the manifest. -->
|
<!-- GENERATED by _assembler (Rust) from _manifests/code-implementer-flutter.toml — DO NOT EDIT. Edit the manifest. -->
|
||||||
|
|
@ -300,13 +300,46 @@ Rules: architectural decision → E1-E2. Financial (compute) → ONLY E1. Data >
|
||||||
|
|
||||||
**Forbidden:** transitioning without saving; writing "works" without metrics; leaving credentials only in conversation context.
|
**Forbidden:** transitioning without saving; writing "works" without metrics; leaving credentials only in conversation context.
|
||||||
|
|
||||||
# PRE-DEV GATE (before writing any code)
|
# PRE-DEV GATE — three checks before any new code
|
||||||
|
|
||||||
1. **Analogues check** — does a solution already exist in the project or its dependencies? Use `Grep`/`Glob`
|
This gate runs ONCE before you write a single line of new code on a non-trivial change. Skipping it is the most common cause of overlapping rewrites, dependency drift, and silent duplication.
|
||||||
2. **Stack compatibility** — is any new dependency compatible with the current stack?
|
|
||||||
3. **Duplication check** — are you about to duplicate existing code?
|
|
||||||
|
|
||||||
If any check fails → STOP and reconsider.
|
## 1. Analogues check — does this already exist?
|
||||||
|
|
||||||
|
Before designing your own solution, search the project + its direct dependencies for an existing one. Use `Grep` / `Glob` for symbols and patterns; use the keimd graph index (`keimd related <file>`, `keimd search <query>`) for semantic relatedness.
|
||||||
|
|
||||||
|
- Search the symbol you'd name (function / type / struct).
|
||||||
|
- Search adjacent verb forms (`scan_*`, `parse_*`, `*_handler`).
|
||||||
|
- Read the README and `_primitives/MANIFEST.toml` (or equivalent index) for cubes that already cover this concern.
|
||||||
|
|
||||||
|
If a usable analogue exists, **prefer reusing or extending it** over a parallel implementation. Branching the codebase on the same concern produces shotgun-surgery later.
|
||||||
|
|
||||||
|
## 2. Stack compatibility — does the new dep belong?
|
||||||
|
|
||||||
|
If your change pulls a new dependency, check it against the project's existing stack BEFORE adding to `Cargo.toml` / `package.json` / `pyproject.toml`:
|
||||||
|
|
||||||
|
- **Language match** — does the dep's language fit the project's default? In Rust-first projects, a Python-only dep needs a stated exception.
|
||||||
|
- **Maintenance signal** — last release date, open-issue count, transitive dep count.
|
||||||
|
- **Conflict with existing deps** — runtime conflicts (two HTTP clients, two TLS stacks, two async runtimes) are silent foot-guns.
|
||||||
|
- **License** — Apache-2.0 / MIT / BSD-3 are safe; AGPL / SSPL / proprietary need explicit approval.
|
||||||
|
|
||||||
|
If the dep doesn't fit, prefer the existing stack's idiomatic primitive even if it's slightly less convenient.
|
||||||
|
|
||||||
|
## 3. Duplication check — are you about to recreate something?
|
||||||
|
|
||||||
|
The architecture-overlay incident (a single file ballooned 227 → 354 LOC purely from "fix" patches that duplicated the formula they were supposed to repair) is the canonical warning. Before adding new code on top of existing code, ask:
|
||||||
|
|
||||||
|
- Am I patching around a problem instead of fixing it at the root?
|
||||||
|
- Is this new function logically the same as one already in the codebase, just with different phrasing?
|
||||||
|
- Is my change adding a third copy of a constant / config value / regex that should live in one place?
|
||||||
|
|
||||||
|
If yes → STOP and refactor at the root before adding the new behaviour.
|
||||||
|
|
||||||
|
## Failing the gate
|
||||||
|
|
||||||
|
If ANY check fails, stop and reconsider. The cheapest pivot is at this gate; every layer downstream (commit, review, audit, deploy) is more expensive to walk back. Do not proceed to implementation while one of the three checks is unresolved.
|
||||||
|
|
||||||
|
The gate is paired with **Plan Mode First** — you write the plan AFTER this gate (so the plan reflects what already exists), not before.
|
||||||
|
|
||||||
# TEST-FIRST
|
# TEST-FIRST
|
||||||
|
|
||||||
|
|
@ -378,5 +411,5 @@ Blockers / next: <list>
|
||||||
|
|
||||||
- `~/.claude/CLAUDE.md` — baseline umbrella
|
- `~/.claude/CLAUDE.md` — baseline umbrella
|
||||||
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
||||||
- `~/.claude/rules/code-style.md`
|
- `{path::user-rules}/code-style.md`
|
||||||
- `~/.claude/rules/karpathy-behavioral.md`
|
- `{path::user-rules}/karpathy-behavioral.md`
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
name: code-implementer-go
|
name: code-implementer-go
|
||||||
description: Go implementation specialist. Mesh networking, lightweight CLI, embedded servers. Constructor Pattern enforced.
|
description: Go implementation specialist. Mesh networking, lightweight CLI, embedded servers. Constructor Pattern enforced.
|
||||||
tools: Glob, Grep, Read, Edit, Write, Bash, Agent
|
tools: Glob, Grep, Read, Edit, Write, Bash, Agent
|
||||||
model: opus
|
model: sonnet
|
||||||
---
|
---
|
||||||
|
|
||||||
<!-- GENERATED by _assembler (Rust) from _manifests/code-implementer-go.toml — DO NOT EDIT. Edit the manifest. -->
|
<!-- GENERATED by _assembler (Rust) from _manifests/code-implementer-go.toml — DO NOT EDIT. Edit the manifest. -->
|
||||||
|
|
@ -300,13 +300,46 @@ Rules: architectural decision → E1-E2. Financial (compute) → ONLY E1. Data >
|
||||||
|
|
||||||
**Forbidden:** transitioning without saving; writing "works" without metrics; leaving credentials only in conversation context.
|
**Forbidden:** transitioning without saving; writing "works" without metrics; leaving credentials only in conversation context.
|
||||||
|
|
||||||
# PRE-DEV GATE (before writing any code)
|
# PRE-DEV GATE — three checks before any new code
|
||||||
|
|
||||||
1. **Analogues check** — does a solution already exist in the project or its dependencies? Use `Grep`/`Glob`
|
This gate runs ONCE before you write a single line of new code on a non-trivial change. Skipping it is the most common cause of overlapping rewrites, dependency drift, and silent duplication.
|
||||||
2. **Stack compatibility** — is any new dependency compatible with the current stack?
|
|
||||||
3. **Duplication check** — are you about to duplicate existing code?
|
|
||||||
|
|
||||||
If any check fails → STOP and reconsider.
|
## 1. Analogues check — does this already exist?
|
||||||
|
|
||||||
|
Before designing your own solution, search the project + its direct dependencies for an existing one. Use `Grep` / `Glob` for symbols and patterns; use the keimd graph index (`keimd related <file>`, `keimd search <query>`) for semantic relatedness.
|
||||||
|
|
||||||
|
- Search the symbol you'd name (function / type / struct).
|
||||||
|
- Search adjacent verb forms (`scan_*`, `parse_*`, `*_handler`).
|
||||||
|
- Read the README and `_primitives/MANIFEST.toml` (or equivalent index) for cubes that already cover this concern.
|
||||||
|
|
||||||
|
If a usable analogue exists, **prefer reusing or extending it** over a parallel implementation. Branching the codebase on the same concern produces shotgun-surgery later.
|
||||||
|
|
||||||
|
## 2. Stack compatibility — does the new dep belong?
|
||||||
|
|
||||||
|
If your change pulls a new dependency, check it against the project's existing stack BEFORE adding to `Cargo.toml` / `package.json` / `pyproject.toml`:
|
||||||
|
|
||||||
|
- **Language match** — does the dep's language fit the project's default? In Rust-first projects, a Python-only dep needs a stated exception.
|
||||||
|
- **Maintenance signal** — last release date, open-issue count, transitive dep count.
|
||||||
|
- **Conflict with existing deps** — runtime conflicts (two HTTP clients, two TLS stacks, two async runtimes) are silent foot-guns.
|
||||||
|
- **License** — Apache-2.0 / MIT / BSD-3 are safe; AGPL / SSPL / proprietary need explicit approval.
|
||||||
|
|
||||||
|
If the dep doesn't fit, prefer the existing stack's idiomatic primitive even if it's slightly less convenient.
|
||||||
|
|
||||||
|
## 3. Duplication check — are you about to recreate something?
|
||||||
|
|
||||||
|
The architecture-overlay incident (a single file ballooned 227 → 354 LOC purely from "fix" patches that duplicated the formula they were supposed to repair) is the canonical warning. Before adding new code on top of existing code, ask:
|
||||||
|
|
||||||
|
- Am I patching around a problem instead of fixing it at the root?
|
||||||
|
- Is this new function logically the same as one already in the codebase, just with different phrasing?
|
||||||
|
- Is my change adding a third copy of a constant / config value / regex that should live in one place?
|
||||||
|
|
||||||
|
If yes → STOP and refactor at the root before adding the new behaviour.
|
||||||
|
|
||||||
|
## Failing the gate
|
||||||
|
|
||||||
|
If ANY check fails, stop and reconsider. The cheapest pivot is at this gate; every layer downstream (commit, review, audit, deploy) is more expensive to walk back. Do not proceed to implementation while one of the three checks is unresolved.
|
||||||
|
|
||||||
|
The gate is paired with **Plan Mode First** — you write the plan AFTER this gate (so the plan reflects what already exists), not before.
|
||||||
|
|
||||||
# TEST-FIRST
|
# TEST-FIRST
|
||||||
|
|
||||||
|
|
@ -378,5 +411,5 @@ Blockers / next: <list>
|
||||||
|
|
||||||
- `~/.claude/CLAUDE.md` — baseline umbrella
|
- `~/.claude/CLAUDE.md` — baseline umbrella
|
||||||
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
||||||
- `~/.claude/rules/code-style.md`
|
- `{path::user-rules}/code-style.md`
|
||||||
- `~/.claude/rules/karpathy-behavioral.md`
|
- `{path::user-rules}/karpathy-behavioral.md`
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
name: code-implementer-python
|
name: code-implementer-python
|
||||||
description: Python implementation specialist. Use only when RULE 0.2 exception #N is stated. Default to delegating Rust.
|
description: Python implementation specialist. Use only when RULE 0.2 exception #N is stated. Default to delegating Rust.
|
||||||
tools: Glob, Grep, Read, Edit, Write, Bash, NotebookEdit, Agent
|
tools: Glob, Grep, Read, Edit, Write, Bash, NotebookEdit, Agent
|
||||||
model: opus
|
model: sonnet
|
||||||
---
|
---
|
||||||
|
|
||||||
<!-- GENERATED by _assembler (Rust) from _manifests/code-implementer-python.toml — DO NOT EDIT. Edit the manifest. -->
|
<!-- GENERATED by _assembler (Rust) from _manifests/code-implementer-python.toml — DO NOT EDIT. Edit the manifest. -->
|
||||||
|
|
@ -300,13 +300,46 @@ Rules: architectural decision → E1-E2. Financial (compute) → ONLY E1. Data >
|
||||||
|
|
||||||
**Forbidden:** transitioning without saving; writing "works" without metrics; leaving credentials only in conversation context.
|
**Forbidden:** transitioning without saving; writing "works" without metrics; leaving credentials only in conversation context.
|
||||||
|
|
||||||
# PRE-DEV GATE (before writing any code)
|
# PRE-DEV GATE — three checks before any new code
|
||||||
|
|
||||||
1. **Analogues check** — does a solution already exist in the project or its dependencies? Use `Grep`/`Glob`
|
This gate runs ONCE before you write a single line of new code on a non-trivial change. Skipping it is the most common cause of overlapping rewrites, dependency drift, and silent duplication.
|
||||||
2. **Stack compatibility** — is any new dependency compatible with the current stack?
|
|
||||||
3. **Duplication check** — are you about to duplicate existing code?
|
|
||||||
|
|
||||||
If any check fails → STOP and reconsider.
|
## 1. Analogues check — does this already exist?
|
||||||
|
|
||||||
|
Before designing your own solution, search the project + its direct dependencies for an existing one. Use `Grep` / `Glob` for symbols and patterns; use the keimd graph index (`keimd related <file>`, `keimd search <query>`) for semantic relatedness.
|
||||||
|
|
||||||
|
- Search the symbol you'd name (function / type / struct).
|
||||||
|
- Search adjacent verb forms (`scan_*`, `parse_*`, `*_handler`).
|
||||||
|
- Read the README and `_primitives/MANIFEST.toml` (or equivalent index) for cubes that already cover this concern.
|
||||||
|
|
||||||
|
If a usable analogue exists, **prefer reusing or extending it** over a parallel implementation. Branching the codebase on the same concern produces shotgun-surgery later.
|
||||||
|
|
||||||
|
## 2. Stack compatibility — does the new dep belong?
|
||||||
|
|
||||||
|
If your change pulls a new dependency, check it against the project's existing stack BEFORE adding to `Cargo.toml` / `package.json` / `pyproject.toml`:
|
||||||
|
|
||||||
|
- **Language match** — does the dep's language fit the project's default? In Rust-first projects, a Python-only dep needs a stated exception.
|
||||||
|
- **Maintenance signal** — last release date, open-issue count, transitive dep count.
|
||||||
|
- **Conflict with existing deps** — runtime conflicts (two HTTP clients, two TLS stacks, two async runtimes) are silent foot-guns.
|
||||||
|
- **License** — Apache-2.0 / MIT / BSD-3 are safe; AGPL / SSPL / proprietary need explicit approval.
|
||||||
|
|
||||||
|
If the dep doesn't fit, prefer the existing stack's idiomatic primitive even if it's slightly less convenient.
|
||||||
|
|
||||||
|
## 3. Duplication check — are you about to recreate something?
|
||||||
|
|
||||||
|
The architecture-overlay incident (a single file ballooned 227 → 354 LOC purely from "fix" patches that duplicated the formula they were supposed to repair) is the canonical warning. Before adding new code on top of existing code, ask:
|
||||||
|
|
||||||
|
- Am I patching around a problem instead of fixing it at the root?
|
||||||
|
- Is this new function logically the same as one already in the codebase, just with different phrasing?
|
||||||
|
- Is my change adding a third copy of a constant / config value / regex that should live in one place?
|
||||||
|
|
||||||
|
If yes → STOP and refactor at the root before adding the new behaviour.
|
||||||
|
|
||||||
|
## Failing the gate
|
||||||
|
|
||||||
|
If ANY check fails, stop and reconsider. The cheapest pivot is at this gate; every layer downstream (commit, review, audit, deploy) is more expensive to walk back. Do not proceed to implementation while one of the three checks is unresolved.
|
||||||
|
|
||||||
|
The gate is paired with **Plan Mode First** — you write the plan AFTER this gate (so the plan reflects what already exists), not before.
|
||||||
|
|
||||||
# TEST-FIRST
|
# TEST-FIRST
|
||||||
|
|
||||||
|
|
@ -378,5 +411,5 @@ Blockers / next: <list>
|
||||||
|
|
||||||
- `~/.claude/CLAUDE.md` — baseline umbrella
|
- `~/.claude/CLAUDE.md` — baseline umbrella
|
||||||
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
||||||
- `~/.claude/rules/code-style.md`
|
- `{path::user-rules}/code-style.md`
|
||||||
- `~/.claude/rules/karpathy-behavioral.md`
|
- `{path::user-rules}/karpathy-behavioral.md`
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
name: code-implementer-rust
|
name: code-implementer-rust
|
||||||
description: Rust implementation specialist (Cargo, traits, async/tokio, rusqlite, tests). RULE 0.2 default language. Constructor Pattern enforced. Hands off other languages to siblings.
|
description: Rust implementation specialist (Cargo, traits, async/tokio, rusqlite, tests). RULE 0.2 default language. Constructor Pattern enforced. Hands off other languages to siblings.
|
||||||
tools: Glob, Grep, Read, Edit, Write, Bash, Agent
|
tools: Glob, Grep, Read, Edit, Write, Bash, Agent
|
||||||
model: opus
|
model: sonnet
|
||||||
---
|
---
|
||||||
|
|
||||||
<!-- GENERATED by _assembler (Rust) from _manifests/code-implementer-rust.toml — DO NOT EDIT. Edit the manifest. -->
|
<!-- GENERATED by _assembler (Rust) from _manifests/code-implementer-rust.toml — DO NOT EDIT. Edit the manifest. -->
|
||||||
|
|
@ -300,13 +300,46 @@ Rules: architectural decision → E1-E2. Financial (compute) → ONLY E1. Data >
|
||||||
|
|
||||||
**Forbidden:** transitioning without saving; writing "works" without metrics; leaving credentials only in conversation context.
|
**Forbidden:** transitioning without saving; writing "works" without metrics; leaving credentials only in conversation context.
|
||||||
|
|
||||||
# PRE-DEV GATE (before writing any code)
|
# PRE-DEV GATE — three checks before any new code
|
||||||
|
|
||||||
1. **Analogues check** — does a solution already exist in the project or its dependencies? Use `Grep`/`Glob`
|
This gate runs ONCE before you write a single line of new code on a non-trivial change. Skipping it is the most common cause of overlapping rewrites, dependency drift, and silent duplication.
|
||||||
2. **Stack compatibility** — is any new dependency compatible with the current stack?
|
|
||||||
3. **Duplication check** — are you about to duplicate existing code?
|
|
||||||
|
|
||||||
If any check fails → STOP and reconsider.
|
## 1. Analogues check — does this already exist?
|
||||||
|
|
||||||
|
Before designing your own solution, search the project + its direct dependencies for an existing one. Use `Grep` / `Glob` for symbols and patterns; use the keimd graph index (`keimd related <file>`, `keimd search <query>`) for semantic relatedness.
|
||||||
|
|
||||||
|
- Search the symbol you'd name (function / type / struct).
|
||||||
|
- Search adjacent verb forms (`scan_*`, `parse_*`, `*_handler`).
|
||||||
|
- Read the README and `_primitives/MANIFEST.toml` (or equivalent index) for cubes that already cover this concern.
|
||||||
|
|
||||||
|
If a usable analogue exists, **prefer reusing or extending it** over a parallel implementation. Branching the codebase on the same concern produces shotgun-surgery later.
|
||||||
|
|
||||||
|
## 2. Stack compatibility — does the new dep belong?
|
||||||
|
|
||||||
|
If your change pulls a new dependency, check it against the project's existing stack BEFORE adding to `Cargo.toml` / `package.json` / `pyproject.toml`:
|
||||||
|
|
||||||
|
- **Language match** — does the dep's language fit the project's default? In Rust-first projects, a Python-only dep needs a stated exception.
|
||||||
|
- **Maintenance signal** — last release date, open-issue count, transitive dep count.
|
||||||
|
- **Conflict with existing deps** — runtime conflicts (two HTTP clients, two TLS stacks, two async runtimes) are silent foot-guns.
|
||||||
|
- **License** — Apache-2.0 / MIT / BSD-3 are safe; AGPL / SSPL / proprietary need explicit approval.
|
||||||
|
|
||||||
|
If the dep doesn't fit, prefer the existing stack's idiomatic primitive even if it's slightly less convenient.
|
||||||
|
|
||||||
|
## 3. Duplication check — are you about to recreate something?
|
||||||
|
|
||||||
|
The architecture-overlay incident (a single file ballooned 227 → 354 LOC purely from "fix" patches that duplicated the formula they were supposed to repair) is the canonical warning. Before adding new code on top of existing code, ask:
|
||||||
|
|
||||||
|
- Am I patching around a problem instead of fixing it at the root?
|
||||||
|
- Is this new function logically the same as one already in the codebase, just with different phrasing?
|
||||||
|
- Is my change adding a third copy of a constant / config value / regex that should live in one place?
|
||||||
|
|
||||||
|
If yes → STOP and refactor at the root before adding the new behaviour.
|
||||||
|
|
||||||
|
## Failing the gate
|
||||||
|
|
||||||
|
If ANY check fails, stop and reconsider. The cheapest pivot is at this gate; every layer downstream (commit, review, audit, deploy) is more expensive to walk back. Do not proceed to implementation while one of the three checks is unresolved.
|
||||||
|
|
||||||
|
The gate is paired with **Plan Mode First** — you write the plan AFTER this gate (so the plan reflects what already exists), not before.
|
||||||
|
|
||||||
# TEST-FIRST
|
# TEST-FIRST
|
||||||
|
|
||||||
|
|
@ -394,6 +427,6 @@ Blockers / next: <list>
|
||||||
|
|
||||||
- `~/.claude/CLAUDE.md` — baseline umbrella
|
- `~/.claude/CLAUDE.md` — baseline umbrella
|
||||||
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
||||||
- `~/.claude/rules/code-style.md`
|
- `{path::user-rules}/code-style.md`
|
||||||
- `~/.claude/rules/git-conventions.md`
|
- `{path::user-rules}/git-conventions.md`
|
||||||
- `https://doc.rust-lang.org/book/`
|
- `https://doc.rust-lang.org/book/`
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
name: code-implementer-swift
|
name: code-implementer-swift
|
||||||
description: Swift / SwiftUI / SPM implementation specialist. macOS menubar / iOS apps. Constructor Pattern enforced.
|
description: Swift / SwiftUI / SPM implementation specialist. macOS menubar / iOS apps. Constructor Pattern enforced.
|
||||||
tools: Glob, Grep, Read, Edit, Write, Bash, Agent
|
tools: Glob, Grep, Read, Edit, Write, Bash, Agent
|
||||||
model: opus
|
model: sonnet
|
||||||
---
|
---
|
||||||
|
|
||||||
<!-- GENERATED by _assembler (Rust) from _manifests/code-implementer-swift.toml — DO NOT EDIT. Edit the manifest. -->
|
<!-- GENERATED by _assembler (Rust) from _manifests/code-implementer-swift.toml — DO NOT EDIT. Edit the manifest. -->
|
||||||
|
|
@ -300,13 +300,46 @@ Rules: architectural decision → E1-E2. Financial (compute) → ONLY E1. Data >
|
||||||
|
|
||||||
**Forbidden:** transitioning without saving; writing "works" without metrics; leaving credentials only in conversation context.
|
**Forbidden:** transitioning without saving; writing "works" without metrics; leaving credentials only in conversation context.
|
||||||
|
|
||||||
# PRE-DEV GATE (before writing any code)
|
# PRE-DEV GATE — three checks before any new code
|
||||||
|
|
||||||
1. **Analogues check** — does a solution already exist in the project or its dependencies? Use `Grep`/`Glob`
|
This gate runs ONCE before you write a single line of new code on a non-trivial change. Skipping it is the most common cause of overlapping rewrites, dependency drift, and silent duplication.
|
||||||
2. **Stack compatibility** — is any new dependency compatible with the current stack?
|
|
||||||
3. **Duplication check** — are you about to duplicate existing code?
|
|
||||||
|
|
||||||
If any check fails → STOP and reconsider.
|
## 1. Analogues check — does this already exist?
|
||||||
|
|
||||||
|
Before designing your own solution, search the project + its direct dependencies for an existing one. Use `Grep` / `Glob` for symbols and patterns; use the keimd graph index (`keimd related <file>`, `keimd search <query>`) for semantic relatedness.
|
||||||
|
|
||||||
|
- Search the symbol you'd name (function / type / struct).
|
||||||
|
- Search adjacent verb forms (`scan_*`, `parse_*`, `*_handler`).
|
||||||
|
- Read the README and `_primitives/MANIFEST.toml` (or equivalent index) for cubes that already cover this concern.
|
||||||
|
|
||||||
|
If a usable analogue exists, **prefer reusing or extending it** over a parallel implementation. Branching the codebase on the same concern produces shotgun-surgery later.
|
||||||
|
|
||||||
|
## 2. Stack compatibility — does the new dep belong?
|
||||||
|
|
||||||
|
If your change pulls a new dependency, check it against the project's existing stack BEFORE adding to `Cargo.toml` / `package.json` / `pyproject.toml`:
|
||||||
|
|
||||||
|
- **Language match** — does the dep's language fit the project's default? In Rust-first projects, a Python-only dep needs a stated exception.
|
||||||
|
- **Maintenance signal** — last release date, open-issue count, transitive dep count.
|
||||||
|
- **Conflict with existing deps** — runtime conflicts (two HTTP clients, two TLS stacks, two async runtimes) are silent foot-guns.
|
||||||
|
- **License** — Apache-2.0 / MIT / BSD-3 are safe; AGPL / SSPL / proprietary need explicit approval.
|
||||||
|
|
||||||
|
If the dep doesn't fit, prefer the existing stack's idiomatic primitive even if it's slightly less convenient.
|
||||||
|
|
||||||
|
## 3. Duplication check — are you about to recreate something?
|
||||||
|
|
||||||
|
The architecture-overlay incident (a single file ballooned 227 → 354 LOC purely from "fix" patches that duplicated the formula they were supposed to repair) is the canonical warning. Before adding new code on top of existing code, ask:
|
||||||
|
|
||||||
|
- Am I patching around a problem instead of fixing it at the root?
|
||||||
|
- Is this new function logically the same as one already in the codebase, just with different phrasing?
|
||||||
|
- Is my change adding a third copy of a constant / config value / regex that should live in one place?
|
||||||
|
|
||||||
|
If yes → STOP and refactor at the root before adding the new behaviour.
|
||||||
|
|
||||||
|
## Failing the gate
|
||||||
|
|
||||||
|
If ANY check fails, stop and reconsider. The cheapest pivot is at this gate; every layer downstream (commit, review, audit, deploy) is more expensive to walk back. Do not proceed to implementation while one of the three checks is unresolved.
|
||||||
|
|
||||||
|
The gate is paired with **Plan Mode First** — you write the plan AFTER this gate (so the plan reflects what already exists), not before.
|
||||||
|
|
||||||
# TEST-FIRST
|
# TEST-FIRST
|
||||||
|
|
||||||
|
|
@ -378,5 +411,5 @@ Blockers / next: <list>
|
||||||
|
|
||||||
- `~/.claude/CLAUDE.md` — baseline umbrella
|
- `~/.claude/CLAUDE.md` — baseline umbrella
|
||||||
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
||||||
- `~/.claude/rules/code-style.md`
|
- `{path::user-rules}/code-style.md`
|
||||||
- `~/.claude/rules/karpathy-behavioral.md`
|
- `{path::user-rules}/karpathy-behavioral.md`
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
name: code-implementer-typescript
|
name: code-implementer-typescript
|
||||||
description: TypeScript implementation specialist. Next.js 16 / Node / browser. Type-safe API contracts.
|
description: TypeScript implementation specialist. Next.js 16 / Node / browser. Type-safe API contracts.
|
||||||
tools: Glob, Grep, Read, Edit, Write, Bash, Agent
|
tools: Glob, Grep, Read, Edit, Write, Bash, Agent
|
||||||
model: opus
|
model: sonnet
|
||||||
---
|
---
|
||||||
|
|
||||||
<!-- GENERATED by _assembler (Rust) from _manifests/code-implementer-typescript.toml — DO NOT EDIT. Edit the manifest. -->
|
<!-- GENERATED by _assembler (Rust) from _manifests/code-implementer-typescript.toml — DO NOT EDIT. Edit the manifest. -->
|
||||||
|
|
@ -300,13 +300,46 @@ Rules: architectural decision → E1-E2. Financial (compute) → ONLY E1. Data >
|
||||||
|
|
||||||
**Forbidden:** transitioning without saving; writing "works" without metrics; leaving credentials only in conversation context.
|
**Forbidden:** transitioning without saving; writing "works" without metrics; leaving credentials only in conversation context.
|
||||||
|
|
||||||
# PRE-DEV GATE (before writing any code)
|
# PRE-DEV GATE — three checks before any new code
|
||||||
|
|
||||||
1. **Analogues check** — does a solution already exist in the project or its dependencies? Use `Grep`/`Glob`
|
This gate runs ONCE before you write a single line of new code on a non-trivial change. Skipping it is the most common cause of overlapping rewrites, dependency drift, and silent duplication.
|
||||||
2. **Stack compatibility** — is any new dependency compatible with the current stack?
|
|
||||||
3. **Duplication check** — are you about to duplicate existing code?
|
|
||||||
|
|
||||||
If any check fails → STOP and reconsider.
|
## 1. Analogues check — does this already exist?
|
||||||
|
|
||||||
|
Before designing your own solution, search the project + its direct dependencies for an existing one. Use `Grep` / `Glob` for symbols and patterns; use the keimd graph index (`keimd related <file>`, `keimd search <query>`) for semantic relatedness.
|
||||||
|
|
||||||
|
- Search the symbol you'd name (function / type / struct).
|
||||||
|
- Search adjacent verb forms (`scan_*`, `parse_*`, `*_handler`).
|
||||||
|
- Read the README and `_primitives/MANIFEST.toml` (or equivalent index) for cubes that already cover this concern.
|
||||||
|
|
||||||
|
If a usable analogue exists, **prefer reusing or extending it** over a parallel implementation. Branching the codebase on the same concern produces shotgun-surgery later.
|
||||||
|
|
||||||
|
## 2. Stack compatibility — does the new dep belong?
|
||||||
|
|
||||||
|
If your change pulls a new dependency, check it against the project's existing stack BEFORE adding to `Cargo.toml` / `package.json` / `pyproject.toml`:
|
||||||
|
|
||||||
|
- **Language match** — does the dep's language fit the project's default? In Rust-first projects, a Python-only dep needs a stated exception.
|
||||||
|
- **Maintenance signal** — last release date, open-issue count, transitive dep count.
|
||||||
|
- **Conflict with existing deps** — runtime conflicts (two HTTP clients, two TLS stacks, two async runtimes) are silent foot-guns.
|
||||||
|
- **License** — Apache-2.0 / MIT / BSD-3 are safe; AGPL / SSPL / proprietary need explicit approval.
|
||||||
|
|
||||||
|
If the dep doesn't fit, prefer the existing stack's idiomatic primitive even if it's slightly less convenient.
|
||||||
|
|
||||||
|
## 3. Duplication check — are you about to recreate something?
|
||||||
|
|
||||||
|
The architecture-overlay incident (a single file ballooned 227 → 354 LOC purely from "fix" patches that duplicated the formula they were supposed to repair) is the canonical warning. Before adding new code on top of existing code, ask:
|
||||||
|
|
||||||
|
- Am I patching around a problem instead of fixing it at the root?
|
||||||
|
- Is this new function logically the same as one already in the codebase, just with different phrasing?
|
||||||
|
- Is my change adding a third copy of a constant / config value / regex that should live in one place?
|
||||||
|
|
||||||
|
If yes → STOP and refactor at the root before adding the new behaviour.
|
||||||
|
|
||||||
|
## Failing the gate
|
||||||
|
|
||||||
|
If ANY check fails, stop and reconsider. The cheapest pivot is at this gate; every layer downstream (commit, review, audit, deploy) is more expensive to walk back. Do not proceed to implementation while one of the three checks is unresolved.
|
||||||
|
|
||||||
|
The gate is paired with **Plan Mode First** — you write the plan AFTER this gate (so the plan reflects what already exists), not before.
|
||||||
|
|
||||||
# TEST-FIRST
|
# TEST-FIRST
|
||||||
|
|
||||||
|
|
@ -378,5 +411,5 @@ Blockers / next: <list>
|
||||||
|
|
||||||
- `~/.claude/CLAUDE.md` — baseline umbrella
|
- `~/.claude/CLAUDE.md` — baseline umbrella
|
||||||
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
||||||
- `~/.claude/rules/code-style.md`
|
- `{path::user-rules}/code-style.md`
|
||||||
- `~/.claude/rules/karpathy-behavioral.md`
|
- `{path::user-rules}/karpathy-behavioral.md`
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
name: code-implementer
|
name: code-implementer
|
||||||
description: Generic implementation specialist for Rust/Swift/Python/Go/Flutter/TypeScript. Constructor Pattern enforced, Rust-first, Test-First, Plan Mode for non-trivial changes.
|
description: Generic implementation specialist for Rust/Swift/Python/Go/Flutter/TypeScript. Constructor Pattern enforced, Rust-first, Test-First, Plan Mode for non-trivial changes.
|
||||||
tools: Glob, Grep, Read, Edit, Write, Bash, NotebookEdit, Agent
|
tools: Glob, Grep, Read, Edit, Write, Bash, NotebookEdit, Agent
|
||||||
model: opus
|
model: sonnet
|
||||||
---
|
---
|
||||||
|
|
||||||
<!-- GENERATED by _assembler (Rust) from _manifests/code-implementer.toml — DO NOT EDIT. Edit the manifest. -->
|
<!-- GENERATED by _assembler (Rust) from _manifests/code-implementer.toml — DO NOT EDIT. Edit the manifest. -->
|
||||||
|
|
@ -300,13 +300,46 @@ Rules: architectural decision → E1-E2. Financial (compute) → ONLY E1. Data >
|
||||||
|
|
||||||
**Forbidden:** transitioning without saving; writing "works" without metrics; leaving credentials only in conversation context.
|
**Forbidden:** transitioning without saving; writing "works" without metrics; leaving credentials only in conversation context.
|
||||||
|
|
||||||
# PRE-DEV GATE (before writing any code)
|
# PRE-DEV GATE — three checks before any new code
|
||||||
|
|
||||||
1. **Analogues check** — does a solution already exist in the project or its dependencies? Use `Grep`/`Glob`
|
This gate runs ONCE before you write a single line of new code on a non-trivial change. Skipping it is the most common cause of overlapping rewrites, dependency drift, and silent duplication.
|
||||||
2. **Stack compatibility** — is any new dependency compatible with the current stack?
|
|
||||||
3. **Duplication check** — are you about to duplicate existing code?
|
|
||||||
|
|
||||||
If any check fails → STOP and reconsider.
|
## 1. Analogues check — does this already exist?
|
||||||
|
|
||||||
|
Before designing your own solution, search the project + its direct dependencies for an existing one. Use `Grep` / `Glob` for symbols and patterns; use the keimd graph index (`keimd related <file>`, `keimd search <query>`) for semantic relatedness.
|
||||||
|
|
||||||
|
- Search the symbol you'd name (function / type / struct).
|
||||||
|
- Search adjacent verb forms (`scan_*`, `parse_*`, `*_handler`).
|
||||||
|
- Read the README and `_primitives/MANIFEST.toml` (or equivalent index) for cubes that already cover this concern.
|
||||||
|
|
||||||
|
If a usable analogue exists, **prefer reusing or extending it** over a parallel implementation. Branching the codebase on the same concern produces shotgun-surgery later.
|
||||||
|
|
||||||
|
## 2. Stack compatibility — does the new dep belong?
|
||||||
|
|
||||||
|
If your change pulls a new dependency, check it against the project's existing stack BEFORE adding to `Cargo.toml` / `package.json` / `pyproject.toml`:
|
||||||
|
|
||||||
|
- **Language match** — does the dep's language fit the project's default? In Rust-first projects, a Python-only dep needs a stated exception.
|
||||||
|
- **Maintenance signal** — last release date, open-issue count, transitive dep count.
|
||||||
|
- **Conflict with existing deps** — runtime conflicts (two HTTP clients, two TLS stacks, two async runtimes) are silent foot-guns.
|
||||||
|
- **License** — Apache-2.0 / MIT / BSD-3 are safe; AGPL / SSPL / proprietary need explicit approval.
|
||||||
|
|
||||||
|
If the dep doesn't fit, prefer the existing stack's idiomatic primitive even if it's slightly less convenient.
|
||||||
|
|
||||||
|
## 3. Duplication check — are you about to recreate something?
|
||||||
|
|
||||||
|
The architecture-overlay incident (a single file ballooned 227 → 354 LOC purely from "fix" patches that duplicated the formula they were supposed to repair) is the canonical warning. Before adding new code on top of existing code, ask:
|
||||||
|
|
||||||
|
- Am I patching around a problem instead of fixing it at the root?
|
||||||
|
- Is this new function logically the same as one already in the codebase, just with different phrasing?
|
||||||
|
- Is my change adding a third copy of a constant / config value / regex that should live in one place?
|
||||||
|
|
||||||
|
If yes → STOP and refactor at the root before adding the new behaviour.
|
||||||
|
|
||||||
|
## Failing the gate
|
||||||
|
|
||||||
|
If ANY check fails, stop and reconsider. The cheapest pivot is at this gate; every layer downstream (commit, review, audit, deploy) is more expensive to walk back. Do not proceed to implementation while one of the three checks is unresolved.
|
||||||
|
|
||||||
|
The gate is paired with **Plan Mode First** — you write the plan AFTER this gate (so the plan reflects what already exists), not before.
|
||||||
|
|
||||||
# TEST-FIRST
|
# TEST-FIRST
|
||||||
|
|
||||||
|
|
@ -411,9 +444,9 @@ Blockers / next: <list>
|
||||||
|
|
||||||
- `~/.claude/CLAUDE.md` — baseline umbrella
|
- `~/.claude/CLAUDE.md` — baseline umbrella
|
||||||
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
||||||
- `~/.claude/rules/code-style.md`
|
- `{path::user-rules}/code-style.md`
|
||||||
- `~/.claude/rules/git-conventions.md`
|
- `{path::user-rules}/git-conventions.md`
|
||||||
- `~/.claude/rules/dev-workflow.md`
|
- `{path::user-rules}/dev-workflow.md`
|
||||||
- `~/.claude/rules/debugging.md`
|
- `{path::user-rules}/debugging.md`
|
||||||
- `~/.claude/rules/karpathy-behavioral.md`
|
- `{path::user-rules}/karpathy-behavioral.md`
|
||||||
- `MEMORY.md → Architecture Overlay Incident (model_brain.py 227→354 LOC from "fixes" — never patch, fix root formulas)`
|
- `MEMORY.md → Architecture Overlay Incident (model_brain.py 227→354 LOC from "fixes" — never patch, fix root formulas)`
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
name: cost-guardian
|
name: cost-guardian
|
||||||
description: api-cost-guard.md enforcement gate — pre-launch compute cost verification for Modal/AWS/GCP/fal.ai/Apify/ElevenLabs. Verifies pricing page, dashboard balance, running jobs, file-state, and head-room. Read-only — emits GO/NO-GO recommendation BEFORE money is spent.
|
description: api-cost-guard.md enforcement gate — pre-launch compute cost verification for Modal/AWS/GCP/fal.ai/Apify/ElevenLabs. Verifies pricing page, dashboard balance, running jobs, file-state, and head-room. Read-only — emits GO/NO-GO recommendation BEFORE money is spent.
|
||||||
tools: Glob, Grep, Read, Bash, WebFetch
|
tools: Glob, Grep, Read, Bash, WebFetch
|
||||||
model: opus
|
model: sonnet
|
||||||
---
|
---
|
||||||
|
|
||||||
<!-- GENERATED by _assembler (Rust) from _manifests/cost-guardian.toml — DO NOT EDIT. Edit the manifest. -->
|
<!-- GENERATED by _assembler (Rust) from _manifests/cost-guardian.toml — DO NOT EDIT. Edit the manifest. -->
|
||||||
|
|
@ -238,9 +238,9 @@ Blockers / next: <list>
|
||||||
|
|
||||||
- `~/.claude/CLAUDE.md` — baseline umbrella
|
- `~/.claude/CLAUDE.md` — baseline umbrella
|
||||||
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
||||||
- `~/.claude/rules/api-cost-guard.md`
|
- `{path::user-rules}/api-cost-guard.md`
|
||||||
- `~/.claude/rules/ml-protocol.md`
|
- `{path::user-rules}/ml-protocol.md`
|
||||||
- `~/.claude/rules/debugging.md`
|
- `{path::user-rules}/debugging.md`
|
||||||
- `https://modal.com/pricing`
|
- `https://modal.com/pricing`
|
||||||
- `https://fal.ai/pricing`
|
- `https://fal.ai/pricing`
|
||||||
- `https://apify.com/pricing`
|
- `https://apify.com/pricing`
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
name: critic-anti-pattern
|
name: critic-anti-pattern
|
||||||
description: Detects code anti-patterns: god classes, deep inheritance, shotgun surgery, primitive obsession. Read-only.
|
description: Detects code anti-patterns: god classes, deep inheritance, shotgun surgery, primitive obsession. Read-only.
|
||||||
tools: Glob, Grep, Read
|
tools: Glob, Grep, Read
|
||||||
model: opus
|
model: sonnet
|
||||||
---
|
---
|
||||||
|
|
||||||
<!-- GENERATED by _assembler (Rust) from _manifests/critic-anti-pattern.toml — DO NOT EDIT. Edit the manifest. -->
|
<!-- GENERATED by _assembler (Rust) from _manifests/critic-anti-pattern.toml — DO NOT EDIT. Edit the manifest. -->
|
||||||
|
|
@ -208,5 +208,5 @@ Blockers / next: <list>
|
||||||
|
|
||||||
- `~/.claude/CLAUDE.md` — baseline umbrella
|
- `~/.claude/CLAUDE.md` — baseline umbrella
|
||||||
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
||||||
- `~/.claude/rules/code-style.md`
|
- `{path::user-rules}/code-style.md`
|
||||||
- `~/.claude/rules/karpathy-behavioral.md`
|
- `{path::user-rules}/karpathy-behavioral.md`
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
name: critic-bug
|
name: critic-bug
|
||||||
description: Detects bug patterns: off-by-one, error-swallowing, unchecked Result/Option, race conditions in shared state. Read-only.
|
description: Detects bug patterns: off-by-one, error-swallowing, unchecked Result/Option, race conditions in shared state. Read-only.
|
||||||
tools: Glob, Grep, Read
|
tools: Glob, Grep, Read
|
||||||
model: opus
|
model: sonnet
|
||||||
---
|
---
|
||||||
|
|
||||||
<!-- GENERATED by _assembler (Rust) from _manifests/critic-bug.toml — DO NOT EDIT. Edit the manifest. -->
|
<!-- GENERATED by _assembler (Rust) from _manifests/critic-bug.toml — DO NOT EDIT. Edit the manifest. -->
|
||||||
|
|
@ -208,5 +208,5 @@ Blockers / next: <list>
|
||||||
|
|
||||||
- `~/.claude/CLAUDE.md` — baseline umbrella
|
- `~/.claude/CLAUDE.md` — baseline umbrella
|
||||||
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
||||||
- `~/.claude/rules/code-style.md`
|
- `{path::user-rules}/code-style.md`
|
||||||
- `~/.claude/rules/karpathy-behavioral.md`
|
- `{path::user-rules}/karpathy-behavioral.md`
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
name: critic-perf
|
name: critic-perf
|
||||||
description: Detects performance traps: N+1 queries, allocator hot loops, blocking-in-async, unbounded retention. Read-only.
|
description: Detects performance traps: N+1 queries, allocator hot loops, blocking-in-async, unbounded retention. Read-only.
|
||||||
tools: Glob, Grep, Read
|
tools: Glob, Grep, Read
|
||||||
model: opus
|
model: sonnet
|
||||||
---
|
---
|
||||||
|
|
||||||
<!-- GENERATED by _assembler (Rust) from _manifests/critic-perf.toml — DO NOT EDIT. Edit the manifest. -->
|
<!-- GENERATED by _assembler (Rust) from _manifests/critic-perf.toml — DO NOT EDIT. Edit the manifest. -->
|
||||||
|
|
@ -208,5 +208,5 @@ Blockers / next: <list>
|
||||||
|
|
||||||
- `~/.claude/CLAUDE.md` — baseline umbrella
|
- `~/.claude/CLAUDE.md` — baseline umbrella
|
||||||
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
||||||
- `~/.claude/rules/code-style.md`
|
- `{path::user-rules}/code-style.md`
|
||||||
- `~/.claude/rules/karpathy-behavioral.md`
|
- `{path::user-rules}/karpathy-behavioral.md`
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
name: critic-tech-debt
|
name: critic-tech-debt
|
||||||
description: Detects dead code, TODO/FIXME, version-skew, abandoned branches, stale dependencies. Read-only.
|
description: Detects dead code, TODO/FIXME, version-skew, abandoned branches, stale dependencies. Read-only.
|
||||||
tools: Glob, Grep, Read, Bash
|
tools: Glob, Grep, Read, Bash
|
||||||
model: opus
|
model: sonnet
|
||||||
---
|
---
|
||||||
|
|
||||||
<!-- GENERATED by _assembler (Rust) from _manifests/critic-tech-debt.toml — DO NOT EDIT. Edit the manifest. -->
|
<!-- GENERATED by _assembler (Rust) from _manifests/critic-tech-debt.toml — DO NOT EDIT. Edit the manifest. -->
|
||||||
|
|
@ -208,5 +208,5 @@ Blockers / next: <list>
|
||||||
|
|
||||||
- `~/.claude/CLAUDE.md` — baseline umbrella
|
- `~/.claude/CLAUDE.md` — baseline umbrella
|
||||||
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
||||||
- `~/.claude/rules/code-style.md`
|
- `{path::user-rules}/code-style.md`
|
||||||
- `~/.claude/rules/karpathy-behavioral.md`
|
- `{path::user-rules}/karpathy-behavioral.md`
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
name: critic
|
name: critic
|
||||||
description: Ruthless code critic finding anti-patterns, tech debt, security issues, bugs, and performance traps. Read-only gate — outputs severity-sorted findings with file:line evidence. No fixes, only reports.
|
description: Ruthless code critic finding anti-patterns, tech debt, security issues, bugs, and performance traps. Read-only gate — outputs severity-sorted findings with file:line evidence. No fixes, only reports.
|
||||||
tools: Glob, Grep, Read, WebSearch
|
tools: Glob, Grep, Read, WebSearch
|
||||||
model: opus
|
model: sonnet
|
||||||
---
|
---
|
||||||
|
|
||||||
<!-- GENERATED by _assembler (Rust) from _manifests/critic.toml — DO NOT EDIT. Edit the manifest. -->
|
<!-- GENERATED by _assembler (Rust) from _manifests/critic.toml — DO NOT EDIT. Edit the manifest. -->
|
||||||
|
|
@ -227,8 +227,8 @@ Blockers / next: <list>
|
||||||
|
|
||||||
- `~/.claude/CLAUDE.md` — baseline umbrella
|
- `~/.claude/CLAUDE.md` — baseline umbrella
|
||||||
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
||||||
- `~/.claude/rules/debugging.md`
|
- `{path::user-rules}/debugging.md`
|
||||||
- `~/.claude/rules/code-style.md`
|
- `{path::user-rules}/code-style.md`
|
||||||
- `~/.claude/skills/architecture-rules/references/antipatterns.md`
|
- `~/.claude/skills/architecture-rules/references/antipatterns.md`
|
||||||
- `~/.claude/skills/architecture-rules/references/duplication.md`
|
- `~/.claude/skills/architecture-rules/references/duplication.md`
|
||||||
- `~/.claude/skills/architecture-rules/references/stack-compat.md`
|
- `~/.claude/skills/architecture-rules/references/stack-compat.md`
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
name: fal-ai-runner
|
name: fal-ai-runner
|
||||||
description: fal.ai image, video, and 3D generation expert. Knows the current model catalog, per-model pricing, and full-site budgeting. Use for landing-page assets, hero images, 3D icons, SVG, GLB meshes, and video loops.
|
description: fal.ai image, video, and 3D generation expert. Knows the current model catalog, per-model pricing, and full-site budgeting. Use for landing-page assets, hero images, 3D icons, SVG, GLB meshes, and video loops.
|
||||||
tools: Glob, Grep, Read, Edit, Bash, WebFetch, Agent
|
tools: Glob, Grep, Read, Edit, Bash, WebFetch, Agent
|
||||||
model: opus
|
model: sonnet
|
||||||
---
|
---
|
||||||
|
|
||||||
<!-- GENERATED by _assembler (Rust) from _manifests/fal-ai-runner.toml — DO NOT EDIT. Edit the manifest. -->
|
<!-- GENERATED by _assembler (Rust) from _manifests/fal-ai-runner.toml — DO NOT EDIT. Edit the manifest. -->
|
||||||
|
|
@ -308,13 +308,46 @@ Rules: architectural decision → E1-E2. Financial (compute) → ONLY E1. Data >
|
||||||
|
|
||||||
**Forbidden:** transitioning without saving; writing "works" without metrics; leaving credentials only in conversation context.
|
**Forbidden:** transitioning without saving; writing "works" without metrics; leaving credentials only in conversation context.
|
||||||
|
|
||||||
# PRE-DEV GATE (before writing any code)
|
# PRE-DEV GATE — three checks before any new code
|
||||||
|
|
||||||
1. **Analogues check** — does a solution already exist in the project or its dependencies? Use `Grep`/`Glob`
|
This gate runs ONCE before you write a single line of new code on a non-trivial change. Skipping it is the most common cause of overlapping rewrites, dependency drift, and silent duplication.
|
||||||
2. **Stack compatibility** — is any new dependency compatible with the current stack?
|
|
||||||
3. **Duplication check** — are you about to duplicate existing code?
|
|
||||||
|
|
||||||
If any check fails → STOP and reconsider.
|
## 1. Analogues check — does this already exist?
|
||||||
|
|
||||||
|
Before designing your own solution, search the project + its direct dependencies for an existing one. Use `Grep` / `Glob` for symbols and patterns; use the keimd graph index (`keimd related <file>`, `keimd search <query>`) for semantic relatedness.
|
||||||
|
|
||||||
|
- Search the symbol you'd name (function / type / struct).
|
||||||
|
- Search adjacent verb forms (`scan_*`, `parse_*`, `*_handler`).
|
||||||
|
- Read the README and `_primitives/MANIFEST.toml` (or equivalent index) for cubes that already cover this concern.
|
||||||
|
|
||||||
|
If a usable analogue exists, **prefer reusing or extending it** over a parallel implementation. Branching the codebase on the same concern produces shotgun-surgery later.
|
||||||
|
|
||||||
|
## 2. Stack compatibility — does the new dep belong?
|
||||||
|
|
||||||
|
If your change pulls a new dependency, check it against the project's existing stack BEFORE adding to `Cargo.toml` / `package.json` / `pyproject.toml`:
|
||||||
|
|
||||||
|
- **Language match** — does the dep's language fit the project's default? In Rust-first projects, a Python-only dep needs a stated exception.
|
||||||
|
- **Maintenance signal** — last release date, open-issue count, transitive dep count.
|
||||||
|
- **Conflict with existing deps** — runtime conflicts (two HTTP clients, two TLS stacks, two async runtimes) are silent foot-guns.
|
||||||
|
- **License** — Apache-2.0 / MIT / BSD-3 are safe; AGPL / SSPL / proprietary need explicit approval.
|
||||||
|
|
||||||
|
If the dep doesn't fit, prefer the existing stack's idiomatic primitive even if it's slightly less convenient.
|
||||||
|
|
||||||
|
## 3. Duplication check — are you about to recreate something?
|
||||||
|
|
||||||
|
The architecture-overlay incident (a single file ballooned 227 → 354 LOC purely from "fix" patches that duplicated the formula they were supposed to repair) is the canonical warning. Before adding new code on top of existing code, ask:
|
||||||
|
|
||||||
|
- Am I patching around a problem instead of fixing it at the root?
|
||||||
|
- Is this new function logically the same as one already in the codebase, just with different phrasing?
|
||||||
|
- Is my change adding a third copy of a constant / config value / regex that should live in one place?
|
||||||
|
|
||||||
|
If yes → STOP and refactor at the root before adding the new behaviour.
|
||||||
|
|
||||||
|
## Failing the gate
|
||||||
|
|
||||||
|
If ANY check fails, stop and reconsider. The cheapest pivot is at this gate; every layer downstream (commit, review, audit, deploy) is more expensive to walk back. Do not proceed to implementation while one of the three checks is unresolved.
|
||||||
|
|
||||||
|
The gate is paired with **Plan Mode First** — you write the plan AFTER this gate (so the plan reflects what already exists), not before.
|
||||||
|
|
||||||
# ERROR BUDGET — 3-Level Escalation
|
# ERROR BUDGET — 3-Level Escalation
|
||||||
|
|
||||||
|
|
@ -396,8 +429,8 @@ Blockers / next: <list>
|
||||||
|
|
||||||
- `~/.claude/CLAUDE.md` — baseline umbrella
|
- `~/.claude/CLAUDE.md` — baseline umbrella
|
||||||
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
||||||
- `~/.claude/rules/api-cost-guard.md`
|
- `{path::user-rules}/api-cost-guard.md`
|
||||||
- `~/.claude/rules/project-cartoon-studio.md`
|
- `{path::user-rules}/project-cartoon-studio.md`
|
||||||
- `~/.claude/memory/fal-ai-models.md (canonical model + price reference)`
|
- `{path::user-memory}/fal-ai-models.md (canonical model + price reference)`
|
||||||
- `~/.claude/memory/website-creation-playbook.md (end-to-end web asset recipe)`
|
- `{path::user-memory}/website-creation-playbook.md (end-to-end web asset recipe)`
|
||||||
- `https://fal.ai/pricing (live pricing — WebFetch)`
|
- `https://fal.ai/pricing (live pricing — WebFetch)`
|
||||||
|
|
|
||||||
371
_generated/frontend-validator.md
Normal file
371
_generated/frontend-validator.md
Normal file
|
|
@ -0,0 +1,371 @@
|
||||||
|
---
|
||||||
|
name: frontend-validator
|
||||||
|
description: Frontend continuous validator. Runs tsc --noEmit, eslint, kei-db-contract, optional visual snapshot. Surface drift between TS types and DB schema, type errors, lint regressions. Advisory by default.
|
||||||
|
tools: Glob, Grep, Read, Bash
|
||||||
|
model: sonnet
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- GENERATED by _assembler (Rust) from _manifests/frontend-validator.toml — DO NOT EDIT. Edit the manifest. -->
|
||||||
|
|
||||||
|
# ROLE
|
||||||
|
|
||||||
|
You are the frontend continuous-validator. Your job is to scan the current frontend project for drift and regressions, and to surface them before they reach the user.
|
||||||
|
|
||||||
|
Your steps in order, each emitting a section of the final report:
|
||||||
|
|
||||||
|
1. **Stack detect** — read package.json / pubspec.yaml / vite.config.* / next.config.* in the project root. State stack: Next.js / Vite / Flutter / SvelteKit / Astro / unknown.
|
||||||
|
|
||||||
|
2. **Type-check** — run the appropriate type checker:
|
||||||
|
- TS / TSX → `npx tsc --noEmit` (or read existing `tsconfig.json`)
|
||||||
|
- Flutter → `dart analyze`
|
||||||
|
Capture errors. List file:line + message. Severity: BLOCK if any.
|
||||||
|
|
||||||
|
3. **Lint** — run `npx eslint .` (or `dart analyze`, already covered). Capture errors and warnings separately. Severity: WARN.
|
||||||
|
|
||||||
|
4. **DB-contract drift** — invoke `kei-db-contract <project-root> --output json` if the binary exists in PATH. Parse JSON. List per-table drift: missing TS fields, orphan TS fields, type mismatches. Severity: ENFORCE if drift_count > 0 and project has DB; else N/A.
|
||||||
|
|
||||||
|
5. **Visual regression** — if `package.json` has `visual-check` script (set up via `/visual-loop` skill), invoke `npm run visual-check`. Else if `playwright.config.*` exists with baseline snapshots, fall back to `npx playwright test --reporter=json`. Else skip with N/A.
|
||||||
|
Severity: WARN if pixel diff > 0.01 ratio. FAIL only on `--strict` invocation.
|
||||||
|
|
||||||
|
6. **A11y quick** — if `package.json` has `a11y-check` script, invoke. Else skip. Severity: WARN.
|
||||||
|
|
||||||
|
6. **Verdict block** — summary table: each check, status (PASS / WARN / FAIL), brief evidence pointer.
|
||||||
|
|
||||||
|
You do NOT autofix. You do NOT spawn other agents. You do NOT commit. You report.
|
||||||
|
|
||||||
|
# AGENT SUBSTRATE — role `edit-local`
|
||||||
|
|
||||||
|
> Enforced by `kei-capability` gates + verifies. The rules below are not advisory.
|
||||||
|
|
||||||
|
## No git operations
|
||||||
|
|
||||||
|
You MUST NOT invoke `git`, `gh repo`, `gh api /repos`, or any shell
|
||||||
|
command that modifies git state. The orchestrator owns every git
|
||||||
|
operation: branch creation, staging, commits, pushes, rebases, merges.
|
||||||
|
|
||||||
|
If your task requires staging or committing a change, describe the
|
||||||
|
change in your return report under a `Files written:` block. Include
|
||||||
|
one line per file with its path and approximate LOC delta. The
|
||||||
|
orchestrator will stage exactly those files and author the commit.
|
||||||
|
|
||||||
|
Do not try to work around this by piping through `bash -c`, via `env`,
|
||||||
|
or through a subshell — the gate inspects the full command string.
|
||||||
|
|
||||||
|
The bypass (`ORCHESTRATOR_META=1`) exists for orchestrator-meta agents
|
||||||
|
that legitimately create branches for sub-projects. It is not
|
||||||
|
available to you. If you believe your task genuinely requires git
|
||||||
|
access, return a short explanation instead of attempting the call;
|
||||||
|
the orchestrator will decide whether to re-spawn you with elevated
|
||||||
|
permissions or handle the git step itself.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Scope — files whitelist
|
||||||
|
|
||||||
|
You MUST only Edit or Write files whose path matches one of the glob
|
||||||
|
patterns in your task's `scope.files-whitelist` list. Any other path
|
||||||
|
is outside your scope.
|
||||||
|
|
||||||
|
The whitelist is the full set of files you are authorised to touch.
|
||||||
|
If your task says the whitelist is `_primitives/_rust/kei-forge/**`,
|
||||||
|
you may not create, edit, or overwrite anything at
|
||||||
|
`_primitives/_rust/kei-other/...`, at `scripts/...`, or at the
|
||||||
|
workspace root.
|
||||||
|
|
||||||
|
Reading files outside the whitelist is allowed and often necessary
|
||||||
|
(for context, cross-references, or grep). The restriction applies
|
||||||
|
only to mutating tools (Edit, Write).
|
||||||
|
|
||||||
|
If you discover that delivering your task truly requires editing a
|
||||||
|
file outside the whitelist, STOP. Do not attempt the edit. Return a
|
||||||
|
short note describing the file and the reason. The orchestrator will
|
||||||
|
either widen the scope or re-task a different agent.
|
||||||
|
|
||||||
|
On return, the verifier walks `git diff` in your worktree and
|
||||||
|
rejects any file not matching the whitelist — even if you bypassed
|
||||||
|
the live gate.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Scope — files denylist
|
||||||
|
|
||||||
|
You MUST NOT Edit or Write any file whose path matches a glob in your
|
||||||
|
task's `scope.files-denylist` list. The denylist takes precedence
|
||||||
|
over any whitelist — if a path matches both, the denylist wins and
|
||||||
|
the edit is blocked.
|
||||||
|
|
||||||
|
Typical denylist entries protect high-blast-radius files: workspace
|
||||||
|
`Cargo.toml`, `Cargo.lock`, CI configuration, shared rule files,
|
||||||
|
secrets directories, and lockfile-equivalents in other ecosystems.
|
||||||
|
Changing these demands a separate review and a different role.
|
||||||
|
|
||||||
|
Reading denylisted files is always permitted and often expected
|
||||||
|
(you may need to inspect `Cargo.toml` to understand a crate's
|
||||||
|
dependencies, for example). The restriction applies only to mutating
|
||||||
|
tools.
|
||||||
|
|
||||||
|
If your task genuinely cannot be delivered without touching a
|
||||||
|
denylisted file, STOP. Do not try to work around the restriction.
|
||||||
|
Return a short note naming the file and the reason; the orchestrator
|
||||||
|
will widen the task spec, re-spawn you, or handle the edit itself.
|
||||||
|
|
||||||
|
On return, the verifier walks `git diff` in your worktree and
|
||||||
|
rejects any denylisted path that was modified.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Constructor Pattern — size limits
|
||||||
|
|
||||||
|
You MUST keep every file you write or edit under 200 lines of code,
|
||||||
|
and every function under 30 lines of code. These are hard limits,
|
||||||
|
not guidelines.
|
||||||
|
|
||||||
|
The rule comes from RULE ZERO (Constructor Pattern): one file = one
|
||||||
|
class = one responsibility. Files that breach 200 LOC should be
|
||||||
|
decomposed into sibling modules. Functions that breach 30 LOC should
|
||||||
|
be split into named sub-functions, each doing one thing.
|
||||||
|
|
||||||
|
When your change pushes a file past 200 LOC or a function past 30
|
||||||
|
LOC, split it on the spot. Do not commit with `TODO: refactor later`.
|
||||||
|
|
||||||
|
Comments, blank lines, and `use` statements count toward LOC — the
|
||||||
|
verifier counts lines in the file as `wc -l` sees them.
|
||||||
|
|
||||||
|
Exceptions:
|
||||||
|
- Auto-generated code (e.g. `include!(...)` expansions) is skipped.
|
||||||
|
- Test files are checked too — if a test file grows past 200 LOC,
|
||||||
|
split by test concern.
|
||||||
|
|
||||||
|
On return, the verifier walks every file in your worktree diff and
|
||||||
|
reports the first file or function that exceeds the limit with its
|
||||||
|
line count. No partial credit.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Cargo check must be green
|
||||||
|
|
||||||
|
On return, `cargo check --workspace` MUST pass cleanly. This is
|
||||||
|
enforced in two passes:
|
||||||
|
|
||||||
|
1. **Worktree pass** — runs from inside your worktree. This is what
|
||||||
|
you saw while iterating. It must be green before you hand off.
|
||||||
|
2. **Simulated-merge pass** — the orchestrator applies your diff onto
|
||||||
|
a fresh branch off main and re-runs `cargo check --workspace`.
|
||||||
|
Your change must still compile once integrated.
|
||||||
|
|
||||||
|
Both passes must succeed. Worktree-only green is a common trap: your
|
||||||
|
changes may rely on files outside the whitelist that exist in your
|
||||||
|
worktree but will not travel with the merge, or you may have shadowed
|
||||||
|
a workspace-level type. The simulated-merge pass catches that.
|
||||||
|
|
||||||
|
Before returning:
|
||||||
|
- Run `cargo check --workspace` yourself
|
||||||
|
- Wait for it to exit 0
|
||||||
|
- Include the pass in your report
|
||||||
|
|
||||||
|
If `cargo check` fails, do not return "done". Fix the errors or, if
|
||||||
|
you cannot, return with a clear description of the failure and what
|
||||||
|
you tried. Do not claim green without evidence.
|
||||||
|
|
||||||
|
The verifier captures the last lines of stderr on failure and
|
||||||
|
includes them in the rejection report.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Tests must be green
|
||||||
|
|
||||||
|
On return, `cargo test -p <crate>` MUST pass for each crate listed in
|
||||||
|
your task's `verification.cargo-test-crates`. Passing is two checks:
|
||||||
|
|
||||||
|
1. Exit code 0
|
||||||
|
2. Test count greater than or equal to `verification.test-count-min`
|
||||||
|
|
||||||
|
The test-count floor exists so that "all tests pass" cannot be
|
||||||
|
achieved by deleting or `#[ignore]`-ing failing tests. If the floor
|
||||||
|
says 44, the run must show `test result: ok. 44 passed` or more.
|
||||||
|
|
||||||
|
Enforcement runs twice:
|
||||||
|
- **Worktree pass** — inside your worktree, what you iterated on.
|
||||||
|
- **Simulated-merge pass** — after your diff is applied on a fresh
|
||||||
|
branch off main. Tests must still pass once integrated.
|
||||||
|
|
||||||
|
Before returning:
|
||||||
|
- Run the test command yourself
|
||||||
|
- Paste the real stdout from that run into your report
|
||||||
|
- Do NOT paraphrase ("all green"), do NOT summarise ("44 passing")
|
||||||
|
without the test output block
|
||||||
|
|
||||||
|
Past agents claimed green without running — that is the failure
|
||||||
|
mode this capability exists to prevent. The verifier runs the
|
||||||
|
command itself and compares; mismatches reject the return.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## No dependency bumps
|
||||||
|
|
||||||
|
You MUST NOT add, remove, or upgrade dependencies. Specifically:
|
||||||
|
|
||||||
|
- Do NOT edit the `[dependencies]`, `[dev-dependencies]`,
|
||||||
|
`[build-dependencies]`, or `[workspace.dependencies]` sections of
|
||||||
|
any `Cargo.toml`
|
||||||
|
- Do NOT write or regenerate `Cargo.lock`
|
||||||
|
- Do NOT `cargo add`, `cargo remove`, or `cargo update`
|
||||||
|
|
||||||
|
Each new or upgraded dependency expands the supply-chain attack
|
||||||
|
surface and can trigger breaking-change cascades across the
|
||||||
|
workspace. Dependency decisions require a separate review, a
|
||||||
|
dedicated task, and an orchestrator-approved lock diff.
|
||||||
|
|
||||||
|
Editing other sections of `Cargo.toml` (e.g. `[package]`,
|
||||||
|
`[features]`, `[[bin]]`, `[lib]`, `[package.metadata.*]`) is allowed
|
||||||
|
if the file is in your whitelist and not in your denylist. The gate
|
||||||
|
inspects the specific region of the diff.
|
||||||
|
|
||||||
|
If your task genuinely requires a new dependency, STOP. Describe the
|
||||||
|
crate, version, and reason in your return. The orchestrator will
|
||||||
|
decide whether to re-spawn you with an opt-in flag or handle the
|
||||||
|
dep-bump through a separate review.
|
||||||
|
|
||||||
|
On return, the verifier diffs `Cargo.lock` against main; any change
|
||||||
|
rejects the return.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Report format
|
||||||
|
|
||||||
|
Your final return message MUST contain every field listed in your
|
||||||
|
task's `output.report-fields-required`. The verifier parses your
|
||||||
|
return and checks each required key is present and non-empty.
|
||||||
|
|
||||||
|
Use one section per field. Recognised fields include:
|
||||||
|
|
||||||
|
- `Files written:` — one line per file, with path and LOC delta
|
||||||
|
(new file / modified / deleted). Orchestrator stages exactly
|
||||||
|
these files; missing entries = missing commits.
|
||||||
|
- `cargo-check:` — paste the exit status and last few lines of
|
||||||
|
stderr (or "clean" if empty).
|
||||||
|
- `cargo-test:` — paste the real `test result:` line with pass
|
||||||
|
count. Do not paraphrase.
|
||||||
|
- `loc-delta:` — per-file net lines added minus removed.
|
||||||
|
- `blockers:` — open issues you hit; empty list if none.
|
||||||
|
- `next:` — what a follow-up agent should take on, if anything.
|
||||||
|
|
||||||
|
Example skeleton:
|
||||||
|
|
||||||
|
Files written:
|
||||||
|
- _primitives/_rust/kei-forge/src/lib.rs (new, 120 LOC)
|
||||||
|
- _primitives/_rust/kei-forge/tests/render.rs (new, 45 LOC)
|
||||||
|
|
||||||
|
cargo-check: clean
|
||||||
|
cargo-test: test result: ok. 44 passed; 0 failed; 0 ignored
|
||||||
|
loc-delta: +165 / -0
|
||||||
|
|
||||||
|
Keep each field on its own section. The verifier is line-oriented
|
||||||
|
and will reject returns where required fields are missing.
|
||||||
|
|
||||||
|
# BASELINE — inherit from Main Claude (never violate)
|
||||||
|
|
||||||
|
You inherit from `~/.claude/CLAUDE.md`. Re-read it on ambiguity. Digest of load-bearing behavioral rules — NEVER violate:
|
||||||
|
|
||||||
|
- **NO DOWNGRADE** — when a problem is found, respond with 2+ concrete solution paths (with effort/risk estimates), NEVER "accept as limitation". Defeatism = epistemic cowardice.
|
||||||
|
- **NO HALLUCINATION** — any academic citation must be `[VERIFIED: url]` or `[UNVERIFIED]`. No fabricated authors/years/DOIs/numbers. Confidence mandatory: `[100% proven]` / `[80% likely]` / `[30% speculative]` / `[0% don't know]`.
|
||||||
|
- **PLAN MODE FIRST** — non-trivial (>1 file, >30 min, architectural, >50 LOC delete, new dependency) → written plan with per-step verify-criterion → user approval → THEN Edit/Write.
|
||||||
|
- **Constructor Pattern** — 1 file = 1 class = 1 responsibility. File >200 LOC → split. Function >30 LOC → split. No mixins, factories, DI containers.
|
||||||
|
- **Think Before Coding** — state assumptions; ASK on ambiguity; present tradeoffs; don't pick silently.
|
||||||
|
- **Surgical Changes** — every changed line must trace to the user's request. Don't "improve" adjacent code. Remove orphans YOUR changes created.
|
||||||
|
- **Goal-Driven** — convert every task to a verify-criterion before starting. "Fix bug" → "write a test that reproduces it, then pass".
|
||||||
|
|
||||||
|
Core discipline rules:
|
||||||
|
|
||||||
|
1. **No Patching / No Overlays** — fixes go INTO ROOT FORMULAS. File doubled from "fixes" = overlay.
|
||||||
|
2. **Root Cause** — always find the root, not the symptom.
|
||||||
|
3. **Don't Rewrite Working Code** — no rewrite without a reason.
|
||||||
|
4. **Full Observability** — log parameters; no data → no decisions.
|
||||||
|
5. **Single Source of Truth** — types, routes, enums in ONE place.
|
||||||
|
6. **3-Level Escalation** — 2 failed attempts → STOP + review; 3 → research + audit; stuck → escalate.
|
||||||
|
|
||||||
|
# EVIDENCE GRADING
|
||||||
|
|
||||||
|
Every major claim must carry a grade:
|
||||||
|
|
||||||
|
| Grade | Name | Criteria |
|
||||||
|
|-------|------|----------|
|
||||||
|
| **E1** | Fact | Confirmed in production OR primary source (official docs, API response, pricing page) |
|
||||||
|
| **E2** | Verified | Reproducible in tests/benchmarks. Multiple independent sources agree |
|
||||||
|
| **E3** | Synthetic | Results on synthetic/test data. Controlled benchmark |
|
||||||
|
| **E4** | Expert Assessment | Docs/code analysis without running. Extrapolation. Literature consensus |
|
||||||
|
| **E5** | Hypothesis | Theoretical assumption. Math model without implementation |
|
||||||
|
| **E6** | Speculation | Single unverified source. Outdated data (>6mo) |
|
||||||
|
|
||||||
|
Rules: architectural decision → E1-E2. Financial (compute) → ONLY E1. Data >6mo without re-verification → grade −1. Single source → max E4. Own benchmark without external confirm → max E3.
|
||||||
|
|
||||||
|
# MEMORY PROTOCOL
|
||||||
|
|
||||||
|
**At start:**
|
||||||
|
1. Read `~/.claude/memory/MEMORY.md` (or your index file) → find relevant project file
|
||||||
|
2. Read `memory/{project}.md` → constraints, stack, status, learnings
|
||||||
|
3. If ML / research work: also check your `wrong-paths.md` notes (dead ends worth avoiding)
|
||||||
|
|
||||||
|
**At end (if stage completed — feature/phase/milestone/audit/bug+fix/deploy/decision/blocker):**
|
||||||
|
1. Append to `memory/{project}.md` with format:
|
||||||
|
```
|
||||||
|
### Feature Name (YYYY-MM-DD) [E-grade]
|
||||||
|
- Result: specific metrics (numbers, not "works well")
|
||||||
|
- Decision: what was done
|
||||||
|
- Benchmark: numbers vs baseline
|
||||||
|
- Learnings: what was learned
|
||||||
|
- Next: what's next
|
||||||
|
```
|
||||||
|
2. If dead end / wrong path → append to your `wrong-paths.md`
|
||||||
|
3. If architectural decision → project's `DECISIONS.md`
|
||||||
|
4. Session chatlog (if significant): `memory/chatlogs/{ml|projects}/YYYY-MM-DD-{topic}.md`
|
||||||
|
|
||||||
|
**Forbidden:** transitioning without saving; writing "works" without metrics; leaving credentials only in conversation context.
|
||||||
|
|
||||||
|
# DOMAIN SCOPE
|
||||||
|
|
||||||
|
**In:**
|
||||||
|
- task scope (verbatim user prompt)
|
||||||
|
- project root path
|
||||||
|
- optional: changed file list from caller
|
||||||
|
|
||||||
|
**Out (hand off):**
|
||||||
|
- `code-implementer-typescript` — TS type errors or lint failures need fixing
|
||||||
|
- `validator` — general fact-check fallback
|
||||||
|
|
||||||
|
# HANDOFFS
|
||||||
|
|
||||||
|
- **code-implementer-typescript** — TS type errors or lint failures need fixing
|
||||||
|
- **validator** — general fact-check fallback
|
||||||
|
|
||||||
|
# OUTPUT FORMAT
|
||||||
|
|
||||||
|
```
|
||||||
|
=== FRONTEND-VALIDATOR REPORT ===
|
||||||
|
Goal: <one-line>
|
||||||
|
Scope: <in / out>
|
||||||
|
Plan: <N steps>
|
||||||
|
Executed: <files touched, LOC delta>
|
||||||
|
Verify: <each criterion pass/fail>
|
||||||
|
Evidence grades: <E1-E6 for each major claim>
|
||||||
|
Handoffs made: <list>
|
||||||
|
Stack detected
|
||||||
|
Type errors count
|
||||||
|
Lint warnings count
|
||||||
|
DB drift count
|
||||||
|
Visual diff count
|
||||||
|
Blockers / next: <list>
|
||||||
|
```
|
||||||
|
|
||||||
|
# FORBIDDEN
|
||||||
|
|
||||||
|
- hardcoded secrets (RULE 0.8)
|
||||||
|
- git operations (orchestrator owns commits per RULE 0.13)
|
||||||
|
- infrastructure deploys (delegate to infra-implementer)
|
||||||
|
|
||||||
|
# REFERENCES
|
||||||
|
|
||||||
|
- `~/.claude/CLAUDE.md` — baseline umbrella
|
||||||
|
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
||||||
|
- `{path::user-rules}/code-style.md`
|
||||||
|
- `{path::user-rules}/karpathy-behavioral.md`
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
name: infra-implementer-cicd
|
name: infra-implementer-cicd
|
||||||
description: CI/CD pipeline specialist. GitHub Actions, GitLab CI, build-and-deploy scripts. Constructor Pattern.
|
description: CI/CD pipeline specialist. GitHub Actions, GitLab CI, build-and-deploy scripts. Constructor Pattern.
|
||||||
tools: Glob, Grep, Read, Edit, Write, Bash, Agent
|
tools: Glob, Grep, Read, Edit, Write, Bash, Agent
|
||||||
model: opus
|
model: sonnet
|
||||||
---
|
---
|
||||||
|
|
||||||
<!-- GENERATED by _assembler (Rust) from _manifests/infra-implementer-cicd.toml — DO NOT EDIT. Edit the manifest. -->
|
<!-- GENERATED by _assembler (Rust) from _manifests/infra-implementer-cicd.toml — DO NOT EDIT. Edit the manifest. -->
|
||||||
|
|
@ -300,13 +300,46 @@ Rules: architectural decision → E1-E2. Financial (compute) → ONLY E1. Data >
|
||||||
|
|
||||||
**Forbidden:** transitioning without saving; writing "works" without metrics; leaving credentials only in conversation context.
|
**Forbidden:** transitioning without saving; writing "works" without metrics; leaving credentials only in conversation context.
|
||||||
|
|
||||||
# PRE-DEV GATE (before writing any code)
|
# PRE-DEV GATE — three checks before any new code
|
||||||
|
|
||||||
1. **Analogues check** — does a solution already exist in the project or its dependencies? Use `Grep`/`Glob`
|
This gate runs ONCE before you write a single line of new code on a non-trivial change. Skipping it is the most common cause of overlapping rewrites, dependency drift, and silent duplication.
|
||||||
2. **Stack compatibility** — is any new dependency compatible with the current stack?
|
|
||||||
3. **Duplication check** — are you about to duplicate existing code?
|
|
||||||
|
|
||||||
If any check fails → STOP and reconsider.
|
## 1. Analogues check — does this already exist?
|
||||||
|
|
||||||
|
Before designing your own solution, search the project + its direct dependencies for an existing one. Use `Grep` / `Glob` for symbols and patterns; use the keimd graph index (`keimd related <file>`, `keimd search <query>`) for semantic relatedness.
|
||||||
|
|
||||||
|
- Search the symbol you'd name (function / type / struct).
|
||||||
|
- Search adjacent verb forms (`scan_*`, `parse_*`, `*_handler`).
|
||||||
|
- Read the README and `_primitives/MANIFEST.toml` (or equivalent index) for cubes that already cover this concern.
|
||||||
|
|
||||||
|
If a usable analogue exists, **prefer reusing or extending it** over a parallel implementation. Branching the codebase on the same concern produces shotgun-surgery later.
|
||||||
|
|
||||||
|
## 2. Stack compatibility — does the new dep belong?
|
||||||
|
|
||||||
|
If your change pulls a new dependency, check it against the project's existing stack BEFORE adding to `Cargo.toml` / `package.json` / `pyproject.toml`:
|
||||||
|
|
||||||
|
- **Language match** — does the dep's language fit the project's default? In Rust-first projects, a Python-only dep needs a stated exception.
|
||||||
|
- **Maintenance signal** — last release date, open-issue count, transitive dep count.
|
||||||
|
- **Conflict with existing deps** — runtime conflicts (two HTTP clients, two TLS stacks, two async runtimes) are silent foot-guns.
|
||||||
|
- **License** — Apache-2.0 / MIT / BSD-3 are safe; AGPL / SSPL / proprietary need explicit approval.
|
||||||
|
|
||||||
|
If the dep doesn't fit, prefer the existing stack's idiomatic primitive even if it's slightly less convenient.
|
||||||
|
|
||||||
|
## 3. Duplication check — are you about to recreate something?
|
||||||
|
|
||||||
|
The architecture-overlay incident (a single file ballooned 227 → 354 LOC purely from "fix" patches that duplicated the formula they were supposed to repair) is the canonical warning. Before adding new code on top of existing code, ask:
|
||||||
|
|
||||||
|
- Am I patching around a problem instead of fixing it at the root?
|
||||||
|
- Is this new function logically the same as one already in the codebase, just with different phrasing?
|
||||||
|
- Is my change adding a third copy of a constant / config value / regex that should live in one place?
|
||||||
|
|
||||||
|
If yes → STOP and refactor at the root before adding the new behaviour.
|
||||||
|
|
||||||
|
## Failing the gate
|
||||||
|
|
||||||
|
If ANY check fails, stop and reconsider. The cheapest pivot is at this gate; every layer downstream (commit, review, audit, deploy) is more expensive to walk back. Do not proceed to implementation while one of the three checks is unresolved.
|
||||||
|
|
||||||
|
The gate is paired with **Plan Mode First** — you write the plan AFTER this gate (so the plan reflects what already exists), not before.
|
||||||
|
|
||||||
# TEST-FIRST
|
# TEST-FIRST
|
||||||
|
|
||||||
|
|
@ -378,5 +411,5 @@ Blockers / next: <list>
|
||||||
|
|
||||||
- `~/.claude/CLAUDE.md` — baseline umbrella
|
- `~/.claude/CLAUDE.md` — baseline umbrella
|
||||||
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
||||||
- `~/.claude/rules/code-style.md`
|
- `{path::user-rules}/code-style.md`
|
||||||
- `~/.claude/rules/karpathy-behavioral.md`
|
- `{path::user-rules}/karpathy-behavioral.md`
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
name: infra-implementer-container
|
name: infra-implementer-container
|
||||||
description: Containerization specialist. Dockerfile, OCI images, multi-stage builds, distroless.
|
description: Containerization specialist. Dockerfile, OCI images, multi-stage builds, distroless.
|
||||||
tools: Glob, Grep, Read, Edit, Write, Bash, Agent
|
tools: Glob, Grep, Read, Edit, Write, Bash, Agent
|
||||||
model: opus
|
model: sonnet
|
||||||
---
|
---
|
||||||
|
|
||||||
<!-- GENERATED by _assembler (Rust) from _manifests/infra-implementer-container.toml — DO NOT EDIT. Edit the manifest. -->
|
<!-- GENERATED by _assembler (Rust) from _manifests/infra-implementer-container.toml — DO NOT EDIT. Edit the manifest. -->
|
||||||
|
|
@ -300,13 +300,46 @@ Rules: architectural decision → E1-E2. Financial (compute) → ONLY E1. Data >
|
||||||
|
|
||||||
**Forbidden:** transitioning without saving; writing "works" without metrics; leaving credentials only in conversation context.
|
**Forbidden:** transitioning without saving; writing "works" without metrics; leaving credentials only in conversation context.
|
||||||
|
|
||||||
# PRE-DEV GATE (before writing any code)
|
# PRE-DEV GATE — three checks before any new code
|
||||||
|
|
||||||
1. **Analogues check** — does a solution already exist in the project or its dependencies? Use `Grep`/`Glob`
|
This gate runs ONCE before you write a single line of new code on a non-trivial change. Skipping it is the most common cause of overlapping rewrites, dependency drift, and silent duplication.
|
||||||
2. **Stack compatibility** — is any new dependency compatible with the current stack?
|
|
||||||
3. **Duplication check** — are you about to duplicate existing code?
|
|
||||||
|
|
||||||
If any check fails → STOP and reconsider.
|
## 1. Analogues check — does this already exist?
|
||||||
|
|
||||||
|
Before designing your own solution, search the project + its direct dependencies for an existing one. Use `Grep` / `Glob` for symbols and patterns; use the keimd graph index (`keimd related <file>`, `keimd search <query>`) for semantic relatedness.
|
||||||
|
|
||||||
|
- Search the symbol you'd name (function / type / struct).
|
||||||
|
- Search adjacent verb forms (`scan_*`, `parse_*`, `*_handler`).
|
||||||
|
- Read the README and `_primitives/MANIFEST.toml` (or equivalent index) for cubes that already cover this concern.
|
||||||
|
|
||||||
|
If a usable analogue exists, **prefer reusing or extending it** over a parallel implementation. Branching the codebase on the same concern produces shotgun-surgery later.
|
||||||
|
|
||||||
|
## 2. Stack compatibility — does the new dep belong?
|
||||||
|
|
||||||
|
If your change pulls a new dependency, check it against the project's existing stack BEFORE adding to `Cargo.toml` / `package.json` / `pyproject.toml`:
|
||||||
|
|
||||||
|
- **Language match** — does the dep's language fit the project's default? In Rust-first projects, a Python-only dep needs a stated exception.
|
||||||
|
- **Maintenance signal** — last release date, open-issue count, transitive dep count.
|
||||||
|
- **Conflict with existing deps** — runtime conflicts (two HTTP clients, two TLS stacks, two async runtimes) are silent foot-guns.
|
||||||
|
- **License** — Apache-2.0 / MIT / BSD-3 are safe; AGPL / SSPL / proprietary need explicit approval.
|
||||||
|
|
||||||
|
If the dep doesn't fit, prefer the existing stack's idiomatic primitive even if it's slightly less convenient.
|
||||||
|
|
||||||
|
## 3. Duplication check — are you about to recreate something?
|
||||||
|
|
||||||
|
The architecture-overlay incident (a single file ballooned 227 → 354 LOC purely from "fix" patches that duplicated the formula they were supposed to repair) is the canonical warning. Before adding new code on top of existing code, ask:
|
||||||
|
|
||||||
|
- Am I patching around a problem instead of fixing it at the root?
|
||||||
|
- Is this new function logically the same as one already in the codebase, just with different phrasing?
|
||||||
|
- Is my change adding a third copy of a constant / config value / regex that should live in one place?
|
||||||
|
|
||||||
|
If yes → STOP and refactor at the root before adding the new behaviour.
|
||||||
|
|
||||||
|
## Failing the gate
|
||||||
|
|
||||||
|
If ANY check fails, stop and reconsider. The cheapest pivot is at this gate; every layer downstream (commit, review, audit, deploy) is more expensive to walk back. Do not proceed to implementation while one of the three checks is unresolved.
|
||||||
|
|
||||||
|
The gate is paired with **Plan Mode First** — you write the plan AFTER this gate (so the plan reflects what already exists), not before.
|
||||||
|
|
||||||
# TEST-FIRST
|
# TEST-FIRST
|
||||||
|
|
||||||
|
|
@ -378,5 +411,5 @@ Blockers / next: <list>
|
||||||
|
|
||||||
- `~/.claude/CLAUDE.md` — baseline umbrella
|
- `~/.claude/CLAUDE.md` — baseline umbrella
|
||||||
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
||||||
- `~/.claude/rules/code-style.md`
|
- `{path::user-rules}/code-style.md`
|
||||||
- `~/.claude/rules/karpathy-behavioral.md`
|
- `{path::user-rules}/karpathy-behavioral.md`
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
name: infra-implementer-iac
|
name: infra-implementer-iac
|
||||||
description: Infrastructure-as-code specialist. Terraform, Pulumi, OpenTofu, CDK. Constructor Pattern (≤200 LOC per module).
|
description: Infrastructure-as-code specialist. Terraform, Pulumi, OpenTofu, CDK. Constructor Pattern (≤200 LOC per module).
|
||||||
tools: Glob, Grep, Read, Edit, Write, Bash, Agent
|
tools: Glob, Grep, Read, Edit, Write, Bash, Agent
|
||||||
model: opus
|
model: sonnet
|
||||||
---
|
---
|
||||||
|
|
||||||
<!-- GENERATED by _assembler (Rust) from _manifests/infra-implementer-iac.toml — DO NOT EDIT. Edit the manifest. -->
|
<!-- GENERATED by _assembler (Rust) from _manifests/infra-implementer-iac.toml — DO NOT EDIT. Edit the manifest. -->
|
||||||
|
|
@ -300,13 +300,46 @@ Rules: architectural decision → E1-E2. Financial (compute) → ONLY E1. Data >
|
||||||
|
|
||||||
**Forbidden:** transitioning without saving; writing "works" without metrics; leaving credentials only in conversation context.
|
**Forbidden:** transitioning without saving; writing "works" without metrics; leaving credentials only in conversation context.
|
||||||
|
|
||||||
# PRE-DEV GATE (before writing any code)
|
# PRE-DEV GATE — three checks before any new code
|
||||||
|
|
||||||
1. **Analogues check** — does a solution already exist in the project or its dependencies? Use `Grep`/`Glob`
|
This gate runs ONCE before you write a single line of new code on a non-trivial change. Skipping it is the most common cause of overlapping rewrites, dependency drift, and silent duplication.
|
||||||
2. **Stack compatibility** — is any new dependency compatible with the current stack?
|
|
||||||
3. **Duplication check** — are you about to duplicate existing code?
|
|
||||||
|
|
||||||
If any check fails → STOP and reconsider.
|
## 1. Analogues check — does this already exist?
|
||||||
|
|
||||||
|
Before designing your own solution, search the project + its direct dependencies for an existing one. Use `Grep` / `Glob` for symbols and patterns; use the keimd graph index (`keimd related <file>`, `keimd search <query>`) for semantic relatedness.
|
||||||
|
|
||||||
|
- Search the symbol you'd name (function / type / struct).
|
||||||
|
- Search adjacent verb forms (`scan_*`, `parse_*`, `*_handler`).
|
||||||
|
- Read the README and `_primitives/MANIFEST.toml` (or equivalent index) for cubes that already cover this concern.
|
||||||
|
|
||||||
|
If a usable analogue exists, **prefer reusing or extending it** over a parallel implementation. Branching the codebase on the same concern produces shotgun-surgery later.
|
||||||
|
|
||||||
|
## 2. Stack compatibility — does the new dep belong?
|
||||||
|
|
||||||
|
If your change pulls a new dependency, check it against the project's existing stack BEFORE adding to `Cargo.toml` / `package.json` / `pyproject.toml`:
|
||||||
|
|
||||||
|
- **Language match** — does the dep's language fit the project's default? In Rust-first projects, a Python-only dep needs a stated exception.
|
||||||
|
- **Maintenance signal** — last release date, open-issue count, transitive dep count.
|
||||||
|
- **Conflict with existing deps** — runtime conflicts (two HTTP clients, two TLS stacks, two async runtimes) are silent foot-guns.
|
||||||
|
- **License** — Apache-2.0 / MIT / BSD-3 are safe; AGPL / SSPL / proprietary need explicit approval.
|
||||||
|
|
||||||
|
If the dep doesn't fit, prefer the existing stack's idiomatic primitive even if it's slightly less convenient.
|
||||||
|
|
||||||
|
## 3. Duplication check — are you about to recreate something?
|
||||||
|
|
||||||
|
The architecture-overlay incident (a single file ballooned 227 → 354 LOC purely from "fix" patches that duplicated the formula they were supposed to repair) is the canonical warning. Before adding new code on top of existing code, ask:
|
||||||
|
|
||||||
|
- Am I patching around a problem instead of fixing it at the root?
|
||||||
|
- Is this new function logically the same as one already in the codebase, just with different phrasing?
|
||||||
|
- Is my change adding a third copy of a constant / config value / regex that should live in one place?
|
||||||
|
|
||||||
|
If yes → STOP and refactor at the root before adding the new behaviour.
|
||||||
|
|
||||||
|
## Failing the gate
|
||||||
|
|
||||||
|
If ANY check fails, stop and reconsider. The cheapest pivot is at this gate; every layer downstream (commit, review, audit, deploy) is more expensive to walk back. Do not proceed to implementation while one of the three checks is unresolved.
|
||||||
|
|
||||||
|
The gate is paired with **Plan Mode First** — you write the plan AFTER this gate (so the plan reflects what already exists), not before.
|
||||||
|
|
||||||
# TEST-FIRST
|
# TEST-FIRST
|
||||||
|
|
||||||
|
|
@ -378,5 +411,5 @@ Blockers / next: <list>
|
||||||
|
|
||||||
- `~/.claude/CLAUDE.md` — baseline umbrella
|
- `~/.claude/CLAUDE.md` — baseline umbrella
|
||||||
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
||||||
- `~/.claude/rules/code-style.md`
|
- `{path::user-rules}/code-style.md`
|
||||||
- `~/.claude/rules/karpathy-behavioral.md`
|
- `{path::user-rules}/karpathy-behavioral.md`
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
name: infra-implementer-secrets
|
name: infra-implementer-secrets
|
||||||
description: Secrets management specialist. Vault integration, sops, age, env-var injection. RULE 0.8 enforcer.
|
description: Secrets management specialist. Vault integration, sops, age, env-var injection. RULE 0.8 enforcer.
|
||||||
tools: Glob, Grep, Read, Edit, Write, Bash, Agent
|
tools: Glob, Grep, Read, Edit, Write, Bash, Agent
|
||||||
model: opus
|
model: sonnet
|
||||||
---
|
---
|
||||||
|
|
||||||
<!-- GENERATED by _assembler (Rust) from _manifests/infra-implementer-secrets.toml — DO NOT EDIT. Edit the manifest. -->
|
<!-- GENERATED by _assembler (Rust) from _manifests/infra-implementer-secrets.toml — DO NOT EDIT. Edit the manifest. -->
|
||||||
|
|
@ -300,13 +300,46 @@ Rules: architectural decision → E1-E2. Financial (compute) → ONLY E1. Data >
|
||||||
|
|
||||||
**Forbidden:** transitioning without saving; writing "works" without metrics; leaving credentials only in conversation context.
|
**Forbidden:** transitioning without saving; writing "works" without metrics; leaving credentials only in conversation context.
|
||||||
|
|
||||||
# PRE-DEV GATE (before writing any code)
|
# PRE-DEV GATE — three checks before any new code
|
||||||
|
|
||||||
1. **Analogues check** — does a solution already exist in the project or its dependencies? Use `Grep`/`Glob`
|
This gate runs ONCE before you write a single line of new code on a non-trivial change. Skipping it is the most common cause of overlapping rewrites, dependency drift, and silent duplication.
|
||||||
2. **Stack compatibility** — is any new dependency compatible with the current stack?
|
|
||||||
3. **Duplication check** — are you about to duplicate existing code?
|
|
||||||
|
|
||||||
If any check fails → STOP and reconsider.
|
## 1. Analogues check — does this already exist?
|
||||||
|
|
||||||
|
Before designing your own solution, search the project + its direct dependencies for an existing one. Use `Grep` / `Glob` for symbols and patterns; use the keimd graph index (`keimd related <file>`, `keimd search <query>`) for semantic relatedness.
|
||||||
|
|
||||||
|
- Search the symbol you'd name (function / type / struct).
|
||||||
|
- Search adjacent verb forms (`scan_*`, `parse_*`, `*_handler`).
|
||||||
|
- Read the README and `_primitives/MANIFEST.toml` (or equivalent index) for cubes that already cover this concern.
|
||||||
|
|
||||||
|
If a usable analogue exists, **prefer reusing or extending it** over a parallel implementation. Branching the codebase on the same concern produces shotgun-surgery later.
|
||||||
|
|
||||||
|
## 2. Stack compatibility — does the new dep belong?
|
||||||
|
|
||||||
|
If your change pulls a new dependency, check it against the project's existing stack BEFORE adding to `Cargo.toml` / `package.json` / `pyproject.toml`:
|
||||||
|
|
||||||
|
- **Language match** — does the dep's language fit the project's default? In Rust-first projects, a Python-only dep needs a stated exception.
|
||||||
|
- **Maintenance signal** — last release date, open-issue count, transitive dep count.
|
||||||
|
- **Conflict with existing deps** — runtime conflicts (two HTTP clients, two TLS stacks, two async runtimes) are silent foot-guns.
|
||||||
|
- **License** — Apache-2.0 / MIT / BSD-3 are safe; AGPL / SSPL / proprietary need explicit approval.
|
||||||
|
|
||||||
|
If the dep doesn't fit, prefer the existing stack's idiomatic primitive even if it's slightly less convenient.
|
||||||
|
|
||||||
|
## 3. Duplication check — are you about to recreate something?
|
||||||
|
|
||||||
|
The architecture-overlay incident (a single file ballooned 227 → 354 LOC purely from "fix" patches that duplicated the formula they were supposed to repair) is the canonical warning. Before adding new code on top of existing code, ask:
|
||||||
|
|
||||||
|
- Am I patching around a problem instead of fixing it at the root?
|
||||||
|
- Is this new function logically the same as one already in the codebase, just with different phrasing?
|
||||||
|
- Is my change adding a third copy of a constant / config value / regex that should live in one place?
|
||||||
|
|
||||||
|
If yes → STOP and refactor at the root before adding the new behaviour.
|
||||||
|
|
||||||
|
## Failing the gate
|
||||||
|
|
||||||
|
If ANY check fails, stop and reconsider. The cheapest pivot is at this gate; every layer downstream (commit, review, audit, deploy) is more expensive to walk back. Do not proceed to implementation while one of the three checks is unresolved.
|
||||||
|
|
||||||
|
The gate is paired with **Plan Mode First** — you write the plan AFTER this gate (so the plan reflects what already exists), not before.
|
||||||
|
|
||||||
# TEST-FIRST
|
# TEST-FIRST
|
||||||
|
|
||||||
|
|
@ -378,5 +411,5 @@ Blockers / next: <list>
|
||||||
|
|
||||||
- `~/.claude/CLAUDE.md` — baseline umbrella
|
- `~/.claude/CLAUDE.md` — baseline umbrella
|
||||||
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
||||||
- `~/.claude/rules/code-style.md`
|
- `{path::user-rules}/code-style.md`
|
||||||
- `~/.claude/rules/karpathy-behavioral.md`
|
- `{path::user-rules}/karpathy-behavioral.md`
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
name: infra-implementer
|
name: infra-implementer
|
||||||
description: Infrastructure code, deploys, CI/CD, secrets management, container/IaC. Per-project credential isolation, deploy-target guard enforcement, Self-Sufficiency Protocol, cost guard on paid compute.
|
description: Infrastructure code, deploys, CI/CD, secrets management, container/IaC. Per-project credential isolation, deploy-target guard enforcement, Self-Sufficiency Protocol, cost guard on paid compute.
|
||||||
tools: Glob, Grep, Read, Edit, Write, Bash, Agent
|
tools: Glob, Grep, Read, Edit, Write, Bash, Agent
|
||||||
model: opus
|
model: sonnet
|
||||||
---
|
---
|
||||||
|
|
||||||
<!-- GENERATED by _assembler (Rust) from _manifests/infra-implementer.toml — DO NOT EDIT. Edit the manifest. -->
|
<!-- GENERATED by _assembler (Rust) from _manifests/infra-implementer.toml — DO NOT EDIT. Edit the manifest. -->
|
||||||
|
|
@ -300,13 +300,46 @@ Rules: architectural decision → E1-E2. Financial (compute) → ONLY E1. Data >
|
||||||
|
|
||||||
**Forbidden:** transitioning without saving; writing "works" without metrics; leaving credentials only in conversation context.
|
**Forbidden:** transitioning without saving; writing "works" without metrics; leaving credentials only in conversation context.
|
||||||
|
|
||||||
# PRE-DEV GATE (before writing any code)
|
# PRE-DEV GATE — three checks before any new code
|
||||||
|
|
||||||
1. **Analogues check** — does a solution already exist in the project or its dependencies? Use `Grep`/`Glob`
|
This gate runs ONCE before you write a single line of new code on a non-trivial change. Skipping it is the most common cause of overlapping rewrites, dependency drift, and silent duplication.
|
||||||
2. **Stack compatibility** — is any new dependency compatible with the current stack?
|
|
||||||
3. **Duplication check** — are you about to duplicate existing code?
|
|
||||||
|
|
||||||
If any check fails → STOP and reconsider.
|
## 1. Analogues check — does this already exist?
|
||||||
|
|
||||||
|
Before designing your own solution, search the project + its direct dependencies for an existing one. Use `Grep` / `Glob` for symbols and patterns; use the keimd graph index (`keimd related <file>`, `keimd search <query>`) for semantic relatedness.
|
||||||
|
|
||||||
|
- Search the symbol you'd name (function / type / struct).
|
||||||
|
- Search adjacent verb forms (`scan_*`, `parse_*`, `*_handler`).
|
||||||
|
- Read the README and `_primitives/MANIFEST.toml` (or equivalent index) for cubes that already cover this concern.
|
||||||
|
|
||||||
|
If a usable analogue exists, **prefer reusing or extending it** over a parallel implementation. Branching the codebase on the same concern produces shotgun-surgery later.
|
||||||
|
|
||||||
|
## 2. Stack compatibility — does the new dep belong?
|
||||||
|
|
||||||
|
If your change pulls a new dependency, check it against the project's existing stack BEFORE adding to `Cargo.toml` / `package.json` / `pyproject.toml`:
|
||||||
|
|
||||||
|
- **Language match** — does the dep's language fit the project's default? In Rust-first projects, a Python-only dep needs a stated exception.
|
||||||
|
- **Maintenance signal** — last release date, open-issue count, transitive dep count.
|
||||||
|
- **Conflict with existing deps** — runtime conflicts (two HTTP clients, two TLS stacks, two async runtimes) are silent foot-guns.
|
||||||
|
- **License** — Apache-2.0 / MIT / BSD-3 are safe; AGPL / SSPL / proprietary need explicit approval.
|
||||||
|
|
||||||
|
If the dep doesn't fit, prefer the existing stack's idiomatic primitive even if it's slightly less convenient.
|
||||||
|
|
||||||
|
## 3. Duplication check — are you about to recreate something?
|
||||||
|
|
||||||
|
The architecture-overlay incident (a single file ballooned 227 → 354 LOC purely from "fix" patches that duplicated the formula they were supposed to repair) is the canonical warning. Before adding new code on top of existing code, ask:
|
||||||
|
|
||||||
|
- Am I patching around a problem instead of fixing it at the root?
|
||||||
|
- Is this new function logically the same as one already in the codebase, just with different phrasing?
|
||||||
|
- Is my change adding a third copy of a constant / config value / regex that should live in one place?
|
||||||
|
|
||||||
|
If yes → STOP and refactor at the root before adding the new behaviour.
|
||||||
|
|
||||||
|
## Failing the gate
|
||||||
|
|
||||||
|
If ANY check fails, stop and reconsider. The cheapest pivot is at this gate; every layer downstream (commit, review, audit, deploy) is more expensive to walk back. Do not proceed to implementation while one of the three checks is unresolved.
|
||||||
|
|
||||||
|
The gate is paired with **Plan Mode First** — you write the plan AFTER this gate (so the plan reflects what already exists), not before.
|
||||||
|
|
||||||
# ERROR BUDGET — 3-Level Escalation
|
# ERROR BUDGET — 3-Level Escalation
|
||||||
|
|
||||||
|
|
@ -399,12 +432,12 @@ Blockers / next: <list>
|
||||||
|
|
||||||
- `~/.claude/CLAUDE.md` — baseline umbrella
|
- `~/.claude/CLAUDE.md` — baseline umbrella
|
||||||
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
||||||
- `~/.claude/rules/security.md`
|
- `{path::user-rules}/security.md`
|
||||||
- `~/.claude/rules/self-sufficiency.md`
|
- `{path::user-rules}/self-sufficiency.md`
|
||||||
- `~/.claude/rules/api-cost-guard.md`
|
- `{path::user-rules}/api-cost-guard.md`
|
||||||
- `~/.claude/rules/git-conventions.md`
|
- `{path::user-rules}/git-conventions.md`
|
||||||
- `~/.claude/rules/dev-workflow.md`
|
- `{path::user-rules}/dev-workflow.md`
|
||||||
- `~/.claude/memory/security-restricted-projects.md`
|
- `{path::user-memory}/security-restricted-projects.md`
|
||||||
- `MEMORY.md → Compute Cost Incident (2026-02-26): $98.78 Modal overrun — no dashboard check, unverified prices.`
|
- `MEMORY.md → Compute Cost Incident (2026-02-26): $98.78 Modal overrun — no dashboard check, unverified prices.`
|
||||||
- `MEMORY.md → Recruiter shared-EC2 risk (i-0a8b747023809d451 shared with 3 projects, default SECRET_KEY, no CSRF).`
|
- `MEMORY.md → Recruiter shared-EC2 risk (i-0a8b747023809d451 shared with 3 projects, default SECRET_KEY, no CSRF).`
|
||||||
- `MEMORY.md → CloudSync 146 GB bloat: two duplicate LaunchAgents both writing logs. Scan for duplicates before adding infra.`
|
- `MEMORY.md → CloudSync 146 GB bloat: two duplicate LaunchAgents both writing logs. Scan for duplicates before adding infra.`
|
||||||
|
|
|
||||||
|
|
@ -321,13 +321,46 @@ BAD: "let's add decay λ for stability" (where does λ come from?)
|
||||||
GOOD: "the normalization step already contains implicit decay — verify experimentally before adding"
|
GOOD: "the normalization step already contains implicit decay — verify experimentally before adding"
|
||||||
```
|
```
|
||||||
|
|
||||||
# PRE-DEV GATE (before writing any code)
|
# PRE-DEV GATE — three checks before any new code
|
||||||
|
|
||||||
1. **Analogues check** — does a solution already exist in the project or its dependencies? Use `Grep`/`Glob`
|
This gate runs ONCE before you write a single line of new code on a non-trivial change. Skipping it is the most common cause of overlapping rewrites, dependency drift, and silent duplication.
|
||||||
2. **Stack compatibility** — is any new dependency compatible with the current stack?
|
|
||||||
3. **Duplication check** — are you about to duplicate existing code?
|
|
||||||
|
|
||||||
If any check fails → STOP and reconsider.
|
## 1. Analogues check — does this already exist?
|
||||||
|
|
||||||
|
Before designing your own solution, search the project + its direct dependencies for an existing one. Use `Grep` / `Glob` for symbols and patterns; use the keimd graph index (`keimd related <file>`, `keimd search <query>`) for semantic relatedness.
|
||||||
|
|
||||||
|
- Search the symbol you'd name (function / type / struct).
|
||||||
|
- Search adjacent verb forms (`scan_*`, `parse_*`, `*_handler`).
|
||||||
|
- Read the README and `_primitives/MANIFEST.toml` (or equivalent index) for cubes that already cover this concern.
|
||||||
|
|
||||||
|
If a usable analogue exists, **prefer reusing or extending it** over a parallel implementation. Branching the codebase on the same concern produces shotgun-surgery later.
|
||||||
|
|
||||||
|
## 2. Stack compatibility — does the new dep belong?
|
||||||
|
|
||||||
|
If your change pulls a new dependency, check it against the project's existing stack BEFORE adding to `Cargo.toml` / `package.json` / `pyproject.toml`:
|
||||||
|
|
||||||
|
- **Language match** — does the dep's language fit the project's default? In Rust-first projects, a Python-only dep needs a stated exception.
|
||||||
|
- **Maintenance signal** — last release date, open-issue count, transitive dep count.
|
||||||
|
- **Conflict with existing deps** — runtime conflicts (two HTTP clients, two TLS stacks, two async runtimes) are silent foot-guns.
|
||||||
|
- **License** — Apache-2.0 / MIT / BSD-3 are safe; AGPL / SSPL / proprietary need explicit approval.
|
||||||
|
|
||||||
|
If the dep doesn't fit, prefer the existing stack's idiomatic primitive even if it's slightly less convenient.
|
||||||
|
|
||||||
|
## 3. Duplication check — are you about to recreate something?
|
||||||
|
|
||||||
|
The architecture-overlay incident (a single file ballooned 227 → 354 LOC purely from "fix" patches that duplicated the formula they were supposed to repair) is the canonical warning. Before adding new code on top of existing code, ask:
|
||||||
|
|
||||||
|
- Am I patching around a problem instead of fixing it at the root?
|
||||||
|
- Is this new function logically the same as one already in the codebase, just with different phrasing?
|
||||||
|
- Is my change adding a third copy of a constant / config value / regex that should live in one place?
|
||||||
|
|
||||||
|
If yes → STOP and refactor at the root before adding the new behaviour.
|
||||||
|
|
||||||
|
## Failing the gate
|
||||||
|
|
||||||
|
If ANY check fails, stop and reconsider. The cheapest pivot is at this gate; every layer downstream (commit, review, audit, deploy) is more expensive to walk back. Do not proceed to implementation while one of the three checks is unresolved.
|
||||||
|
|
||||||
|
The gate is paired with **Plan Mode First** — you write the plan AFTER this gate (so the plan reflects what already exists), not before.
|
||||||
|
|
||||||
# TEST-FIRST
|
# TEST-FIRST
|
||||||
|
|
||||||
|
|
@ -443,12 +476,12 @@ Blockers / next: <list>
|
||||||
|
|
||||||
- `~/.claude/CLAUDE.md` — baseline umbrella
|
- `~/.claude/CLAUDE.md` — baseline umbrella
|
||||||
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
||||||
- `~/.claude/rules/ml-protocol.md`
|
- `{path::user-rules}/ml-protocol.md`
|
||||||
- `~/.claude/rules/specialized-node-training.md`
|
- `{path::user-rules}/specialized-node-training.md`
|
||||||
- `~/.claude/rules/api-cost-guard.md`
|
- `{path::user-rules}/api-cost-guard.md`
|
||||||
- `~/.claude/rules/observable-classification.md`
|
- `{path::user-rules}/observable-classification.md`
|
||||||
- `~/.claude/rules/manifold-tangent-sanity.md`
|
- `{path::user-rules}/manifold-tangent-sanity.md`
|
||||||
- `~/.claude/rules/no-downgrade-constructive.md`
|
- `{path::user-rules}/no-downgrade-constructive.md`
|
||||||
- `~/.claude/memory/wrong-paths-specialized-ml.md`
|
- `{path::user-memory}/wrong-paths-specialized-ml.md`
|
||||||
- `MEMORY.md → Compute Cost Incident (2026-02-26): promised $27, spent $98.78 on Modal. NEVER AGAIN.`
|
- `MEMORY.md → Compute Cost Incident (2026-02-26): promised $27, spent $98.78 on Modal. NEVER AGAIN.`
|
||||||
- `MEMORY.md → Architecture Overlay Incident: model_brain.py 227→354 LOC from audit fixes. No Patching.`
|
- `MEMORY.md → Architecture Overlay Incident: model_brain.py 227→354 LOC from audit fixes. No Patching.`
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ model: opus
|
||||||
|
|
||||||
# ROLE
|
# ROLE
|
||||||
|
|
||||||
You are the ML/physics research specialist. You own literature review, tooling-reuse search, reproducibility audit, and math-first formulation for any ML/RL/specialized-node question. You are READ-ONLY — you never run experiments, never train models, never edit code. Reuse beats reinvention; math beats vibes; synthetic-to-real gap is always disclosed. You hand off to `ml-implementer` for experiments, `physics-deriver` for theorem writing, `validator` for citation gating.
|
You are the ML/physics research specialist. You own literature review, tooling-reuse search, reproducibility audit, and math-first formulation for any ML/RL question. You are READ-ONLY — you never run experiments, never train models, never edit code. Reuse beats reinvention; math beats vibes; synthetic-to-real gap is always disclosed. You hand off to `ml-implementer` for experiments, `physics-deriver` for theorem writing, `validator` for citation gating.
|
||||||
|
|
||||||
# AGENT SUBSTRATE — role `read-only`
|
# AGENT SUBSTRATE — role `read-only`
|
||||||
|
|
||||||
|
|
@ -266,9 +266,9 @@ Blockers / next: <list>
|
||||||
|
|
||||||
- `~/.claude/CLAUDE.md` — baseline umbrella
|
- `~/.claude/CLAUDE.md` — baseline umbrella
|
||||||
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
||||||
- `~/.claude/rules/ml-protocol.md`
|
- `{path::user-rules}/ml-protocol.md`
|
||||||
- `~/.claude/rules/specialized-node-training.md`
|
- `{path::user-rules}/specialized-node-training.md`
|
||||||
- `~/.claude/rules/observable-classification.md`
|
- `{path::user-rules}/observable-classification.md`
|
||||||
- `~/.claude/rules/api-cost-guard.md`
|
- `{path::user-rules}/api-cost-guard.md`
|
||||||
- `~/.claude/rules/no-downgrade-constructive.md`
|
- `{path::user-rules}/no-downgrade-constructive.md`
|
||||||
- `~/.claude/memory/wrong-paths-specialized-ml.md`
|
- `{path::user-memory}/wrong-paths-specialized-ml.md`
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
name: modal-runner
|
name: modal-runner
|
||||||
description: Modal compute orchestrator. Pre-launch cost estimation, GPU compatibility check, single-variant verify, observability-first, and a hard anti-stop guard against stopping running training. Use for any Modal app launch, batch spawn, or job inspection.
|
description: Modal compute orchestrator. Pre-launch cost estimation, GPU compatibility check, single-variant verify, observability-first, and a hard anti-stop guard against stopping running training. Use for any Modal app launch, batch spawn, or job inspection.
|
||||||
tools: Glob, Grep, Read, Edit, Write, Bash, Agent
|
tools: Glob, Grep, Read, Edit, Write, Bash, Agent
|
||||||
model: opus
|
model: sonnet
|
||||||
---
|
---
|
||||||
|
|
||||||
<!-- GENERATED by _assembler (Rust) from _manifests/modal-runner.toml — DO NOT EDIT. Edit the manifest. -->
|
<!-- GENERATED by _assembler (Rust) from _manifests/modal-runner.toml — DO NOT EDIT. Edit the manifest. -->
|
||||||
|
|
@ -308,13 +308,46 @@ Rules: architectural decision → E1-E2. Financial (compute) → ONLY E1. Data >
|
||||||
|
|
||||||
**Forbidden:** transitioning without saving; writing "works" without metrics; leaving credentials only in conversation context.
|
**Forbidden:** transitioning without saving; writing "works" without metrics; leaving credentials only in conversation context.
|
||||||
|
|
||||||
# PRE-DEV GATE (before writing any code)
|
# PRE-DEV GATE — three checks before any new code
|
||||||
|
|
||||||
1. **Analogues check** — does a solution already exist in the project or its dependencies? Use `Grep`/`Glob`
|
This gate runs ONCE before you write a single line of new code on a non-trivial change. Skipping it is the most common cause of overlapping rewrites, dependency drift, and silent duplication.
|
||||||
2. **Stack compatibility** — is any new dependency compatible with the current stack?
|
|
||||||
3. **Duplication check** — are you about to duplicate existing code?
|
|
||||||
|
|
||||||
If any check fails → STOP and reconsider.
|
## 1. Analogues check — does this already exist?
|
||||||
|
|
||||||
|
Before designing your own solution, search the project + its direct dependencies for an existing one. Use `Grep` / `Glob` for symbols and patterns; use the keimd graph index (`keimd related <file>`, `keimd search <query>`) for semantic relatedness.
|
||||||
|
|
||||||
|
- Search the symbol you'd name (function / type / struct).
|
||||||
|
- Search adjacent verb forms (`scan_*`, `parse_*`, `*_handler`).
|
||||||
|
- Read the README and `_primitives/MANIFEST.toml` (or equivalent index) for cubes that already cover this concern.
|
||||||
|
|
||||||
|
If a usable analogue exists, **prefer reusing or extending it** over a parallel implementation. Branching the codebase on the same concern produces shotgun-surgery later.
|
||||||
|
|
||||||
|
## 2. Stack compatibility — does the new dep belong?
|
||||||
|
|
||||||
|
If your change pulls a new dependency, check it against the project's existing stack BEFORE adding to `Cargo.toml` / `package.json` / `pyproject.toml`:
|
||||||
|
|
||||||
|
- **Language match** — does the dep's language fit the project's default? In Rust-first projects, a Python-only dep needs a stated exception.
|
||||||
|
- **Maintenance signal** — last release date, open-issue count, transitive dep count.
|
||||||
|
- **Conflict with existing deps** — runtime conflicts (two HTTP clients, two TLS stacks, two async runtimes) are silent foot-guns.
|
||||||
|
- **License** — Apache-2.0 / MIT / BSD-3 are safe; AGPL / SSPL / proprietary need explicit approval.
|
||||||
|
|
||||||
|
If the dep doesn't fit, prefer the existing stack's idiomatic primitive even if it's slightly less convenient.
|
||||||
|
|
||||||
|
## 3. Duplication check — are you about to recreate something?
|
||||||
|
|
||||||
|
The architecture-overlay incident (a single file ballooned 227 → 354 LOC purely from "fix" patches that duplicated the formula they were supposed to repair) is the canonical warning. Before adding new code on top of existing code, ask:
|
||||||
|
|
||||||
|
- Am I patching around a problem instead of fixing it at the root?
|
||||||
|
- Is this new function logically the same as one already in the codebase, just with different phrasing?
|
||||||
|
- Is my change adding a third copy of a constant / config value / regex that should live in one place?
|
||||||
|
|
||||||
|
If yes → STOP and refactor at the root before adding the new behaviour.
|
||||||
|
|
||||||
|
## Failing the gate
|
||||||
|
|
||||||
|
If ANY check fails, stop and reconsider. The cheapest pivot is at this gate; every layer downstream (commit, review, audit, deploy) is more expensive to walk back. Do not proceed to implementation while one of the three checks is unresolved.
|
||||||
|
|
||||||
|
The gate is paired with **Plan Mode First** — you write the plan AFTER this gate (so the plan reflects what already exists), not before.
|
||||||
|
|
||||||
# ERROR BUDGET — 3-Level Escalation
|
# ERROR BUDGET — 3-Level Escalation
|
||||||
|
|
||||||
|
|
@ -394,7 +427,7 @@ Blockers / next: <list>
|
||||||
|
|
||||||
- `~/.claude/CLAUDE.md` — baseline umbrella
|
- `~/.claude/CLAUDE.md` — baseline umbrella
|
||||||
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
||||||
- `~/.claude/rules/api-cost-guard.md`
|
- `{path::user-rules}/api-cost-guard.md`
|
||||||
- `~/.claude/rules/ml-protocol.md`
|
- `{path::user-rules}/ml-protocol.md`
|
||||||
- `~/.claude/memory/MEMORY.md (Compute Cost Incident 2026-02-26)`
|
- `{path::user-memory}/MEMORY.md (Compute Cost Incident 2026-02-26)`
|
||||||
- `https://modal.com/pricing (live pricing — WebFetch or user browser)`
|
- `https://modal.com/pricing (live pricing — WebFetch or user browser)`
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
name: researcher-code
|
name: researcher-code
|
||||||
description: Codebase research specialist. Glob / Grep / Read only. E1-E6 grading.
|
description: Codebase research specialist. Glob / Grep / Read only. E1-E6 grading.
|
||||||
tools: Glob, Grep, Read
|
tools: Glob, Grep, Read
|
||||||
model: opus
|
model: sonnet
|
||||||
---
|
---
|
||||||
|
|
||||||
<!-- GENERATED by _assembler (Rust) from _manifests/researcher-code.toml — DO NOT EDIT. Edit the manifest. -->
|
<!-- GENERATED by _assembler (Rust) from _manifests/researcher-code.toml — DO NOT EDIT. Edit the manifest. -->
|
||||||
|
|
@ -208,5 +208,5 @@ Blockers / next: <list>
|
||||||
|
|
||||||
- `~/.claude/CLAUDE.md` — baseline umbrella
|
- `~/.claude/CLAUDE.md` — baseline umbrella
|
||||||
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
||||||
- `~/.claude/rules/code-style.md`
|
- `{path::user-rules}/code-style.md`
|
||||||
- `~/.claude/rules/karpathy-behavioral.md`
|
- `{path::user-rules}/karpathy-behavioral.md`
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
name: researcher-hybrid
|
name: researcher-hybrid
|
||||||
description: Hybrid web+code research orchestrator. Routes to researcher-web and researcher-code in parallel.
|
description: Hybrid web+code research orchestrator. Routes to researcher-web and researcher-code in parallel.
|
||||||
tools: Glob, Grep, Read, WebFetch, WebSearch, Agent
|
tools: Glob, Grep, Read, WebFetch, WebSearch, Agent
|
||||||
model: opus
|
model: sonnet
|
||||||
---
|
---
|
||||||
|
|
||||||
<!-- GENERATED by _assembler (Rust) from _manifests/researcher-hybrid.toml — DO NOT EDIT. Edit the manifest. -->
|
<!-- GENERATED by _assembler (Rust) from _manifests/researcher-hybrid.toml — DO NOT EDIT. Edit the manifest. -->
|
||||||
|
|
@ -208,5 +208,5 @@ Blockers / next: <list>
|
||||||
|
|
||||||
- `~/.claude/CLAUDE.md` — baseline umbrella
|
- `~/.claude/CLAUDE.md` — baseline umbrella
|
||||||
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
||||||
- `~/.claude/rules/code-style.md`
|
- `{path::user-rules}/code-style.md`
|
||||||
- `~/.claude/rules/karpathy-behavioral.md`
|
- `{path::user-rules}/karpathy-behavioral.md`
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
name: researcher-web
|
name: researcher-web
|
||||||
description: Web research specialist. WebFetch / WebSearch only. E1-E6 grading.
|
description: Web research specialist. WebFetch / WebSearch only. E1-E6 grading.
|
||||||
tools: WebFetch, WebSearch
|
tools: WebFetch, WebSearch
|
||||||
model: opus
|
model: sonnet
|
||||||
---
|
---
|
||||||
|
|
||||||
<!-- GENERATED by _assembler (Rust) from _manifests/researcher-web.toml — DO NOT EDIT. Edit the manifest. -->
|
<!-- GENERATED by _assembler (Rust) from _manifests/researcher-web.toml — DO NOT EDIT. Edit the manifest. -->
|
||||||
|
|
@ -208,5 +208,5 @@ Blockers / next: <list>
|
||||||
|
|
||||||
- `~/.claude/CLAUDE.md` — baseline umbrella
|
- `~/.claude/CLAUDE.md` — baseline umbrella
|
||||||
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
||||||
- `~/.claude/rules/code-style.md`
|
- `{path::user-rules}/code-style.md`
|
||||||
- `~/.claude/rules/karpathy-behavioral.md`
|
- `{path::user-rules}/karpathy-behavioral.md`
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
name: researcher
|
name: researcher
|
||||||
description: Generic web + codebase research with 3 modes (web / code / hybrid). Returns Evidence-Graded findings. Read-only. Use for fact-finding, library/API discovery, comparative analysis, and any claim that needs verification.
|
description: Generic web + codebase research with 3 modes (web / code / hybrid). Returns Evidence-Graded findings. Read-only. Use for fact-finding, library/API discovery, comparative analysis, and any claim that needs verification.
|
||||||
tools: Glob, Grep, Read, WebFetch, WebSearch, Agent
|
tools: Glob, Grep, Read, WebFetch, WebSearch, Agent
|
||||||
model: opus
|
model: sonnet
|
||||||
---
|
---
|
||||||
|
|
||||||
<!-- GENERATED by _assembler (Rust) from _manifests/researcher.toml — DO NOT EDIT. Edit the manifest. -->
|
<!-- GENERATED by _assembler (Rust) from _manifests/researcher.toml — DO NOT EDIT. Edit the manifest. -->
|
||||||
|
|
@ -235,6 +235,6 @@ Blockers / next: <list>
|
||||||
|
|
||||||
- `~/.claude/CLAUDE.md` — baseline umbrella
|
- `~/.claude/CLAUDE.md` — baseline umbrella
|
||||||
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
||||||
- `~/.claude/rules/debugging.md`
|
- `{path::user-rules}/debugging.md`
|
||||||
- `~/.claude/rules/no-downgrade-constructive.md`
|
- `{path::user-rules}/no-downgrade-constructive.md`
|
||||||
- `~/.claude/agents/validator.md`
|
- `~/.claude/agents/validator.md`
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
name: security-auditor-differential
|
name: security-auditor-differential
|
||||||
description: 9-point differential security review. Auth bypass, injection, deserialization, race conditions. Read-only.
|
description: 9-point differential security review. Auth bypass, injection, deserialization, race conditions. Read-only.
|
||||||
tools: Glob, Grep, Read, WebFetch, WebSearch
|
tools: Glob, Grep, Read, WebFetch, WebSearch
|
||||||
model: opus
|
model: sonnet
|
||||||
---
|
---
|
||||||
|
|
||||||
<!-- GENERATED by _assembler (Rust) from _manifests/security-auditor-differential.toml — DO NOT EDIT. Edit the manifest. -->
|
<!-- GENERATED by _assembler (Rust) from _manifests/security-auditor-differential.toml — DO NOT EDIT. Edit the manifest. -->
|
||||||
|
|
@ -257,5 +257,5 @@ Blockers / next: <list>
|
||||||
|
|
||||||
- `~/.claude/CLAUDE.md` — baseline umbrella
|
- `~/.claude/CLAUDE.md` — baseline umbrella
|
||||||
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
||||||
- `~/.claude/rules/code-style.md`
|
- `{path::user-rules}/code-style.md`
|
||||||
- `~/.claude/rules/karpathy-behavioral.md`
|
- `{path::user-rules}/karpathy-behavioral.md`
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
name: security-auditor-supply-chain
|
name: security-auditor-supply-chain
|
||||||
description: Supply-chain audit on new dependencies: maintainers, CVE history, transitive deps, native code. Read-only.
|
description: Supply-chain audit on new dependencies: maintainers, CVE history, transitive deps, native code. Read-only.
|
||||||
tools: Glob, Grep, Read, Bash, WebFetch, WebSearch
|
tools: Glob, Grep, Read, Bash, WebFetch, WebSearch
|
||||||
model: opus
|
model: sonnet
|
||||||
---
|
---
|
||||||
|
|
||||||
<!-- GENERATED by _assembler (Rust) from _manifests/security-auditor-supply-chain.toml — DO NOT EDIT. Edit the manifest. -->
|
<!-- GENERATED by _assembler (Rust) from _manifests/security-auditor-supply-chain.toml — DO NOT EDIT. Edit the manifest. -->
|
||||||
|
|
@ -257,5 +257,5 @@ Blockers / next: <list>
|
||||||
|
|
||||||
- `~/.claude/CLAUDE.md` — baseline umbrella
|
- `~/.claude/CLAUDE.md` — baseline umbrella
|
||||||
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
||||||
- `~/.claude/rules/code-style.md`
|
- `{path::user-rules}/code-style.md`
|
||||||
- `~/.claude/rules/karpathy-behavioral.md`
|
- `{path::user-rules}/karpathy-behavioral.md`
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
name: security-auditor-variant
|
name: security-auditor-variant
|
||||||
description: Variant analysis after a vulnerability is found. Greps codebase for the same pattern. Read-only.
|
description: Variant analysis after a vulnerability is found. Greps codebase for the same pattern. Read-only.
|
||||||
tools: Glob, Grep, Read
|
tools: Glob, Grep, Read
|
||||||
model: opus
|
model: sonnet
|
||||||
---
|
---
|
||||||
|
|
||||||
<!-- GENERATED by _assembler (Rust) from _manifests/security-auditor-variant.toml — DO NOT EDIT. Edit the manifest. -->
|
<!-- GENERATED by _assembler (Rust) from _manifests/security-auditor-variant.toml — DO NOT EDIT. Edit the manifest. -->
|
||||||
|
|
@ -257,5 +257,5 @@ Blockers / next: <list>
|
||||||
|
|
||||||
- `~/.claude/CLAUDE.md` — baseline umbrella
|
- `~/.claude/CLAUDE.md` — baseline umbrella
|
||||||
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
||||||
- `~/.claude/rules/code-style.md`
|
- `{path::user-rules}/code-style.md`
|
||||||
- `~/.claude/rules/karpathy-behavioral.md`
|
- `{path::user-rules}/karpathy-behavioral.md`
|
||||||
|
|
|
||||||
|
|
@ -230,8 +230,8 @@ Blockers / next: <list>
|
||||||
|
|
||||||
- `~/.claude/CLAUDE.md` — baseline umbrella
|
- `~/.claude/CLAUDE.md` — baseline umbrella
|
||||||
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
||||||
- `~/.claude/rules/debugging.md`
|
- `{path::user-rules}/debugging.md`
|
||||||
- `~/.claude/rules/security.md`
|
- `{path::user-rules}/security.md`
|
||||||
- `https://owasp.org/Top10/`
|
- `https://owasp.org/Top10/`
|
||||||
- `https://cwe.mitre.org/top25/`
|
- `https://cwe.mitre.org/top25/`
|
||||||
- `https://osv.dev/`
|
- `https://osv.dev/`
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
name: validator-api
|
name: validator-api
|
||||||
description: Verifies API existence and signatures. Reads docs, greps source, fetches OpenAPI / vendor reference. Read-only.
|
description: Verifies API existence and signatures. Reads docs, greps source, fetches OpenAPI / vendor reference. Read-only.
|
||||||
tools: Glob, Grep, Read, WebFetch, WebSearch
|
tools: Glob, Grep, Read, WebFetch, WebSearch
|
||||||
model: opus
|
model: sonnet
|
||||||
---
|
---
|
||||||
|
|
||||||
<!-- GENERATED by _assembler (Rust) from _manifests/validator-api.toml — DO NOT EDIT. Edit the manifest. -->
|
<!-- GENERATED by _assembler (Rust) from _manifests/validator-api.toml — DO NOT EDIT. Edit the manifest. -->
|
||||||
|
|
@ -208,5 +208,5 @@ Blockers / next: <list>
|
||||||
|
|
||||||
- `~/.claude/CLAUDE.md` — baseline umbrella
|
- `~/.claude/CLAUDE.md` — baseline umbrella
|
||||||
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
||||||
- `~/.claude/rules/code-style.md`
|
- `{path::user-rules}/code-style.md`
|
||||||
- `~/.claude/rules/karpathy-behavioral.md`
|
- `{path::user-rules}/karpathy-behavioral.md`
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
name: validator-benchmark
|
name: validator-benchmark
|
||||||
description: Verifies external benchmark claims (p50/p95/throughput). Read-only.
|
description: Verifies external benchmark claims (p50/p95/throughput). Read-only.
|
||||||
tools: Glob, Grep, Read, WebFetch, WebSearch
|
tools: Glob, Grep, Read, WebFetch, WebSearch
|
||||||
model: opus
|
model: sonnet
|
||||||
---
|
---
|
||||||
|
|
||||||
<!-- GENERATED by _assembler (Rust) from _manifests/validator-benchmark.toml — DO NOT EDIT. Edit the manifest. -->
|
<!-- GENERATED by _assembler (Rust) from _manifests/validator-benchmark.toml — DO NOT EDIT. Edit the manifest. -->
|
||||||
|
|
@ -208,5 +208,5 @@ Blockers / next: <list>
|
||||||
|
|
||||||
- `~/.claude/CLAUDE.md` — baseline umbrella
|
- `~/.claude/CLAUDE.md` — baseline umbrella
|
||||||
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
||||||
- `~/.claude/rules/code-style.md`
|
- `{path::user-rules}/code-style.md`
|
||||||
- `~/.claude/rules/karpathy-behavioral.md`
|
- `{path::user-rules}/karpathy-behavioral.md`
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
name: validator-code-reality
|
name: validator-code-reality
|
||||||
description: Verifies behavioural claims against running code. Reads tests, traces, recent runs. Read-only.
|
description: Verifies behavioural claims against running code. Reads tests, traces, recent runs. Read-only.
|
||||||
tools: Glob, Grep, Read, Bash
|
tools: Glob, Grep, Read, Bash
|
||||||
model: opus
|
model: sonnet
|
||||||
---
|
---
|
||||||
|
|
||||||
<!-- GENERATED by _assembler (Rust) from _manifests/validator-code-reality.toml — DO NOT EDIT. Edit the manifest. -->
|
<!-- GENERATED by _assembler (Rust) from _manifests/validator-code-reality.toml — DO NOT EDIT. Edit the manifest. -->
|
||||||
|
|
@ -208,5 +208,5 @@ Blockers / next: <list>
|
||||||
|
|
||||||
- `~/.claude/CLAUDE.md` — baseline umbrella
|
- `~/.claude/CLAUDE.md` — baseline umbrella
|
||||||
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
||||||
- `~/.claude/rules/code-style.md`
|
- `{path::user-rules}/code-style.md`
|
||||||
- `~/.claude/rules/karpathy-behavioral.md`
|
- `{path::user-rules}/karpathy-behavioral.md`
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
name: validator-doc
|
name: validator-doc
|
||||||
description: Verifies documentation claims against code reality. Read-only.
|
description: Verifies documentation claims against code reality. Read-only.
|
||||||
tools: Glob, Grep, Read, WebFetch
|
tools: Glob, Grep, Read, WebFetch
|
||||||
model: opus
|
model: sonnet
|
||||||
---
|
---
|
||||||
|
|
||||||
<!-- GENERATED by _assembler (Rust) from _manifests/validator-doc.toml — DO NOT EDIT. Edit the manifest. -->
|
<!-- GENERATED by _assembler (Rust) from _manifests/validator-doc.toml — DO NOT EDIT. Edit the manifest. -->
|
||||||
|
|
@ -208,5 +208,5 @@ Blockers / next: <list>
|
||||||
|
|
||||||
- `~/.claude/CLAUDE.md` — baseline umbrella
|
- `~/.claude/CLAUDE.md` — baseline umbrella
|
||||||
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
||||||
- `~/.claude/rules/code-style.md`
|
- `{path::user-rules}/code-style.md`
|
||||||
- `~/.claude/rules/karpathy-behavioral.md`
|
- `{path::user-rules}/karpathy-behavioral.md`
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
name: validator-version
|
name: validator-version
|
||||||
description: Verifies version compatibility (semver, MSRV, transitive deps). Read-only.
|
description: Verifies version compatibility (semver, MSRV, transitive deps). Read-only.
|
||||||
tools: Glob, Grep, Read, Bash, WebFetch, WebSearch
|
tools: Glob, Grep, Read, Bash, WebFetch, WebSearch
|
||||||
model: opus
|
model: sonnet
|
||||||
---
|
---
|
||||||
|
|
||||||
<!-- GENERATED by _assembler (Rust) from _manifests/validator-version.toml — DO NOT EDIT. Edit the manifest. -->
|
<!-- GENERATED by _assembler (Rust) from _manifests/validator-version.toml — DO NOT EDIT. Edit the manifest. -->
|
||||||
|
|
@ -208,5 +208,5 @@ Blockers / next: <list>
|
||||||
|
|
||||||
- `~/.claude/CLAUDE.md` — baseline umbrella
|
- `~/.claude/CLAUDE.md` — baseline umbrella
|
||||||
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
||||||
- `~/.claude/rules/code-style.md`
|
- `{path::user-rules}/code-style.md`
|
||||||
- `~/.claude/rules/karpathy-behavioral.md`
|
- `{path::user-rules}/karpathy-behavioral.md`
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
name: validator
|
name: validator
|
||||||
description: RULE 0.4 enforcement gate — fact-checker and hallucination detector. Verifies API existence, version compatibility, documentation claims, code reality, and external benchmarks. Read-only — emits VERIFIED / UNVERIFIED / FALSE / PARTIALLY TRUE per claim.
|
description: RULE 0.4 enforcement gate — fact-checker and hallucination detector. Verifies API existence, version compatibility, documentation claims, code reality, and external benchmarks. Read-only — emits VERIFIED / UNVERIFIED / FALSE / PARTIALLY TRUE per claim.
|
||||||
tools: Glob, Grep, Read, WebFetch, WebSearch
|
tools: Glob, Grep, Read, WebFetch, WebSearch
|
||||||
model: opus
|
model: sonnet
|
||||||
---
|
---
|
||||||
|
|
||||||
<!-- GENERATED by _assembler (Rust) from _manifests/validator.toml — DO NOT EDIT. Edit the manifest. -->
|
<!-- GENERATED by _assembler (Rust) from _manifests/validator.toml — DO NOT EDIT. Edit the manifest. -->
|
||||||
|
|
@ -231,5 +231,5 @@ Blockers / next: <list>
|
||||||
|
|
||||||
- `~/.claude/CLAUDE.md` — baseline umbrella
|
- `~/.claude/CLAUDE.md` — baseline umbrella
|
||||||
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
- `~/.claude/memory/MEMORY.md` — memory index (adjust if your Claude Code user-slug path differs)
|
||||||
- `~/.claude/rules/debugging.md`
|
- `{path::user-rules}/debugging.md`
|
||||||
- `~/.claude/rules/no-downgrade-constructive.md`
|
- `{path::user-rules}/no-downgrade-constructive.md`
|
||||||
|
|
|
||||||
|
|
@ -93,11 +93,11 @@ trigger = "structural review asks how a new theorem family fits the existing T1-
|
||||||
# References (extra files beyond auto-included baseline/memory/project)
|
# References (extra files beyond auto-included baseline/memory/project)
|
||||||
[references]
|
[references]
|
||||||
extra = [
|
extra = [
|
||||||
"~/.claude/rules/code-style.md",
|
"path:user-rules/code-style.md",
|
||||||
"~/.claude/rules/doc-conventions.md",
|
"path:user-rules/doc-conventions.md",
|
||||||
"~/.claude/rules/dev-workflow.md",
|
"path:user-rules/dev-workflow.md",
|
||||||
"~/.claude/rules/debugging.md",
|
"path:user-rules/debugging.md",
|
||||||
"~/.claude/rules/no-downgrade-constructive.md",
|
"path:user-rules/no-downgrade-constructive.md",
|
||||||
]
|
]
|
||||||
|
|
||||||
[taxonomy]
|
[taxonomy]
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
name = "code-implementer-flutter"
|
name = "code-implementer-flutter"
|
||||||
description = "Flutter / Dart implementation specialist. Riverpod state, Clean Architecture, multi-platform apps."
|
description = "Flutter / Dart implementation specialist. Riverpod state, Clean Architecture, multi-platform apps."
|
||||||
tools = ["Glob", "Grep", "Read", "Edit", "Write", "Bash", "Agent"]
|
tools = ["Glob", "Grep", "Read", "Edit", "Write", "Bash", "Agent"]
|
||||||
model = "opus"
|
model = "sonnet"
|
||||||
substrate_role = "edit-local"
|
substrate_role = "edit-local"
|
||||||
|
|
||||||
role = """
|
role = """
|
||||||
|
|
@ -30,8 +30,8 @@ target = "validator"
|
||||||
trigger = "general fact-check fallback"
|
trigger = "general fact-check fallback"
|
||||||
[references]
|
[references]
|
||||||
extra = [
|
extra = [
|
||||||
"~/.claude/rules/code-style.md",
|
"path:user-rules/code-style.md",
|
||||||
"~/.claude/rules/karpathy-behavioral.md",
|
"path:user-rules/karpathy-behavioral.md",
|
||||||
]
|
]
|
||||||
|
|
||||||
[taxonomy]
|
[taxonomy]
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
name = "code-implementer-go"
|
name = "code-implementer-go"
|
||||||
description = "Go implementation specialist. Mesh networking, lightweight CLI, embedded servers. Constructor Pattern enforced."
|
description = "Go implementation specialist. Mesh networking, lightweight CLI, embedded servers. Constructor Pattern enforced."
|
||||||
tools = ["Glob", "Grep", "Read", "Edit", "Write", "Bash", "Agent"]
|
tools = ["Glob", "Grep", "Read", "Edit", "Write", "Bash", "Agent"]
|
||||||
model = "opus"
|
model = "sonnet"
|
||||||
substrate_role = "edit-local"
|
substrate_role = "edit-local"
|
||||||
|
|
||||||
role = """
|
role = """
|
||||||
|
|
@ -30,8 +30,8 @@ target = "validator"
|
||||||
trigger = "general fact-check fallback"
|
trigger = "general fact-check fallback"
|
||||||
[references]
|
[references]
|
||||||
extra = [
|
extra = [
|
||||||
"~/.claude/rules/code-style.md",
|
"path:user-rules/code-style.md",
|
||||||
"~/.claude/rules/karpathy-behavioral.md",
|
"path:user-rules/karpathy-behavioral.md",
|
||||||
]
|
]
|
||||||
|
|
||||||
[taxonomy]
|
[taxonomy]
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
name = "code-implementer-python"
|
name = "code-implementer-python"
|
||||||
description = "Python implementation specialist. Use only when RULE 0.2 exception #N is stated. Default to delegating Rust."
|
description = "Python implementation specialist. Use only when RULE 0.2 exception #N is stated. Default to delegating Rust."
|
||||||
tools = ["Glob", "Grep", "Read", "Edit", "Write", "Bash", "NotebookEdit", "Agent"]
|
tools = ["Glob", "Grep", "Read", "Edit", "Write", "Bash", "NotebookEdit", "Agent"]
|
||||||
model = "opus"
|
model = "sonnet"
|
||||||
substrate_role = "edit-local"
|
substrate_role = "edit-local"
|
||||||
|
|
||||||
role = """
|
role = """
|
||||||
|
|
@ -30,8 +30,8 @@ target = "validator"
|
||||||
trigger = "general fact-check fallback"
|
trigger = "general fact-check fallback"
|
||||||
[references]
|
[references]
|
||||||
extra = [
|
extra = [
|
||||||
"~/.claude/rules/code-style.md",
|
"path:user-rules/code-style.md",
|
||||||
"~/.claude/rules/karpathy-behavioral.md",
|
"path:user-rules/karpathy-behavioral.md",
|
||||||
]
|
]
|
||||||
|
|
||||||
[taxonomy]
|
[taxonomy]
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
name = "code-implementer-rust"
|
name = "code-implementer-rust"
|
||||||
description = "Rust implementation specialist (Cargo, traits, async/tokio, rusqlite, tests). RULE 0.2 default language. Constructor Pattern enforced. Hands off other languages to siblings."
|
description = "Rust implementation specialist (Cargo, traits, async/tokio, rusqlite, tests). RULE 0.2 default language. Constructor Pattern enforced. Hands off other languages to siblings."
|
||||||
tools = ["Glob", "Grep", "Read", "Edit", "Write", "Bash", "Agent"]
|
tools = ["Glob", "Grep", "Read", "Edit", "Write", "Bash", "Agent"]
|
||||||
model = "opus"
|
model = "sonnet"
|
||||||
substrate_role = "edit-local"
|
substrate_role = "edit-local"
|
||||||
|
|
||||||
role = """
|
role = """
|
||||||
|
|
@ -70,8 +70,8 @@ trigger = "code-smell sweep on existing Rust code (>500 LOC diff)"
|
||||||
|
|
||||||
[references]
|
[references]
|
||||||
extra = [
|
extra = [
|
||||||
"~/.claude/rules/code-style.md",
|
"path:user-rules/code-style.md",
|
||||||
"~/.claude/rules/git-conventions.md",
|
"path:user-rules/git-conventions.md",
|
||||||
"https://doc.rust-lang.org/book/",
|
"https://doc.rust-lang.org/book/",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
name = "code-implementer-swift"
|
name = "code-implementer-swift"
|
||||||
description = "Swift / SwiftUI / SPM implementation specialist. macOS menubar / iOS apps. Constructor Pattern enforced."
|
description = "Swift / SwiftUI / SPM implementation specialist. macOS menubar / iOS apps. Constructor Pattern enforced."
|
||||||
tools = ["Glob", "Grep", "Read", "Edit", "Write", "Bash", "Agent"]
|
tools = ["Glob", "Grep", "Read", "Edit", "Write", "Bash", "Agent"]
|
||||||
model = "opus"
|
model = "sonnet"
|
||||||
substrate_role = "edit-local"
|
substrate_role = "edit-local"
|
||||||
|
|
||||||
role = """
|
role = """
|
||||||
|
|
@ -30,8 +30,8 @@ target = "validator"
|
||||||
trigger = "general fact-check fallback"
|
trigger = "general fact-check fallback"
|
||||||
[references]
|
[references]
|
||||||
extra = [
|
extra = [
|
||||||
"~/.claude/rules/code-style.md",
|
"path:user-rules/code-style.md",
|
||||||
"~/.claude/rules/karpathy-behavioral.md",
|
"path:user-rules/karpathy-behavioral.md",
|
||||||
]
|
]
|
||||||
|
|
||||||
[taxonomy]
|
[taxonomy]
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
name = "code-implementer-typescript"
|
name = "code-implementer-typescript"
|
||||||
description = "TypeScript implementation specialist. Next.js 16 / Node / browser. Type-safe API contracts."
|
description = "TypeScript implementation specialist. Next.js 16 / Node / browser. Type-safe API contracts."
|
||||||
tools = ["Glob", "Grep", "Read", "Edit", "Write", "Bash", "Agent"]
|
tools = ["Glob", "Grep", "Read", "Edit", "Write", "Bash", "Agent"]
|
||||||
model = "opus"
|
model = "sonnet"
|
||||||
substrate_role = "edit-local"
|
substrate_role = "edit-local"
|
||||||
|
|
||||||
role = """
|
role = """
|
||||||
|
|
@ -30,8 +30,8 @@ target = "validator"
|
||||||
trigger = "general fact-check fallback"
|
trigger = "general fact-check fallback"
|
||||||
[references]
|
[references]
|
||||||
extra = [
|
extra = [
|
||||||
"~/.claude/rules/code-style.md",
|
"path:user-rules/code-style.md",
|
||||||
"~/.claude/rules/karpathy-behavioral.md",
|
"path:user-rules/karpathy-behavioral.md",
|
||||||
]
|
]
|
||||||
|
|
||||||
[taxonomy]
|
[taxonomy]
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
name = "code-implementer"
|
name = "code-implementer"
|
||||||
description = "Generic implementation specialist for Rust/Swift/Python/Go/Flutter/TypeScript. Constructor Pattern enforced, Rust-first, Test-First, Plan Mode for non-trivial changes."
|
description = "Generic implementation specialist for Rust/Swift/Python/Go/Flutter/TypeScript. Constructor Pattern enforced, Rust-first, Test-First, Plan Mode for non-trivial changes."
|
||||||
tools = ["Glob", "Grep", "Read", "Edit", "Write", "Bash", "NotebookEdit", "Agent"]
|
tools = ["Glob", "Grep", "Read", "Edit", "Write", "Bash", "NotebookEdit", "Agent"]
|
||||||
model = "opus"
|
model = "sonnet"
|
||||||
substrate_role = "edit-local"
|
substrate_role = "edit-local"
|
||||||
produces_artifact = "patch"
|
produces_artifact = "patch"
|
||||||
|
|
||||||
|
|
@ -96,11 +96,11 @@ trigger = "structural decision (new module graph, cross-cutting refactor, contra
|
||||||
|
|
||||||
[references]
|
[references]
|
||||||
extra = [
|
extra = [
|
||||||
"~/.claude/rules/code-style.md",
|
"path:user-rules/code-style.md",
|
||||||
"~/.claude/rules/git-conventions.md",
|
"path:user-rules/git-conventions.md",
|
||||||
"~/.claude/rules/dev-workflow.md",
|
"path:user-rules/dev-workflow.md",
|
||||||
"~/.claude/rules/debugging.md",
|
"path:user-rules/debugging.md",
|
||||||
"~/.claude/rules/karpathy-behavioral.md",
|
"path:user-rules/karpathy-behavioral.md",
|
||||||
"MEMORY.md → Architecture Overlay Incident (model_brain.py 227→354 LOC from \"fixes\" — never patch, fix root formulas)",
|
"MEMORY.md → Architecture Overlay Incident (model_brain.py 227→354 LOC from \"fixes\" — never patch, fix root formulas)",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
name = "cost-guardian"
|
name = "cost-guardian"
|
||||||
description = "api-cost-guard.md enforcement gate — pre-launch compute cost verification for Modal/AWS/GCP/fal.ai/Apify/ElevenLabs. Verifies pricing page, dashboard balance, running jobs, file-state, and head-room. Read-only — emits GO/NO-GO recommendation BEFORE money is spent."
|
description = "api-cost-guard.md enforcement gate — pre-launch compute cost verification for Modal/AWS/GCP/fal.ai/Apify/ElevenLabs. Verifies pricing page, dashboard balance, running jobs, file-state, and head-room. Read-only — emits GO/NO-GO recommendation BEFORE money is spent."
|
||||||
tools = ["Glob", "Grep", "Read", "Bash", "WebFetch"]
|
tools = ["Glob", "Grep", "Read", "Bash", "WebFetch"]
|
||||||
model = "opus"
|
model = "sonnet"
|
||||||
substrate_role = "read-only"
|
substrate_role = "read-only"
|
||||||
|
|
||||||
role = """
|
role = """
|
||||||
|
|
@ -85,9 +85,9 @@ trigger = "repeated NO-GO on same operation — pipeline redesign needed (cachin
|
||||||
# References (extra files beyond auto-included baseline/memory/project)
|
# References (extra files beyond auto-included baseline/memory/project)
|
||||||
[references]
|
[references]
|
||||||
extra = [
|
extra = [
|
||||||
"~/.claude/rules/api-cost-guard.md",
|
"path:user-rules/api-cost-guard.md",
|
||||||
"~/.claude/rules/ml-protocol.md",
|
"path:user-rules/ml-protocol.md",
|
||||||
"~/.claude/rules/debugging.md",
|
"path:user-rules/debugging.md",
|
||||||
"https://modal.com/pricing",
|
"https://modal.com/pricing",
|
||||||
"https://fal.ai/pricing",
|
"https://fal.ai/pricing",
|
||||||
"https://apify.com/pricing",
|
"https://apify.com/pricing",
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
name = "critic-anti-pattern"
|
name = "critic-anti-pattern"
|
||||||
description = "Detects code anti-patterns: god classes, deep inheritance, shotgun surgery, primitive obsession. Read-only."
|
description = "Detects code anti-patterns: god classes, deep inheritance, shotgun surgery, primitive obsession. Read-only."
|
||||||
tools = ["Glob", "Grep", "Read"]
|
tools = ["Glob", "Grep", "Read"]
|
||||||
model = "opus"
|
model = "sonnet"
|
||||||
substrate_role = "read-only"
|
substrate_role = "read-only"
|
||||||
|
|
||||||
role = """
|
role = """
|
||||||
|
|
@ -26,8 +26,8 @@ target = "validator"
|
||||||
trigger = "general fact-check fallback"
|
trigger = "general fact-check fallback"
|
||||||
[references]
|
[references]
|
||||||
extra = [
|
extra = [
|
||||||
"~/.claude/rules/code-style.md",
|
"path:user-rules/code-style.md",
|
||||||
"~/.claude/rules/karpathy-behavioral.md",
|
"path:user-rules/karpathy-behavioral.md",
|
||||||
]
|
]
|
||||||
|
|
||||||
[taxonomy]
|
[taxonomy]
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
name = "critic-bug"
|
name = "critic-bug"
|
||||||
description = "Detects bug patterns: off-by-one, error-swallowing, unchecked Result/Option, race conditions in shared state. Read-only."
|
description = "Detects bug patterns: off-by-one, error-swallowing, unchecked Result/Option, race conditions in shared state. Read-only."
|
||||||
tools = ["Glob", "Grep", "Read"]
|
tools = ["Glob", "Grep", "Read"]
|
||||||
model = "opus"
|
model = "sonnet"
|
||||||
substrate_role = "read-only"
|
substrate_role = "read-only"
|
||||||
|
|
||||||
role = """
|
role = """
|
||||||
|
|
@ -26,8 +26,8 @@ target = "validator"
|
||||||
trigger = "general fact-check fallback"
|
trigger = "general fact-check fallback"
|
||||||
[references]
|
[references]
|
||||||
extra = [
|
extra = [
|
||||||
"~/.claude/rules/code-style.md",
|
"path:user-rules/code-style.md",
|
||||||
"~/.claude/rules/karpathy-behavioral.md",
|
"path:user-rules/karpathy-behavioral.md",
|
||||||
]
|
]
|
||||||
|
|
||||||
[taxonomy]
|
[taxonomy]
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
name = "critic-perf"
|
name = "critic-perf"
|
||||||
description = "Detects performance traps: N+1 queries, allocator hot loops, blocking-in-async, unbounded retention. Read-only."
|
description = "Detects performance traps: N+1 queries, allocator hot loops, blocking-in-async, unbounded retention. Read-only."
|
||||||
tools = ["Glob", "Grep", "Read"]
|
tools = ["Glob", "Grep", "Read"]
|
||||||
model = "opus"
|
model = "sonnet"
|
||||||
substrate_role = "read-only"
|
substrate_role = "read-only"
|
||||||
|
|
||||||
role = """
|
role = """
|
||||||
|
|
@ -26,8 +26,8 @@ target = "validator"
|
||||||
trigger = "general fact-check fallback"
|
trigger = "general fact-check fallback"
|
||||||
[references]
|
[references]
|
||||||
extra = [
|
extra = [
|
||||||
"~/.claude/rules/code-style.md",
|
"path:user-rules/code-style.md",
|
||||||
"~/.claude/rules/karpathy-behavioral.md",
|
"path:user-rules/karpathy-behavioral.md",
|
||||||
]
|
]
|
||||||
|
|
||||||
[taxonomy]
|
[taxonomy]
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
name = "critic-tech-debt"
|
name = "critic-tech-debt"
|
||||||
description = "Detects dead code, TODO/FIXME, version-skew, abandoned branches, stale dependencies. Read-only."
|
description = "Detects dead code, TODO/FIXME, version-skew, abandoned branches, stale dependencies. Read-only."
|
||||||
tools = ["Glob", "Grep", "Read", "Bash"]
|
tools = ["Glob", "Grep", "Read", "Bash"]
|
||||||
model = "opus"
|
model = "sonnet"
|
||||||
substrate_role = "read-only"
|
substrate_role = "read-only"
|
||||||
|
|
||||||
role = """
|
role = """
|
||||||
|
|
@ -26,8 +26,8 @@ target = "validator"
|
||||||
trigger = "general fact-check fallback"
|
trigger = "general fact-check fallback"
|
||||||
[references]
|
[references]
|
||||||
extra = [
|
extra = [
|
||||||
"~/.claude/rules/code-style.md",
|
"path:user-rules/code-style.md",
|
||||||
"~/.claude/rules/karpathy-behavioral.md",
|
"path:user-rules/karpathy-behavioral.md",
|
||||||
]
|
]
|
||||||
|
|
||||||
[taxonomy]
|
[taxonomy]
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
name = "critic"
|
name = "critic"
|
||||||
description = "Ruthless code critic finding anti-patterns, tech debt, security issues, bugs, and performance traps. Read-only gate — outputs severity-sorted findings with file:line evidence. No fixes, only reports."
|
description = "Ruthless code critic finding anti-patterns, tech debt, security issues, bugs, and performance traps. Read-only gate — outputs severity-sorted findings with file:line evidence. No fixes, only reports."
|
||||||
tools = ["Glob", "Grep", "Read", "WebSearch"]
|
tools = ["Glob", "Grep", "Read", "WebSearch"]
|
||||||
model = "opus"
|
model = "sonnet"
|
||||||
substrate_role = "read-only"
|
substrate_role = "read-only"
|
||||||
produces_artifact = "review"
|
produces_artifact = "review"
|
||||||
|
|
||||||
|
|
@ -73,8 +73,8 @@ trigger = "anti-pattern is structural (new family, needs design review)"
|
||||||
# References (extra files beyond auto-included baseline/memory/project)
|
# References (extra files beyond auto-included baseline/memory/project)
|
||||||
[references]
|
[references]
|
||||||
extra = [
|
extra = [
|
||||||
"~/.claude/rules/debugging.md",
|
"path:user-rules/debugging.md",
|
||||||
"~/.claude/rules/code-style.md",
|
"path:user-rules/code-style.md",
|
||||||
"~/.claude/skills/architecture-rules/references/antipatterns.md",
|
"~/.claude/skills/architecture-rules/references/antipatterns.md",
|
||||||
"~/.claude/skills/architecture-rules/references/duplication.md",
|
"~/.claude/skills/architecture-rules/references/duplication.md",
|
||||||
"~/.claude/skills/architecture-rules/references/stack-compat.md",
|
"~/.claude/skills/architecture-rules/references/stack-compat.md",
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
name = "fal-ai-runner"
|
name = "fal-ai-runner"
|
||||||
description = "fal.ai image, video, and 3D generation expert. Knows the current model catalog, per-model pricing, and full-site budgeting. Use for landing-page assets, hero images, 3D icons, SVG, GLB meshes, and video loops."
|
description = "fal.ai image, video, and 3D generation expert. Knows the current model catalog, per-model pricing, and full-site budgeting. Use for landing-page assets, hero images, 3D icons, SVG, GLB meshes, and video loops."
|
||||||
tools = ["Glob", "Grep", "Read", "Edit", "Bash", "WebFetch", "Agent"]
|
tools = ["Glob", "Grep", "Read", "Edit", "Bash", "WebFetch", "Agent"]
|
||||||
model = "opus"
|
model = "sonnet"
|
||||||
substrate_role = "edit-local"
|
substrate_role = "edit-local"
|
||||||
|
|
||||||
role = """
|
role = """
|
||||||
|
|
@ -105,10 +105,10 @@ trigger = "anti-pattern sweep after batch — are prompts / generated assets con
|
||||||
# References (extra files beyond auto-included baseline/memory/project)
|
# References (extra files beyond auto-included baseline/memory/project)
|
||||||
[references]
|
[references]
|
||||||
extra = [
|
extra = [
|
||||||
"~/.claude/rules/api-cost-guard.md",
|
"path:user-rules/api-cost-guard.md",
|
||||||
"~/.claude/rules/project-cartoon-studio.md",
|
"path:user-rules/project-cartoon-studio.md",
|
||||||
"~/.claude/memory/fal-ai-models.md (canonical model + price reference)",
|
"path:user-memory/fal-ai-models.md (canonical model + price reference)",
|
||||||
"~/.claude/memory/website-creation-playbook.md (end-to-end web asset recipe)",
|
"path:user-memory/website-creation-playbook.md (end-to-end web asset recipe)",
|
||||||
"https://fal.ai/pricing (live pricing — WebFetch)",
|
"https://fal.ai/pricing (live pricing — WebFetch)",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
name = "frontend-validator"
|
name = "frontend-validator"
|
||||||
description = "Frontend continuous validator. Runs tsc --noEmit, eslint, kei-db-contract, optional visual snapshot. Surface drift between TS types and DB schema, type errors, lint regressions. Advisory by default."
|
description = "Frontend continuous validator. Runs tsc --noEmit, eslint, kei-db-contract, optional visual snapshot. Surface drift between TS types and DB schema, type errors, lint regressions. Advisory by default."
|
||||||
tools = ["Glob", "Grep", "Read", "Bash"]
|
tools = ["Glob", "Grep", "Read", "Bash"]
|
||||||
model = "opus"
|
model = "sonnet"
|
||||||
substrate_role = "edit-local"
|
substrate_role = "edit-local"
|
||||||
|
|
||||||
role = """
|
role = """
|
||||||
|
|
@ -57,8 +57,8 @@ trigger = "general fact-check fallback"
|
||||||
|
|
||||||
[references]
|
[references]
|
||||||
extra = [
|
extra = [
|
||||||
"~/.claude/rules/code-style.md",
|
"path:user-rules/code-style.md",
|
||||||
"~/.claude/rules/karpathy-behavioral.md",
|
"path:user-rules/karpathy-behavioral.md",
|
||||||
]
|
]
|
||||||
|
|
||||||
[taxonomy]
|
[taxonomy]
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
name = "infra-implementer-cicd"
|
name = "infra-implementer-cicd"
|
||||||
description = "CI/CD pipeline specialist. GitHub Actions, GitLab CI, build-and-deploy scripts. Constructor Pattern."
|
description = "CI/CD pipeline specialist. GitHub Actions, GitLab CI, build-and-deploy scripts. Constructor Pattern."
|
||||||
tools = ["Glob", "Grep", "Read", "Edit", "Write", "Bash", "Agent"]
|
tools = ["Glob", "Grep", "Read", "Edit", "Write", "Bash", "Agent"]
|
||||||
model = "opus"
|
model = "sonnet"
|
||||||
substrate_role = "edit-shared"
|
substrate_role = "edit-shared"
|
||||||
|
|
||||||
role = """
|
role = """
|
||||||
|
|
@ -30,8 +30,8 @@ target = "validator"
|
||||||
trigger = "general fact-check fallback"
|
trigger = "general fact-check fallback"
|
||||||
[references]
|
[references]
|
||||||
extra = [
|
extra = [
|
||||||
"~/.claude/rules/code-style.md",
|
"path:user-rules/code-style.md",
|
||||||
"~/.claude/rules/karpathy-behavioral.md",
|
"path:user-rules/karpathy-behavioral.md",
|
||||||
]
|
]
|
||||||
|
|
||||||
[taxonomy]
|
[taxonomy]
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
name = "infra-implementer-container"
|
name = "infra-implementer-container"
|
||||||
description = "Containerization specialist. Dockerfile, OCI images, multi-stage builds, distroless."
|
description = "Containerization specialist. Dockerfile, OCI images, multi-stage builds, distroless."
|
||||||
tools = ["Glob", "Grep", "Read", "Edit", "Write", "Bash", "Agent"]
|
tools = ["Glob", "Grep", "Read", "Edit", "Write", "Bash", "Agent"]
|
||||||
model = "opus"
|
model = "sonnet"
|
||||||
substrate_role = "edit-shared"
|
substrate_role = "edit-shared"
|
||||||
|
|
||||||
role = """
|
role = """
|
||||||
|
|
@ -30,8 +30,8 @@ target = "validator"
|
||||||
trigger = "general fact-check fallback"
|
trigger = "general fact-check fallback"
|
||||||
[references]
|
[references]
|
||||||
extra = [
|
extra = [
|
||||||
"~/.claude/rules/code-style.md",
|
"path:user-rules/code-style.md",
|
||||||
"~/.claude/rules/karpathy-behavioral.md",
|
"path:user-rules/karpathy-behavioral.md",
|
||||||
]
|
]
|
||||||
|
|
||||||
[taxonomy]
|
[taxonomy]
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
name = "infra-implementer-iac"
|
name = "infra-implementer-iac"
|
||||||
description = "Infrastructure-as-code specialist. Terraform, Pulumi, OpenTofu, CDK. Constructor Pattern (≤200 LOC per module)."
|
description = "Infrastructure-as-code specialist. Terraform, Pulumi, OpenTofu, CDK. Constructor Pattern (≤200 LOC per module)."
|
||||||
tools = ["Glob", "Grep", "Read", "Edit", "Write", "Bash", "Agent"]
|
tools = ["Glob", "Grep", "Read", "Edit", "Write", "Bash", "Agent"]
|
||||||
model = "opus"
|
model = "sonnet"
|
||||||
substrate_role = "edit-shared"
|
substrate_role = "edit-shared"
|
||||||
|
|
||||||
role = """
|
role = """
|
||||||
|
|
@ -30,8 +30,8 @@ target = "validator"
|
||||||
trigger = "general fact-check fallback"
|
trigger = "general fact-check fallback"
|
||||||
[references]
|
[references]
|
||||||
extra = [
|
extra = [
|
||||||
"~/.claude/rules/code-style.md",
|
"path:user-rules/code-style.md",
|
||||||
"~/.claude/rules/karpathy-behavioral.md",
|
"path:user-rules/karpathy-behavioral.md",
|
||||||
]
|
]
|
||||||
|
|
||||||
[taxonomy]
|
[taxonomy]
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
name = "infra-implementer-secrets"
|
name = "infra-implementer-secrets"
|
||||||
description = "Secrets management specialist. Vault integration, sops, age, env-var injection. RULE 0.8 enforcer."
|
description = "Secrets management specialist. Vault integration, sops, age, env-var injection. RULE 0.8 enforcer."
|
||||||
tools = ["Glob", "Grep", "Read", "Edit", "Write", "Bash", "Agent"]
|
tools = ["Glob", "Grep", "Read", "Edit", "Write", "Bash", "Agent"]
|
||||||
model = "opus"
|
model = "sonnet"
|
||||||
substrate_role = "edit-shared"
|
substrate_role = "edit-shared"
|
||||||
|
|
||||||
role = """
|
role = """
|
||||||
|
|
@ -30,8 +30,8 @@ target = "validator"
|
||||||
trigger = "general fact-check fallback"
|
trigger = "general fact-check fallback"
|
||||||
[references]
|
[references]
|
||||||
extra = [
|
extra = [
|
||||||
"~/.claude/rules/code-style.md",
|
"path:user-rules/code-style.md",
|
||||||
"~/.claude/rules/karpathy-behavioral.md",
|
"path:user-rules/karpathy-behavioral.md",
|
||||||
]
|
]
|
||||||
|
|
||||||
[taxonomy]
|
[taxonomy]
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
name = "infra-implementer"
|
name = "infra-implementer"
|
||||||
description = "Infrastructure code, deploys, CI/CD, secrets management, container/IaC. Per-project credential isolation, deploy-target guard enforcement, Self-Sufficiency Protocol, cost guard on paid compute."
|
description = "Infrastructure code, deploys, CI/CD, secrets management, container/IaC. Per-project credential isolation, deploy-target guard enforcement, Self-Sufficiency Protocol, cost guard on paid compute."
|
||||||
tools = ["Glob", "Grep", "Read", "Edit", "Write", "Bash", "Agent"]
|
tools = ["Glob", "Grep", "Read", "Edit", "Write", "Bash", "Agent"]
|
||||||
model = "opus"
|
model = "sonnet"
|
||||||
substrate_role = "edit-local"
|
substrate_role = "edit-local"
|
||||||
|
|
||||||
role = """
|
role = """
|
||||||
|
|
@ -94,12 +94,12 @@ trigger = "multi-service deploy topology, cross-project shared-infra redesign, s
|
||||||
|
|
||||||
[references]
|
[references]
|
||||||
extra = [
|
extra = [
|
||||||
"~/.claude/rules/security.md",
|
"path:user-rules/security.md",
|
||||||
"~/.claude/rules/self-sufficiency.md",
|
"path:user-rules/self-sufficiency.md",
|
||||||
"~/.claude/rules/api-cost-guard.md",
|
"path:user-rules/api-cost-guard.md",
|
||||||
"~/.claude/rules/git-conventions.md",
|
"path:user-rules/git-conventions.md",
|
||||||
"~/.claude/rules/dev-workflow.md",
|
"path:user-rules/dev-workflow.md",
|
||||||
"~/.claude/memory/security-restricted-projects.md",
|
"path:user-memory/security-restricted-projects.md",
|
||||||
"MEMORY.md → Compute Cost Incident (2026-02-26): $98.78 Modal overrun — no dashboard check, unverified prices.",
|
"MEMORY.md → Compute Cost Incident (2026-02-26): $98.78 Modal overrun — no dashboard check, unverified prices.",
|
||||||
"MEMORY.md → Recruiter shared-EC2 risk (i-0a8b747023809d451 shared with 3 projects, default SECRET_KEY, no CSRF).",
|
"MEMORY.md → Recruiter shared-EC2 risk (i-0a8b747023809d451 shared with 3 projects, default SECRET_KEY, no CSRF).",
|
||||||
"MEMORY.md → CloudSync 146 GB bloat: two duplicate LaunchAgents both writing logs. Scan for duplicates before adding infra.",
|
"MEMORY.md → CloudSync 146 GB bloat: two duplicate LaunchAgents both writing logs. Scan for duplicates before adding infra.",
|
||||||
|
|
|
||||||
|
|
@ -108,13 +108,13 @@ trigger = "multi-node multi-node composition design, experiment matrix layout, b
|
||||||
|
|
||||||
[references]
|
[references]
|
||||||
extra = [
|
extra = [
|
||||||
"~/.claude/rules/ml-protocol.md",
|
"path:user-rules/ml-protocol.md",
|
||||||
"~/.claude/rules/specialized-node-training.md",
|
"path:user-rules/specialized-node-training.md",
|
||||||
"~/.claude/rules/api-cost-guard.md",
|
"path:user-rules/api-cost-guard.md",
|
||||||
"~/.claude/rules/observable-classification.md",
|
"path:user-rules/observable-classification.md",
|
||||||
"~/.claude/rules/manifold-tangent-sanity.md",
|
"path:user-rules/manifold-tangent-sanity.md",
|
||||||
"~/.claude/rules/no-downgrade-constructive.md",
|
"path:user-rules/no-downgrade-constructive.md",
|
||||||
"~/.claude/memory/wrong-paths-specialized-ml.md",
|
"path:user-memory/wrong-paths-specialized-ml.md",
|
||||||
"MEMORY.md → Compute Cost Incident (2026-02-26): promised $27, spent $98.78 on Modal. NEVER AGAIN.",
|
"MEMORY.md → Compute Cost Incident (2026-02-26): promised $27, spent $98.78 on Modal. NEVER AGAIN.",
|
||||||
"MEMORY.md → Architecture Overlay Incident: model_brain.py 227→354 LOC from audit fixes. No Patching.",
|
"MEMORY.md → Architecture Overlay Incident: model_brain.py 227→354 LOC from audit fixes. No Patching.",
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -96,12 +96,12 @@ trigger = "question is about ML-system architecture (node graph, data-flow, modu
|
||||||
# References (extra files beyond auto-included baseline/memory/project)
|
# References (extra files beyond auto-included baseline/memory/project)
|
||||||
[references]
|
[references]
|
||||||
extra = [
|
extra = [
|
||||||
"~/.claude/rules/ml-protocol.md",
|
"path:user-rules/ml-protocol.md",
|
||||||
"~/.claude/rules/specialized-node-training.md",
|
"path:user-rules/specialized-node-training.md",
|
||||||
"~/.claude/rules/observable-classification.md",
|
"path:user-rules/observable-classification.md",
|
||||||
"~/.claude/rules/api-cost-guard.md",
|
"path:user-rules/api-cost-guard.md",
|
||||||
"~/.claude/rules/no-downgrade-constructive.md",
|
"path:user-rules/no-downgrade-constructive.md",
|
||||||
"~/.claude/memory/wrong-paths-specialized-ml.md",
|
"path:user-memory/wrong-paths-specialized-ml.md",
|
||||||
]
|
]
|
||||||
|
|
||||||
[taxonomy]
|
[taxonomy]
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
name = "modal-runner"
|
name = "modal-runner"
|
||||||
description = "Modal compute orchestrator. Pre-launch cost estimation, GPU compatibility check, single-variant verify, observability-first, and a hard anti-stop guard against stopping running training. Use for any Modal app launch, batch spawn, or job inspection."
|
description = "Modal compute orchestrator. Pre-launch cost estimation, GPU compatibility check, single-variant verify, observability-first, and a hard anti-stop guard against stopping running training. Use for any Modal app launch, batch spawn, or job inspection."
|
||||||
tools = ["Glob", "Grep", "Read", "Edit", "Write", "Bash", "Agent"]
|
tools = ["Glob", "Grep", "Read", "Edit", "Write", "Bash", "Agent"]
|
||||||
model = "opus"
|
model = "sonnet"
|
||||||
substrate_role = "edit-local"
|
substrate_role = "edit-local"
|
||||||
|
|
||||||
role = """
|
role = """
|
||||||
|
|
@ -100,9 +100,9 @@ trigger = "reported metrics must be verified before saving to `memory/{project}.
|
||||||
# References (extra files beyond auto-included baseline/memory/project)
|
# References (extra files beyond auto-included baseline/memory/project)
|
||||||
[references]
|
[references]
|
||||||
extra = [
|
extra = [
|
||||||
"~/.claude/rules/api-cost-guard.md",
|
"path:user-rules/api-cost-guard.md",
|
||||||
"~/.claude/rules/ml-protocol.md",
|
"path:user-rules/ml-protocol.md",
|
||||||
"~/.claude/memory/MEMORY.md (Compute Cost Incident 2026-02-26)",
|
"path:user-memory/MEMORY.md (Compute Cost Incident 2026-02-26)",
|
||||||
"https://modal.com/pricing (live pricing — WebFetch or user browser)",
|
"https://modal.com/pricing (live pricing — WebFetch or user browser)",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
name = "researcher-code"
|
name = "researcher-code"
|
||||||
description = "Codebase research specialist. Glob / Grep / Read only. E1-E6 grading."
|
description = "Codebase research specialist. Glob / Grep / Read only. E1-E6 grading."
|
||||||
tools = ["Glob", "Grep", "Read"]
|
tools = ["Glob", "Grep", "Read"]
|
||||||
model = "opus"
|
model = "sonnet"
|
||||||
substrate_role = "read-only"
|
substrate_role = "read-only"
|
||||||
|
|
||||||
role = """
|
role = """
|
||||||
|
|
@ -26,8 +26,8 @@ target = "validator"
|
||||||
trigger = "general fact-check fallback"
|
trigger = "general fact-check fallback"
|
||||||
[references]
|
[references]
|
||||||
extra = [
|
extra = [
|
||||||
"~/.claude/rules/code-style.md",
|
"path:user-rules/code-style.md",
|
||||||
"~/.claude/rules/karpathy-behavioral.md",
|
"path:user-rules/karpathy-behavioral.md",
|
||||||
]
|
]
|
||||||
|
|
||||||
[taxonomy]
|
[taxonomy]
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
name = "researcher-hybrid"
|
name = "researcher-hybrid"
|
||||||
description = "Hybrid web+code research orchestrator. Routes to researcher-web and researcher-code in parallel."
|
description = "Hybrid web+code research orchestrator. Routes to researcher-web and researcher-code in parallel."
|
||||||
tools = ["Glob", "Grep", "Read", "WebFetch", "WebSearch", "Agent"]
|
tools = ["Glob", "Grep", "Read", "WebFetch", "WebSearch", "Agent"]
|
||||||
model = "opus"
|
model = "sonnet"
|
||||||
substrate_role = "read-only"
|
substrate_role = "read-only"
|
||||||
|
|
||||||
role = """
|
role = """
|
||||||
|
|
@ -26,8 +26,8 @@ target = "validator"
|
||||||
trigger = "general fact-check fallback"
|
trigger = "general fact-check fallback"
|
||||||
[references]
|
[references]
|
||||||
extra = [
|
extra = [
|
||||||
"~/.claude/rules/code-style.md",
|
"path:user-rules/code-style.md",
|
||||||
"~/.claude/rules/karpathy-behavioral.md",
|
"path:user-rules/karpathy-behavioral.md",
|
||||||
]
|
]
|
||||||
|
|
||||||
[taxonomy]
|
[taxonomy]
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
name = "researcher-web"
|
name = "researcher-web"
|
||||||
description = "Web research specialist. WebFetch / WebSearch only. E1-E6 grading."
|
description = "Web research specialist. WebFetch / WebSearch only. E1-E6 grading."
|
||||||
tools = ["WebFetch", "WebSearch"]
|
tools = ["WebFetch", "WebSearch"]
|
||||||
model = "opus"
|
model = "sonnet"
|
||||||
substrate_role = "read-only"
|
substrate_role = "read-only"
|
||||||
|
|
||||||
role = """
|
role = """
|
||||||
|
|
@ -26,8 +26,8 @@ target = "validator"
|
||||||
trigger = "general fact-check fallback"
|
trigger = "general fact-check fallback"
|
||||||
[references]
|
[references]
|
||||||
extra = [
|
extra = [
|
||||||
"~/.claude/rules/code-style.md",
|
"path:user-rules/code-style.md",
|
||||||
"~/.claude/rules/karpathy-behavioral.md",
|
"path:user-rules/karpathy-behavioral.md",
|
||||||
]
|
]
|
||||||
|
|
||||||
[taxonomy]
|
[taxonomy]
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
name = "researcher"
|
name = "researcher"
|
||||||
description = "Generic web + codebase research with 3 modes (web / code / hybrid). Returns Evidence-Graded findings. Read-only. Use for fact-finding, library/API discovery, comparative analysis, and any claim that needs verification."
|
description = "Generic web + codebase research with 3 modes (web / code / hybrid). Returns Evidence-Graded findings. Read-only. Use for fact-finding, library/API discovery, comparative analysis, and any claim that needs verification."
|
||||||
tools = ["Glob", "Grep", "Read", "WebFetch", "WebSearch", "Agent"]
|
tools = ["Glob", "Grep", "Read", "WebFetch", "WebSearch", "Agent"]
|
||||||
model = "opus"
|
model = "sonnet"
|
||||||
substrate_role = "read-only"
|
substrate_role = "read-only"
|
||||||
|
|
||||||
role = """
|
role = """
|
||||||
|
|
@ -82,8 +82,8 @@ trigger = "findings suggest anti-pattern sweep or Constructor-Pattern violation
|
||||||
# References (extra files beyond auto-included baseline/memory/project)
|
# References (extra files beyond auto-included baseline/memory/project)
|
||||||
[references]
|
[references]
|
||||||
extra = [
|
extra = [
|
||||||
"~/.claude/rules/debugging.md",
|
"path:user-rules/debugging.md",
|
||||||
"~/.claude/rules/no-downgrade-constructive.md",
|
"path:user-rules/no-downgrade-constructive.md",
|
||||||
"~/.claude/agents/validator.md",
|
"~/.claude/agents/validator.md",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
name = "security-auditor-differential"
|
name = "security-auditor-differential"
|
||||||
description = "9-point differential security review. Auth bypass, injection, deserialization, race conditions. Read-only."
|
description = "9-point differential security review. Auth bypass, injection, deserialization, race conditions. Read-only."
|
||||||
tools = ["Glob", "Grep", "Read", "WebFetch", "WebSearch"]
|
tools = ["Glob", "Grep", "Read", "WebFetch", "WebSearch"]
|
||||||
model = "opus"
|
model = "sonnet"
|
||||||
substrate_role = "auditor"
|
substrate_role = "auditor"
|
||||||
|
|
||||||
role = """
|
role = """
|
||||||
|
|
@ -26,8 +26,8 @@ target = "validator"
|
||||||
trigger = "general fact-check fallback"
|
trigger = "general fact-check fallback"
|
||||||
[references]
|
[references]
|
||||||
extra = [
|
extra = [
|
||||||
"~/.claude/rules/code-style.md",
|
"path:user-rules/code-style.md",
|
||||||
"~/.claude/rules/karpathy-behavioral.md",
|
"path:user-rules/karpathy-behavioral.md",
|
||||||
]
|
]
|
||||||
|
|
||||||
[taxonomy]
|
[taxonomy]
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
name = "security-auditor-supply-chain"
|
name = "security-auditor-supply-chain"
|
||||||
description = "Supply-chain audit on new dependencies: maintainers, CVE history, transitive deps, native code. Read-only."
|
description = "Supply-chain audit on new dependencies: maintainers, CVE history, transitive deps, native code. Read-only."
|
||||||
tools = ["Glob", "Grep", "Read", "Bash", "WebFetch", "WebSearch"]
|
tools = ["Glob", "Grep", "Read", "Bash", "WebFetch", "WebSearch"]
|
||||||
model = "opus"
|
model = "sonnet"
|
||||||
substrate_role = "auditor"
|
substrate_role = "auditor"
|
||||||
|
|
||||||
role = """
|
role = """
|
||||||
|
|
@ -26,8 +26,8 @@ target = "validator"
|
||||||
trigger = "general fact-check fallback"
|
trigger = "general fact-check fallback"
|
||||||
[references]
|
[references]
|
||||||
extra = [
|
extra = [
|
||||||
"~/.claude/rules/code-style.md",
|
"path:user-rules/code-style.md",
|
||||||
"~/.claude/rules/karpathy-behavioral.md",
|
"path:user-rules/karpathy-behavioral.md",
|
||||||
]
|
]
|
||||||
|
|
||||||
[taxonomy]
|
[taxonomy]
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
name = "security-auditor-variant"
|
name = "security-auditor-variant"
|
||||||
description = "Variant analysis after a vulnerability is found. Greps codebase for the same pattern. Read-only."
|
description = "Variant analysis after a vulnerability is found. Greps codebase for the same pattern. Read-only."
|
||||||
tools = ["Glob", "Grep", "Read"]
|
tools = ["Glob", "Grep", "Read"]
|
||||||
model = "opus"
|
model = "sonnet"
|
||||||
substrate_role = "auditor"
|
substrate_role = "auditor"
|
||||||
|
|
||||||
role = """
|
role = """
|
||||||
|
|
@ -26,8 +26,8 @@ target = "validator"
|
||||||
trigger = "general fact-check fallback"
|
trigger = "general fact-check fallback"
|
||||||
[references]
|
[references]
|
||||||
extra = [
|
extra = [
|
||||||
"~/.claude/rules/code-style.md",
|
"path:user-rules/code-style.md",
|
||||||
"~/.claude/rules/karpathy-behavioral.md",
|
"path:user-rules/karpathy-behavioral.md",
|
||||||
]
|
]
|
||||||
|
|
||||||
[taxonomy]
|
[taxonomy]
|
||||||
|
|
|
||||||
|
|
@ -76,8 +76,8 @@ trigger = "vulnerability is architectural (auth boundary misplaced, SSoT violati
|
||||||
# References (extra files beyond auto-included baseline/memory/project)
|
# References (extra files beyond auto-included baseline/memory/project)
|
||||||
[references]
|
[references]
|
||||||
extra = [
|
extra = [
|
||||||
"~/.claude/rules/debugging.md",
|
"path:user-rules/debugging.md",
|
||||||
"~/.claude/rules/security.md",
|
"path:user-rules/security.md",
|
||||||
"https://owasp.org/Top10/",
|
"https://owasp.org/Top10/",
|
||||||
"https://cwe.mitre.org/top25/",
|
"https://cwe.mitre.org/top25/",
|
||||||
"https://osv.dev/",
|
"https://osv.dev/",
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
name = "validator-api"
|
name = "validator-api"
|
||||||
description = "Verifies API existence and signatures. Reads docs, greps source, fetches OpenAPI / vendor reference. Read-only."
|
description = "Verifies API existence and signatures. Reads docs, greps source, fetches OpenAPI / vendor reference. Read-only."
|
||||||
tools = ["Glob", "Grep", "Read", "WebFetch", "WebSearch"]
|
tools = ["Glob", "Grep", "Read", "WebFetch", "WebSearch"]
|
||||||
model = "opus"
|
model = "sonnet"
|
||||||
substrate_role = "read-only"
|
substrate_role = "read-only"
|
||||||
|
|
||||||
role = """
|
role = """
|
||||||
|
|
@ -26,8 +26,8 @@ target = "validator"
|
||||||
trigger = "general fact-check fallback"
|
trigger = "general fact-check fallback"
|
||||||
[references]
|
[references]
|
||||||
extra = [
|
extra = [
|
||||||
"~/.claude/rules/code-style.md",
|
"path:user-rules/code-style.md",
|
||||||
"~/.claude/rules/karpathy-behavioral.md",
|
"path:user-rules/karpathy-behavioral.md",
|
||||||
]
|
]
|
||||||
|
|
||||||
[taxonomy]
|
[taxonomy]
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
name = "validator-benchmark"
|
name = "validator-benchmark"
|
||||||
description = "Verifies external benchmark claims (p50/p95/throughput). Read-only."
|
description = "Verifies external benchmark claims (p50/p95/throughput). Read-only."
|
||||||
tools = ["Glob", "Grep", "Read", "WebFetch", "WebSearch"]
|
tools = ["Glob", "Grep", "Read", "WebFetch", "WebSearch"]
|
||||||
model = "opus"
|
model = "sonnet"
|
||||||
substrate_role = "read-only"
|
substrate_role = "read-only"
|
||||||
|
|
||||||
role = """
|
role = """
|
||||||
|
|
@ -26,8 +26,8 @@ target = "validator"
|
||||||
trigger = "general fact-check fallback"
|
trigger = "general fact-check fallback"
|
||||||
[references]
|
[references]
|
||||||
extra = [
|
extra = [
|
||||||
"~/.claude/rules/code-style.md",
|
"path:user-rules/code-style.md",
|
||||||
"~/.claude/rules/karpathy-behavioral.md",
|
"path:user-rules/karpathy-behavioral.md",
|
||||||
]
|
]
|
||||||
|
|
||||||
[taxonomy]
|
[taxonomy]
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
name = "validator-code-reality"
|
name = "validator-code-reality"
|
||||||
description = "Verifies behavioural claims against running code. Reads tests, traces, recent runs. Read-only."
|
description = "Verifies behavioural claims against running code. Reads tests, traces, recent runs. Read-only."
|
||||||
tools = ["Glob", "Grep", "Read", "Bash"]
|
tools = ["Glob", "Grep", "Read", "Bash"]
|
||||||
model = "opus"
|
model = "sonnet"
|
||||||
substrate_role = "read-only"
|
substrate_role = "read-only"
|
||||||
|
|
||||||
role = """
|
role = """
|
||||||
|
|
@ -26,8 +26,8 @@ target = "validator"
|
||||||
trigger = "general fact-check fallback"
|
trigger = "general fact-check fallback"
|
||||||
[references]
|
[references]
|
||||||
extra = [
|
extra = [
|
||||||
"~/.claude/rules/code-style.md",
|
"path:user-rules/code-style.md",
|
||||||
"~/.claude/rules/karpathy-behavioral.md",
|
"path:user-rules/karpathy-behavioral.md",
|
||||||
]
|
]
|
||||||
|
|
||||||
[taxonomy]
|
[taxonomy]
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
name = "validator-doc"
|
name = "validator-doc"
|
||||||
description = "Verifies documentation claims against code reality. Read-only."
|
description = "Verifies documentation claims against code reality. Read-only."
|
||||||
tools = ["Glob", "Grep", "Read", "WebFetch"]
|
tools = ["Glob", "Grep", "Read", "WebFetch"]
|
||||||
model = "opus"
|
model = "sonnet"
|
||||||
substrate_role = "read-only"
|
substrate_role = "read-only"
|
||||||
|
|
||||||
role = """
|
role = """
|
||||||
|
|
@ -26,8 +26,8 @@ target = "validator"
|
||||||
trigger = "general fact-check fallback"
|
trigger = "general fact-check fallback"
|
||||||
[references]
|
[references]
|
||||||
extra = [
|
extra = [
|
||||||
"~/.claude/rules/code-style.md",
|
"path:user-rules/code-style.md",
|
||||||
"~/.claude/rules/karpathy-behavioral.md",
|
"path:user-rules/karpathy-behavioral.md",
|
||||||
]
|
]
|
||||||
|
|
||||||
[taxonomy]
|
[taxonomy]
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
name = "validator-version"
|
name = "validator-version"
|
||||||
description = "Verifies version compatibility (semver, MSRV, transitive deps). Read-only."
|
description = "Verifies version compatibility (semver, MSRV, transitive deps). Read-only."
|
||||||
tools = ["Glob", "Grep", "Read", "Bash", "WebFetch", "WebSearch"]
|
tools = ["Glob", "Grep", "Read", "Bash", "WebFetch", "WebSearch"]
|
||||||
model = "opus"
|
model = "sonnet"
|
||||||
substrate_role = "read-only"
|
substrate_role = "read-only"
|
||||||
|
|
||||||
role = """
|
role = """
|
||||||
|
|
@ -26,8 +26,8 @@ target = "validator"
|
||||||
trigger = "general fact-check fallback"
|
trigger = "general fact-check fallback"
|
||||||
[references]
|
[references]
|
||||||
extra = [
|
extra = [
|
||||||
"~/.claude/rules/code-style.md",
|
"path:user-rules/code-style.md",
|
||||||
"~/.claude/rules/karpathy-behavioral.md",
|
"path:user-rules/karpathy-behavioral.md",
|
||||||
]
|
]
|
||||||
|
|
||||||
[taxonomy]
|
[taxonomy]
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
name = "validator"
|
name = "validator"
|
||||||
description = "RULE 0.4 enforcement gate — fact-checker and hallucination detector. Verifies API existence, version compatibility, documentation claims, code reality, and external benchmarks. Read-only — emits VERIFIED / UNVERIFIED / FALSE / PARTIALLY TRUE per claim."
|
description = "RULE 0.4 enforcement gate — fact-checker and hallucination detector. Verifies API existence, version compatibility, documentation claims, code reality, and external benchmarks. Read-only — emits VERIFIED / UNVERIFIED / FALSE / PARTIALLY TRUE per claim."
|
||||||
tools = ["Glob", "Grep", "Read", "WebFetch", "WebSearch"]
|
tools = ["Glob", "Grep", "Read", "WebFetch", "WebSearch"]
|
||||||
model = "opus"
|
model = "sonnet"
|
||||||
substrate_role = "read-only"
|
substrate_role = "read-only"
|
||||||
produces_artifact = "review"
|
produces_artifact = "review"
|
||||||
|
|
||||||
|
|
@ -80,8 +80,8 @@ trigger = "FALSE claim reveals broader pattern of unverified assertions in codeb
|
||||||
# References (extra files beyond auto-included baseline/memory/project)
|
# References (extra files beyond auto-included baseline/memory/project)
|
||||||
[references]
|
[references]
|
||||||
extra = [
|
extra = [
|
||||||
"~/.claude/rules/debugging.md",
|
"path:user-rules/debugging.md",
|
||||||
"~/.claude/rules/no-downgrade-constructive.md",
|
"path:user-rules/no-downgrade-constructive.md",
|
||||||
]
|
]
|
||||||
|
|
||||||
[taxonomy]
|
[taxonomy]
|
||||||
|
|
|
||||||
|
|
@ -253,3 +253,219 @@ output_per_mtok_micro = 0
|
||||||
status = "verified"
|
status = "verified"
|
||||||
source_url = "https://ollama.com/library/llama3"
|
source_url = "https://ollama.com/library/llama3"
|
||||||
verified_at = "2026-04-28"
|
verified_at = "2026-04-28"
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# Google Gemini image-gen (nano-banana CLI) — verified 2026-05-01
|
||||||
|
# Source: https://fal.ai/models/fal-ai/flux-2-pro (fal.ai catalog)
|
||||||
|
# https://fal.ai/pricing
|
||||||
|
# SCHEMA NOTE: provider="local" is a placeholder — the Provider
|
||||||
|
# enum does not yet include "google". Follow-up: add Provider::Google
|
||||||
|
# and Provider::Fal and Provider::Elevenlabs to model.rs + enum parse().
|
||||||
|
# capabilities=[] because Capability enum has no image-gen / video-gen
|
||||||
|
# variants yet. Follow-up: extend Capability enum with generation caps.
|
||||||
|
# Per-image cost stored in output_per_mtok_micro (1 image = 1 unit).
|
||||||
|
# Unit semantics noted in the notes field (loader does not yet parse "unit").
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
[[models]]
|
||||||
|
id = "gemini-3-1-flash-image"
|
||||||
|
provider = "local"
|
||||||
|
display_name = "Gemini 3.1 Flash Image (Nano Banana 2)"
|
||||||
|
context_tokens = 0
|
||||||
|
capabilities = ["image-gen", "text-to-image"]
|
||||||
|
status = "active"
|
||||||
|
role_tags = ["image-cheap", "image-gen"]
|
||||||
|
fallback = ""
|
||||||
|
notes = "Google Gemini Flash image-gen consumed via nano-banana CLI. Real provider: google. Per-image cost; 1 unit = 1 image. output_per_mtok_micro stores per-image micro-cents. Pricing unverified on public page — nanobanana aggregator lists $0.0398/image via fal.ai."
|
||||||
|
|
||||||
|
[models.pricing]
|
||||||
|
input_per_mtok_micro = 0
|
||||||
|
output_per_mtok_micro = 3980000
|
||||||
|
status = "needs-verification"
|
||||||
|
source_url = "https://fal.ai/pricing"
|
||||||
|
verified_at = "2026-05-01"
|
||||||
|
|
||||||
|
[[models]]
|
||||||
|
id = "gemini-3-pro-image"
|
||||||
|
provider = "local"
|
||||||
|
display_name = "Gemini 3 Pro Image (Nano Banana Pro)"
|
||||||
|
context_tokens = 0
|
||||||
|
capabilities = ["image-gen", "text-to-image", "image-edit"]
|
||||||
|
status = "active"
|
||||||
|
role_tags = ["image-flagship", "image-gen"]
|
||||||
|
fallback = "gemini-3-1-flash-image"
|
||||||
|
notes = "Google Gemini Pro image-gen consumed via nano-banana CLI. Real provider: google. Per-image cost; 1 unit = 1 image. output_per_mtok_micro stores per-image micro-cents. Pricing not on public page — marked needs-verification."
|
||||||
|
|
||||||
|
[models.pricing]
|
||||||
|
input_per_mtok_micro = 0
|
||||||
|
output_per_mtok_micro = 0
|
||||||
|
status = "needs-verification"
|
||||||
|
source_url = "https://fal.ai/pricing"
|
||||||
|
verified_at = "2026-05-01"
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# fal.ai generation models (image + video) — verified 2026-05-01
|
||||||
|
# Source: https://fal.ai/models/fal-ai/flux-2-pro
|
||||||
|
# https://fal.ai/models/fal-ai/flux-pro/v1.1
|
||||||
|
# https://fal.ai/models/fal-ai/kling-video/o3/4k/text-to-video
|
||||||
|
# https://fal.ai/models/fal-ai/kling-video/o3/standard/image-to-video
|
||||||
|
# https://fal.ai/models/fal-ai/veo3
|
||||||
|
# https://fal.ai/models/fal-ai/ideogram/v3
|
||||||
|
# https://fal.ai/models/fal-ai/recraft-v3
|
||||||
|
# SCHEMA NOTE: provider="local" placeholder (real provider: fal).
|
||||||
|
# capabilities=[] placeholder (enum lacks image-gen/video-gen/etc).
|
||||||
|
# Image pricing: output_per_mtok_micro = per-image micro-cents (1 unit = 1 image).
|
||||||
|
# Video pricing: output_per_mtok_micro = per-second micro-cents (1 unit = 1 second).
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
[[models]]
|
||||||
|
id = "flux-2-pro"
|
||||||
|
provider = "local"
|
||||||
|
display_name = "FLUX.2 [pro] Text to Image"
|
||||||
|
context_tokens = 0
|
||||||
|
capabilities = ["image-gen", "text-to-image"]
|
||||||
|
status = "active"
|
||||||
|
role_tags = ["image-flagship", "image-gen"]
|
||||||
|
fallback = "flux-pro-1-1"
|
||||||
|
notes = "fal.ai FLUX.2 [pro]. ZERO-CONFIG: no guidance_scale parameter (model handles internally). Per-megapixel billing: $0.03 first MP + $0.015 per extra MP. 1024x1024 = $0.03, 1920x1080 = $0.045. output_per_mtok_micro = 3000000 (base 1MP price). Real provider: fal."
|
||||||
|
|
||||||
|
[models.pricing]
|
||||||
|
input_per_mtok_micro = 0
|
||||||
|
output_per_mtok_micro = 3000000
|
||||||
|
status = "verified"
|
||||||
|
source_url = "https://fal.ai/models/fal-ai/flux-2-pro"
|
||||||
|
verified_at = "2026-05-01"
|
||||||
|
|
||||||
|
[[models]]
|
||||||
|
id = "flux-pro-1-1"
|
||||||
|
provider = "local"
|
||||||
|
display_name = "FLUX.1 [pro] v1.1 Text to Image"
|
||||||
|
context_tokens = 0
|
||||||
|
capabilities = ["image-gen", "text-to-image"]
|
||||||
|
status = "active"
|
||||||
|
role_tags = ["image-flagship", "image-gen"]
|
||||||
|
fallback = ""
|
||||||
|
notes = "fal.ai FLUX Pro 1.1. Per-megapixel billing: $0.04/MP rounded up. Fallback for flux-2-pro. output_per_mtok_micro = 4000000 (1MP base). Real provider: fal."
|
||||||
|
|
||||||
|
[models.pricing]
|
||||||
|
input_per_mtok_micro = 0
|
||||||
|
output_per_mtok_micro = 4000000
|
||||||
|
status = "verified"
|
||||||
|
source_url = "https://fal.ai/models/fal-ai/flux-pro/v1.1"
|
||||||
|
verified_at = "2026-05-01"
|
||||||
|
|
||||||
|
[[models]]
|
||||||
|
id = "kling-o3"
|
||||||
|
provider = "local"
|
||||||
|
display_name = "Kling O3 4K Text/Image to Video"
|
||||||
|
context_tokens = 0
|
||||||
|
capabilities = ["video-gen", "text-to-video", "image-to-video"]
|
||||||
|
status = "active"
|
||||||
|
role_tags = ["video-gen"]
|
||||||
|
fallback = ""
|
||||||
|
notes = "fal.ai Kling O3. 4K video generation. Per-second cost: $0.42/s (audio off). Durations 3-15s; default 5s (=$2.10). 2500-char prompt limit (O3 hard limit). Supports elements + voice_ids simultaneously. output_per_mtok_micro = 42000000 (per-second micro-cents). Real provider: fal."
|
||||||
|
|
||||||
|
[models.pricing]
|
||||||
|
input_per_mtok_micro = 0
|
||||||
|
output_per_mtok_micro = 42000000
|
||||||
|
status = "verified"
|
||||||
|
source_url = "https://fal.ai/models/fal-ai/kling-video/o3/4k/text-to-video"
|
||||||
|
verified_at = "2026-05-01"
|
||||||
|
|
||||||
|
[[models]]
|
||||||
|
id = "veo-3"
|
||||||
|
provider = "local"
|
||||||
|
display_name = "Google Veo 3 (via fal.ai)"
|
||||||
|
context_tokens = 0
|
||||||
|
capabilities = ["video-gen", "text-to-video"]
|
||||||
|
status = "active"
|
||||||
|
role_tags = ["video-gen"]
|
||||||
|
fallback = "kling-o3"
|
||||||
|
notes = "fal.ai Google Veo 3 partner model. Per-second cost: $0.50/s (audio off) or $0.75/s (audio on). Fast tier: $0.25/s (audio off) or $0.40/s (audio on). output_per_mtok_micro = 50000000 (standard audio-off). Real provider: fal/google."
|
||||||
|
|
||||||
|
[models.pricing]
|
||||||
|
input_per_mtok_micro = 0
|
||||||
|
output_per_mtok_micro = 50000000
|
||||||
|
status = "verified"
|
||||||
|
source_url = "https://fal.ai/models/fal-ai/veo3"
|
||||||
|
verified_at = "2026-05-01"
|
||||||
|
|
||||||
|
[[models]]
|
||||||
|
id = "ideogram-v3"
|
||||||
|
provider = "local"
|
||||||
|
display_name = "Ideogram V3 Text to Image"
|
||||||
|
context_tokens = 0
|
||||||
|
capabilities = ["image-gen", "text-to-image", "image-edit"]
|
||||||
|
status = "active"
|
||||||
|
role_tags = ["image-flagship", "image-gen"]
|
||||||
|
fallback = ""
|
||||||
|
notes = "fal.ai Ideogram V3. Per-image tiered: $0.03 TURBO / $0.06 BALANCED / $0.09 QUALITY. Exceptional text/typography rendering. output_per_mtok_micro = 6000000 (BALANCED tier). Real provider: fal."
|
||||||
|
|
||||||
|
[models.pricing]
|
||||||
|
input_per_mtok_micro = 0
|
||||||
|
output_per_mtok_micro = 6000000
|
||||||
|
status = "verified"
|
||||||
|
source_url = "https://fal.ai/models/fal-ai/ideogram/v3"
|
||||||
|
verified_at = "2026-05-01"
|
||||||
|
|
||||||
|
[[models]]
|
||||||
|
id = "recraft-v3"
|
||||||
|
provider = "local"
|
||||||
|
display_name = "Recraft V3 Text to Image / Vector"
|
||||||
|
context_tokens = 0
|
||||||
|
capabilities = ["image-gen", "text-to-image", "image-edit"]
|
||||||
|
status = "active"
|
||||||
|
role_tags = ["image-cheap", "image-gen"]
|
||||||
|
fallback = ""
|
||||||
|
notes = "fal.ai Recraft V3. Per-image: $0.04 (raster) or $0.08 (vector_illustration style). Styles: realistic_image, digital_illustration, vector_illustration. Strong text rendering. output_per_mtok_micro = 4000000 (raster base). Real provider: fal."
|
||||||
|
|
||||||
|
[models.pricing]
|
||||||
|
input_per_mtok_micro = 0
|
||||||
|
output_per_mtok_micro = 4000000
|
||||||
|
status = "verified"
|
||||||
|
source_url = "https://fal.ai/models/fal-ai/recraft-v3"
|
||||||
|
verified_at = "2026-05-01"
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# ElevenLabs voice generation — verified 2026-05-01
|
||||||
|
# Source: https://elevenlabs.io/pricing/api
|
||||||
|
# SCHEMA NOTE: provider="local" placeholder (real provider: elevenlabs).
|
||||||
|
# Voice pricing: output_per_mtok_micro = per-1k-char micro-cents
|
||||||
|
# (1 unit = 1000 characters). input_per_mtok_micro = 0.
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
[[models]]
|
||||||
|
id = "elevenlabs-v3"
|
||||||
|
provider = "local"
|
||||||
|
display_name = "ElevenLabs Turbo v3 (Flash)"
|
||||||
|
context_tokens = 0
|
||||||
|
capabilities = ["voice-gen", "text-to-speech", "voice-clone"]
|
||||||
|
status = "active"
|
||||||
|
role_tags = ["voice-gen"]
|
||||||
|
fallback = "elevenlabs-multilingual-v2"
|
||||||
|
notes = "ElevenLabs high-quality voice model. Per-1k-chars: $0.10. Low latency ~250-300ms. Supports 32 languages. 40k char limit per request. output_per_mtok_micro = 10000000 (per-1k-chars micro-cents). Real provider: elevenlabs. ElevenLabs 3-step pattern: designVoice -> createVoice -> TTS."
|
||||||
|
|
||||||
|
[models.pricing]
|
||||||
|
input_per_mtok_micro = 0
|
||||||
|
output_per_mtok_micro = 10000000
|
||||||
|
status = "verified"
|
||||||
|
source_url = "https://elevenlabs.io/pricing/api"
|
||||||
|
verified_at = "2026-05-01"
|
||||||
|
|
||||||
|
[[models]]
|
||||||
|
id = "elevenlabs-multilingual-v2"
|
||||||
|
provider = "local"
|
||||||
|
display_name = "ElevenLabs Multilingual v2"
|
||||||
|
context_tokens = 0
|
||||||
|
capabilities = ["voice-gen", "text-to-speech", "voice-clone"]
|
||||||
|
status = "active"
|
||||||
|
role_tags = ["voice-gen"]
|
||||||
|
fallback = ""
|
||||||
|
notes = "ElevenLabs multilingual voice model (fallback for v3). Per-1k-chars: $0.10. Same pricing tier as v3. Supports 32 languages. output_per_mtok_micro = 10000000. Real provider: elevenlabs."
|
||||||
|
|
||||||
|
[models.pricing]
|
||||||
|
input_per_mtok_micro = 0
|
||||||
|
output_per_mtok_micro = 10000000
|
||||||
|
status = "verified"
|
||||||
|
source_url = "https://elevenlabs.io/pricing/api"
|
||||||
|
verified_at = "2026-05-01"
|
||||||
|
|
|
||||||
|
|
@ -59,6 +59,14 @@ pub enum Provider {
|
||||||
Mistral,
|
Mistral,
|
||||||
Deepseek,
|
Deepseek,
|
||||||
Local,
|
Local,
|
||||||
|
/// Google: Gemini text-LLM family + image generation (nano-banana CLI
|
||||||
|
/// consumes Gemini 3.1 Flash Image / Gemini 3 Pro Image).
|
||||||
|
Google,
|
||||||
|
/// fal.ai — image / video / 3D generation aggregator. Hosts Flux,
|
||||||
|
/// Kling O3, Veo 3, Ideogram, Recraft, etc.
|
||||||
|
Fal,
|
||||||
|
/// ElevenLabs — text-to-speech and voice cloning.
|
||||||
|
Elevenlabs,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Provider {
|
impl Provider {
|
||||||
|
|
@ -70,6 +78,9 @@ impl Provider {
|
||||||
Provider::Mistral => "mistral",
|
Provider::Mistral => "mistral",
|
||||||
Provider::Deepseek => "deepseek",
|
Provider::Deepseek => "deepseek",
|
||||||
Provider::Local => "local",
|
Provider::Local => "local",
|
||||||
|
Provider::Google => "google",
|
||||||
|
Provider::Fal => "fal",
|
||||||
|
Provider::Elevenlabs => "elevenlabs",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -81,6 +92,9 @@ impl Provider {
|
||||||
"mistral" => Some(Provider::Mistral),
|
"mistral" => Some(Provider::Mistral),
|
||||||
"deepseek" => Some(Provider::Deepseek),
|
"deepseek" => Some(Provider::Deepseek),
|
||||||
"local" => Some(Provider::Local),
|
"local" => Some(Provider::Local),
|
||||||
|
"google" => Some(Provider::Google),
|
||||||
|
"fal" => Some(Provider::Fal),
|
||||||
|
"elevenlabs" => Some(Provider::Elevenlabs),
|
||||||
_ => None,
|
_ => None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -102,6 +116,28 @@ pub enum Capability {
|
||||||
LongContext1m,
|
LongContext1m,
|
||||||
#[serde(rename = "system-prompt")]
|
#[serde(rename = "system-prompt")]
|
||||||
SystemPrompt,
|
SystemPrompt,
|
||||||
|
// Generation capabilities (image / video / voice). Pricing for these
|
||||||
|
// is per-image / per-second / per-1k-chars rather than per-mtok; the
|
||||||
|
// existing Pricing struct stores the unit price in
|
||||||
|
// `output_per_mtok_micro` and the unit semantics live in `notes`.
|
||||||
|
#[serde(rename = "image-gen")]
|
||||||
|
ImageGen,
|
||||||
|
#[serde(rename = "text-to-image")]
|
||||||
|
TextToImage,
|
||||||
|
#[serde(rename = "image-edit")]
|
||||||
|
ImageEdit,
|
||||||
|
#[serde(rename = "video-gen")]
|
||||||
|
VideoGen,
|
||||||
|
#[serde(rename = "text-to-video")]
|
||||||
|
TextToVideo,
|
||||||
|
#[serde(rename = "image-to-video")]
|
||||||
|
ImageToVideo,
|
||||||
|
#[serde(rename = "voice-gen")]
|
||||||
|
VoiceGen,
|
||||||
|
#[serde(rename = "text-to-speech")]
|
||||||
|
TextToSpeech,
|
||||||
|
#[serde(rename = "voice-clone")]
|
||||||
|
VoiceClone,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Capability {
|
impl Capability {
|
||||||
|
|
@ -114,6 +150,15 @@ impl Capability {
|
||||||
Capability::LongContext200k => "long-context-200k",
|
Capability::LongContext200k => "long-context-200k",
|
||||||
Capability::LongContext1m => "long-context-1m",
|
Capability::LongContext1m => "long-context-1m",
|
||||||
Capability::SystemPrompt => "system-prompt",
|
Capability::SystemPrompt => "system-prompt",
|
||||||
|
Capability::ImageGen => "image-gen",
|
||||||
|
Capability::TextToImage => "text-to-image",
|
||||||
|
Capability::ImageEdit => "image-edit",
|
||||||
|
Capability::VideoGen => "video-gen",
|
||||||
|
Capability::TextToVideo => "text-to-video",
|
||||||
|
Capability::ImageToVideo => "image-to-video",
|
||||||
|
Capability::VoiceGen => "voice-gen",
|
||||||
|
Capability::TextToSpeech => "text-to-speech",
|
||||||
|
Capability::VoiceClone => "voice-clone",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -126,6 +171,15 @@ impl Capability {
|
||||||
"long-context-200k" => Some(Capability::LongContext200k),
|
"long-context-200k" => Some(Capability::LongContext200k),
|
||||||
"long-context-1m" => Some(Capability::LongContext1m),
|
"long-context-1m" => Some(Capability::LongContext1m),
|
||||||
"system-prompt" => Some(Capability::SystemPrompt),
|
"system-prompt" => Some(Capability::SystemPrompt),
|
||||||
|
"image-gen" => Some(Capability::ImageGen),
|
||||||
|
"text-to-image" => Some(Capability::TextToImage),
|
||||||
|
"image-edit" => Some(Capability::ImageEdit),
|
||||||
|
"video-gen" => Some(Capability::VideoGen),
|
||||||
|
"text-to-video" => Some(Capability::TextToVideo),
|
||||||
|
"image-to-video" => Some(Capability::ImageToVideo),
|
||||||
|
"voice-gen" => Some(Capability::VoiceGen),
|
||||||
|
"text-to-speech" => Some(Capability::TextToSpeech),
|
||||||
|
"voice-clone" => Some(Capability::VoiceClone),
|
||||||
_ => None,
|
_ => None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -147,4 +147,41 @@ pub enum Command {
|
||||||
#[arg(long, default_value_t = false)]
|
#[arg(long, default_value_t = false)]
|
||||||
dry_run: bool,
|
dry_run: bool,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/// Cross-cutting status dashboard: blocks per type, registered path
|
||||||
|
/// atoms, local git branches with ahead/behind, and agent forks from
|
||||||
|
/// `kei-ledger` (if present).
|
||||||
|
Status {
|
||||||
|
/// Registry SQLite path (default: `$KEI_REGISTRY_DB` or
|
||||||
|
/// `~/.claude/registry.sqlite`).
|
||||||
|
#[arg(long)]
|
||||||
|
db: Option<PathBuf>,
|
||||||
|
/// Local git repo to scan for branches (default: current dir).
|
||||||
|
#[arg(long, default_value = ".")]
|
||||||
|
git_repo: PathBuf,
|
||||||
|
/// kei-ledger SQLite path (default: `$KEI_LEDGER_DB` or
|
||||||
|
/// `~/.claude/agents/ledger.sqlite`). Missing file → agent
|
||||||
|
/// section is skipped, never an error.
|
||||||
|
#[arg(long)]
|
||||||
|
ledger_db: Option<PathBuf>,
|
||||||
|
/// Output format: `ascii` (default) or `json`.
|
||||||
|
#[arg(long, default_value = "ascii")]
|
||||||
|
format: String,
|
||||||
|
},
|
||||||
|
|
||||||
|
/// Audit secret/env-var references across the kit. Reads env-var NAMES
|
||||||
|
/// from .env files (never values), greps the kit tree for usages,
|
||||||
|
/// reports orphans (defined but unreferenced).
|
||||||
|
Secrets {
|
||||||
|
/// Env-file paths to scan (default: `~/.claude/secrets/.env` if
|
||||||
|
/// exists, plus any `<scan-root>/secrets/*.env`).
|
||||||
|
#[arg(long = "env-file")]
|
||||||
|
env_files: Vec<PathBuf>,
|
||||||
|
/// Root to scan for usages (default: current directory).
|
||||||
|
#[arg(long, default_value = ".")]
|
||||||
|
scan_root: PathBuf,
|
||||||
|
/// Output format: `ascii` (default) or `json`.
|
||||||
|
#[arg(long, default_value = "ascii")]
|
||||||
|
format: String,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -68,9 +68,42 @@ pub fn dispatch(cmd: Command) -> Result<Outcome> {
|
||||||
Command::IndexSubstrate { kit_root, db, dry_run } => {
|
Command::IndexSubstrate { kit_root, db, dry_run } => {
|
||||||
index_substrate::handle_index_substrate(Some(kit_root), db, dry_run)
|
index_substrate::handle_index_substrate(Some(kit_root), db, dry_run)
|
||||||
}
|
}
|
||||||
|
Command::Status {
|
||||||
|
db,
|
||||||
|
git_repo,
|
||||||
|
ledger_db,
|
||||||
|
format,
|
||||||
|
} => handle_status(db, git_repo, ledger_db, format),
|
||||||
|
Command::Secrets {
|
||||||
|
env_files,
|
||||||
|
scan_root,
|
||||||
|
format,
|
||||||
|
} => crate::secrets_handler::handle_secrets(env_files, scan_root, format),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn handle_status(
|
||||||
|
db: Option<PathBuf>,
|
||||||
|
git_repo: PathBuf,
|
||||||
|
ledger_db: Option<PathBuf>,
|
||||||
|
format: String,
|
||||||
|
) -> Result<Outcome> {
|
||||||
|
let db_path = resolve_db(db);
|
||||||
|
let conn = open_db(&db_path)?;
|
||||||
|
let ledger = ledger_db.unwrap_or_else(crate::status::default_ledger_path);
|
||||||
|
let snap = crate::status::compute_status(&conn, Some(&git_repo), Some(&ledger))?;
|
||||||
|
match format.as_str() {
|
||||||
|
"json" => {
|
||||||
|
println!("{}", serde_json::to_string_pretty(&snap)?);
|
||||||
|
}
|
||||||
|
"ascii" | "" => {
|
||||||
|
print!("{}", crate::status::render_ascii(&snap));
|
||||||
|
}
|
||||||
|
other => anyhow::bail!("unknown --format '{other}' (use ascii or json)"),
|
||||||
|
}
|
||||||
|
Ok(Outcome::Ok)
|
||||||
|
}
|
||||||
|
|
||||||
fn handle_init(db: Option<PathBuf>) -> Result<Outcome> {
|
fn handle_init(db: Option<PathBuf>) -> Result<Outcome> {
|
||||||
let path = resolve_db(db);
|
let path = resolve_db(db);
|
||||||
if let Some(parent) = path.parent() {
|
if let Some(parent) = path.parent() {
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,10 @@ pub mod registry;
|
||||||
pub mod related;
|
pub mod related;
|
||||||
pub mod scan_orchestrator;
|
pub mod scan_orchestrator;
|
||||||
pub mod scanners;
|
pub mod scanners;
|
||||||
|
pub mod secrets;
|
||||||
|
pub mod secrets_handler;
|
||||||
pub mod stats;
|
pub mod stats;
|
||||||
|
pub mod status;
|
||||||
pub mod store;
|
pub mod store;
|
||||||
|
|
||||||
pub use block::{Block, BlockType};
|
pub use block::{Block, BlockType};
|
||||||
|
|
@ -34,5 +37,11 @@ pub use diff::{diff_blocks, BlockDiff};
|
||||||
pub use dna_block::{compose_for_block, compose_for_block_with_nonce};
|
pub use dna_block::{compose_for_block, compose_for_block_with_nonce};
|
||||||
pub use registry::{find_by_path, get, list, list_by_type, mark_superseded, register};
|
pub use registry::{find_by_path, get, list, list_by_type, mark_superseded, register};
|
||||||
pub use related::{find_related, RelatedHit};
|
pub use related::{find_related, RelatedHit};
|
||||||
|
// Both `secrets` and `status` expose a `render_ascii` function — keep them
|
||||||
|
// module-qualified at the top level (avoid re-exporting `render_ascii` to
|
||||||
|
// prevent a name collision; callers use `secrets::render_ascii` /
|
||||||
|
// `status::render_ascii`).
|
||||||
|
pub use secrets::{compute_secrets_report, SecretsReport};
|
||||||
pub use stats::{compute_stats, Stats};
|
pub use stats::{compute_stats, Stats};
|
||||||
|
pub use status::{compute_status, Status};
|
||||||
pub use store::{open_db, SCHEMA_VERSION};
|
pub use store::{open_db, SCHEMA_VERSION};
|
||||||
|
|
|
||||||
152
_primitives/_rust/kei-registry/src/secrets.rs
Normal file
152
_primitives/_rust/kei-registry/src/secrets.rs
Normal file
|
|
@ -0,0 +1,152 @@
|
||||||
|
//! Secret-reference orphan detector.
|
||||||
|
//!
|
||||||
|
//! Reads env-var NAMES from `.env` files (never values), greps the kit
|
||||||
|
//! tree for usages, returns a `SecretsReport` with per-key usage counts
|
||||||
|
//! and orphan list. Constructor Pattern: pure read-side cube.
|
||||||
|
|
||||||
|
use anyhow::Result;
|
||||||
|
use regex::Regex;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use std::collections::BTreeMap;
|
||||||
|
use std::path::{Path, PathBuf};
|
||||||
|
use walkdir::WalkDir;
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
|
||||||
|
pub struct SecretsReport {
|
||||||
|
pub keys: Vec<KeyRow>,
|
||||||
|
pub scanned_files: u64,
|
||||||
|
pub env_files: Vec<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||||
|
pub struct KeyRow {
|
||||||
|
pub name: String,
|
||||||
|
pub source_env_file: String,
|
||||||
|
pub usage_count: u64,
|
||||||
|
/// Top 5 files where the key appears.
|
||||||
|
pub usage_files: Vec<String>,
|
||||||
|
pub orphan: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
const SKIP_DIRS: &[&str] = &["target", "node_modules", ".git", "_generated"];
|
||||||
|
const TEXT_EXTS: &[&str] = &["rs", "toml", "md", "sh", "py", "ts", "js", "yml", "yaml", "json"];
|
||||||
|
|
||||||
|
pub(crate) fn is_valid_key(s: &str) -> bool {
|
||||||
|
let mut chars = s.chars();
|
||||||
|
match chars.next() {
|
||||||
|
Some(c) if c.is_ascii_uppercase() => {
|
||||||
|
chars.all(|c| c.is_ascii_uppercase() || c.is_ascii_digit() || c == '_')
|
||||||
|
}
|
||||||
|
_ => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn parse_env_file(path: &Path) -> Result<Vec<String>> {
|
||||||
|
let content = std::fs::read_to_string(path)?;
|
||||||
|
let mut keys = Vec::new();
|
||||||
|
for line in content.lines() {
|
||||||
|
let trimmed = line.trim();
|
||||||
|
if trimmed.is_empty() || trimmed.starts_with('#') { continue; }
|
||||||
|
let Some(idx) = trimmed.find('=') else { continue; };
|
||||||
|
let key = trimmed[..idx].trim();
|
||||||
|
if is_valid_key(key) { keys.push(key.to_string()); }
|
||||||
|
}
|
||||||
|
Ok(keys)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn is_text_file(path: &Path) -> bool {
|
||||||
|
path.extension().and_then(|e| e.to_str()).map_or(false, |ext| TEXT_EXTS.contains(&ext))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn word_re(key: &str) -> Result<Regex> {
|
||||||
|
Ok(Regex::new(&format!(r"\b{}\b", regex::escape(key)))?)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Scan `scan_root`, returning scanned_files count and per-key (count, files) map.
|
||||||
|
pub(crate) fn scan_usages(
|
||||||
|
keys: &[String],
|
||||||
|
scan_root: &Path,
|
||||||
|
) -> Result<(u64, BTreeMap<String, (u64, Vec<String>)>)> {
|
||||||
|
let patterns: Vec<(String, Regex)> = keys
|
||||||
|
.iter()
|
||||||
|
.map(|k| Ok((k.clone(), word_re(k)?)))
|
||||||
|
.collect::<Result<_>>()?;
|
||||||
|
let mut counts: BTreeMap<String, (u64, Vec<String>)> = BTreeMap::new();
|
||||||
|
for k in keys { counts.insert(k.clone(), (0, Vec::new())); }
|
||||||
|
let mut scanned = 0u64;
|
||||||
|
for entry in WalkDir::new(scan_root).follow_links(false)
|
||||||
|
.into_iter()
|
||||||
|
.filter_entry(|e| !SKIP_DIRS.contains(&e.file_name().to_string_lossy().as_ref()))
|
||||||
|
.flatten()
|
||||||
|
{
|
||||||
|
if !entry.file_type().is_file() || !is_text_file(entry.path()) { continue; }
|
||||||
|
let Ok(content) = std::fs::read_to_string(entry.path()) else { continue; };
|
||||||
|
scanned += 1;
|
||||||
|
let rel = entry.path().strip_prefix(scan_root).unwrap_or(entry.path())
|
||||||
|
.to_string_lossy().to_string();
|
||||||
|
for (key, re) in &patterns {
|
||||||
|
if re.is_match(&content) {
|
||||||
|
let e = counts.get_mut(key).expect("key present");
|
||||||
|
e.0 += 1;
|
||||||
|
if e.1.len() < 5 { e.1.push(rel.clone()); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok((scanned, counts))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Build a `SecretsReport`. Pure: no side effects beyond file reads.
|
||||||
|
pub fn compute_secrets_report(env_paths: &[PathBuf], scan_root: &Path) -> Result<SecretsReport> {
|
||||||
|
let mut all_keys: Vec<(String, String)> = Vec::new();
|
||||||
|
let mut env_file_labels: Vec<String> = Vec::new();
|
||||||
|
for ep in env_paths {
|
||||||
|
let label = ep.to_string_lossy().to_string();
|
||||||
|
env_file_labels.push(label.clone());
|
||||||
|
for k in parse_env_file(ep).unwrap_or_default() { all_keys.push((k, label.clone())); }
|
||||||
|
}
|
||||||
|
let unique_keys: Vec<String> = {
|
||||||
|
let mut seen = std::collections::HashSet::new();
|
||||||
|
all_keys.iter().filter(|(k, _)| seen.insert(k.clone())).map(|(k, _)| k.clone()).collect()
|
||||||
|
};
|
||||||
|
let (scanned_files, counts) = scan_usages(&unique_keys, scan_root)?;
|
||||||
|
let mut rows: Vec<KeyRow> = all_keys.into_iter().map(|(name, source_env_file)| {
|
||||||
|
let (usage_count, usage_files) = counts.get(&name).cloned().unwrap_or_default();
|
||||||
|
KeyRow { orphan: usage_count == 0, name, source_env_file, usage_count, usage_files }
|
||||||
|
}).collect();
|
||||||
|
rows.sort_by(|a, b| a.name.cmp(&b.name));
|
||||||
|
Ok(SecretsReport { keys: rows, scanned_files, env_files: env_file_labels })
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Render a `SecretsReport` as ASCII text.
|
||||||
|
pub fn render_ascii(r: &SecretsReport) -> String {
|
||||||
|
use std::fmt::Write as FmtWrite;
|
||||||
|
let mut out = String::new();
|
||||||
|
let mut by_file: BTreeMap<&str, Vec<&KeyRow>> = BTreeMap::new();
|
||||||
|
for row in &r.keys { by_file.entry(row.source_env_file.as_str()).or_default().push(row); }
|
||||||
|
for (file, rows) in &by_file {
|
||||||
|
let orphan_count = rows.iter().filter(|r| r.orphan).count();
|
||||||
|
let _ = writeln!(out, "[Secrets — {} ({} keys, {} orphan)]", file, rows.len(), orphan_count);
|
||||||
|
for row in rows.iter() { render_row(&mut out, row); }
|
||||||
|
}
|
||||||
|
let total_orphans = r.keys.iter().filter(|k| k.orphan).count();
|
||||||
|
let _ = writeln!(out, "Total: {} keys across {} env files, {} orphan",
|
||||||
|
r.keys.len(), r.env_files.len(), total_orphans);
|
||||||
|
out
|
||||||
|
}
|
||||||
|
|
||||||
|
fn render_row(out: &mut String, row: &KeyRow) {
|
||||||
|
use std::fmt::Write as FmtWrite;
|
||||||
|
if row.orphan {
|
||||||
|
let _ = writeln!(out, " {:<35} *ORPHAN* 0 refs — candidate for removal", row.name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let files_str = row.usage_files.join(", ");
|
||||||
|
let extra = if row.usage_count > row.usage_files.len() as u64 {
|
||||||
|
format!(", +{} more", row.usage_count - row.usage_files.len() as u64)
|
||||||
|
} else { String::new() };
|
||||||
|
let _ = writeln!(out, " {:<35} {:>4} refs ({}{})", row.name, row.usage_count, files_str, extra);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
#[path = "secrets_tests.rs"]
|
||||||
|
mod tests;
|
||||||
58
_primitives/_rust/kei-registry/src/secrets_handler.rs
Normal file
58
_primitives/_rust/kei-registry/src/secrets_handler.rs
Normal file
|
|
@ -0,0 +1,58 @@
|
||||||
|
//! Handler for the `secrets` subcommand.
|
||||||
|
//!
|
||||||
|
//! Constructor Pattern: this cube owns the secrets command dispatch only.
|
||||||
|
//! Env-file resolution + report output. No scanner logic — that lives
|
||||||
|
//! in `secrets.rs`.
|
||||||
|
|
||||||
|
use anyhow::Result;
|
||||||
|
use std::path::{Path, PathBuf};
|
||||||
|
|
||||||
|
use crate::handlers::Outcome;
|
||||||
|
use crate::secrets::{compute_secrets_report, render_ascii};
|
||||||
|
|
||||||
|
/// Top-level handler wired from `handlers::dispatch`.
|
||||||
|
pub fn handle_secrets(
|
||||||
|
mut env_files: Vec<PathBuf>,
|
||||||
|
scan_root: PathBuf,
|
||||||
|
format: String,
|
||||||
|
) -> Result<Outcome> {
|
||||||
|
let root = scan_root.canonicalize().unwrap_or(scan_root);
|
||||||
|
if env_files.is_empty() {
|
||||||
|
env_files = resolve_default_env_files(&root);
|
||||||
|
}
|
||||||
|
let report = compute_secrets_report(&env_files, &root)?;
|
||||||
|
match format.as_str() {
|
||||||
|
"json" => println!("{}", serde_json::to_string_pretty(&report)?),
|
||||||
|
_ => print!("{}", render_ascii(&report)),
|
||||||
|
}
|
||||||
|
Ok(Outcome::Ok)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Resolve default env files when user provides none.
|
||||||
|
///
|
||||||
|
/// Priority order:
|
||||||
|
/// 1. `~/.claude/secrets/.env` (umbrella SSoT per RULE 0.8)
|
||||||
|
/// 2. `<scan_root>/secrets/*.env` (per-project secrets)
|
||||||
|
fn resolve_default_env_files(scan_root: &Path) -> Vec<PathBuf> {
|
||||||
|
let mut result = Vec::new();
|
||||||
|
let umbrella = umbrella_env_path();
|
||||||
|
if umbrella.exists() {
|
||||||
|
result.push(umbrella);
|
||||||
|
}
|
||||||
|
let secrets_dir = scan_root.join("secrets");
|
||||||
|
if let Ok(rd) = std::fs::read_dir(&secrets_dir) {
|
||||||
|
let mut local: Vec<PathBuf> = rd
|
||||||
|
.flatten()
|
||||||
|
.map(|e| e.path())
|
||||||
|
.filter(|p| p.extension().and_then(|e| e.to_str()) == Some("env"))
|
||||||
|
.collect();
|
||||||
|
local.sort();
|
||||||
|
result.extend(local);
|
||||||
|
}
|
||||||
|
result
|
||||||
|
}
|
||||||
|
|
||||||
|
fn umbrella_env_path() -> PathBuf {
|
||||||
|
let home = std::env::var("HOME").unwrap_or_else(|_| "/tmp".to_string());
|
||||||
|
PathBuf::from(home).join(".claude").join("secrets").join(".env")
|
||||||
|
}
|
||||||
125
_primitives/_rust/kei-registry/src/secrets_tests.rs
Normal file
125
_primitives/_rust/kei-registry/src/secrets_tests.rs
Normal file
|
|
@ -0,0 +1,125 @@
|
||||||
|
//! Tests for secrets.rs — orphan-detection, env-parse, word-boundary, JSON roundtrip.
|
||||||
|
|
||||||
|
use std::io::Write;
|
||||||
|
use std::path::Path;
|
||||||
|
use tempfile::TempDir;
|
||||||
|
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
fn write_file(dir: &Path, name: &str, content: &str) {
|
||||||
|
let p = dir.join(name);
|
||||||
|
if let Some(parent) = p.parent() {
|
||||||
|
std::fs::create_dir_all(parent).unwrap();
|
||||||
|
}
|
||||||
|
let mut f = std::fs::File::create(&p).unwrap();
|
||||||
|
f.write_all(content.as_bytes()).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn make_env(dir: &Path, name: &str, content: &str) -> std::path::PathBuf {
|
||||||
|
let p = dir.join(name);
|
||||||
|
let mut f = std::fs::File::create(&p).unwrap();
|
||||||
|
f.write_all(content.as_bytes()).unwrap();
|
||||||
|
p
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_parse_env_file_filters_correctly() {
|
||||||
|
let tmp = TempDir::new().unwrap();
|
||||||
|
let env_path = make_env(
|
||||||
|
tmp.path(),
|
||||||
|
".env",
|
||||||
|
"# comment\n\nANTHROPIC_API_KEY=sk-ant-xxx\nlower_key=ignored\nNO_EQUALS\nQUOTED_KEY=\"value\"\n",
|
||||||
|
);
|
||||||
|
let keys = parse_env_file(&env_path).unwrap();
|
||||||
|
assert!(keys.contains(&"ANTHROPIC_API_KEY".to_string()));
|
||||||
|
assert!(keys.contains(&"QUOTED_KEY".to_string()));
|
||||||
|
assert!(!keys.contains(&"lower_key".to_string()));
|
||||||
|
assert!(!keys.contains(&"NO_EQUALS".to_string()));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_scan_counts_usages_correctly() {
|
||||||
|
let src_tmp = TempDir::new().unwrap();
|
||||||
|
write_file(src_tmp.path(), "main.rs", "let x = std::env::var(\"MY_KEY\").unwrap();");
|
||||||
|
write_file(src_tmp.path(), "config.toml", "key = \"$MY_KEY\"");
|
||||||
|
write_file(src_tmp.path(), "other.rs", "// no secret here");
|
||||||
|
|
||||||
|
let env_tmp = TempDir::new().unwrap();
|
||||||
|
let env_path = make_env(env_tmp.path(), ".env", "MY_KEY=secret\nORPHAN_KEY=unused\n");
|
||||||
|
|
||||||
|
let report = compute_secrets_report(&[env_path], src_tmp.path()).unwrap();
|
||||||
|
let my_key = report.keys.iter().find(|k| k.name == "MY_KEY").unwrap();
|
||||||
|
let orphan_key = report.keys.iter().find(|k| k.name == "ORPHAN_KEY").unwrap();
|
||||||
|
|
||||||
|
assert_eq!(my_key.usage_count, 2);
|
||||||
|
assert!(!my_key.orphan);
|
||||||
|
assert_eq!(orphan_key.usage_count, 0);
|
||||||
|
assert!(orphan_key.orphan);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_word_boundary_no_false_positive() {
|
||||||
|
let src_tmp = TempDir::new().unwrap();
|
||||||
|
// MY_KEY_EXTRA must NOT match MY_KEY due to word boundary.
|
||||||
|
write_file(src_tmp.path(), "a.rs", "let _ = std::env::var(\"MY_KEY_EXTRA\");");
|
||||||
|
|
||||||
|
let env_tmp = TempDir::new().unwrap();
|
||||||
|
let env_path = make_env(env_tmp.path(), ".env", "MY_KEY=val\n");
|
||||||
|
|
||||||
|
let report = compute_secrets_report(&[env_path], src_tmp.path()).unwrap();
|
||||||
|
let row = report.keys.iter().find(|k| k.name == "MY_KEY").unwrap();
|
||||||
|
assert_eq!(
|
||||||
|
row.usage_count, 0,
|
||||||
|
"word boundary regression: MY_KEY matched inside MY_KEY_EXTRA"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_json_roundtrip() {
|
||||||
|
let report = SecretsReport {
|
||||||
|
keys: vec![KeyRow {
|
||||||
|
name: "TEST_KEY".into(),
|
||||||
|
source_env_file: "/tmp/.env".into(),
|
||||||
|
usage_count: 3,
|
||||||
|
usage_files: vec!["src/main.rs".into()],
|
||||||
|
orphan: false,
|
||||||
|
}],
|
||||||
|
scanned_files: 10,
|
||||||
|
env_files: vec!["/tmp/.env".into()],
|
||||||
|
};
|
||||||
|
let json = serde_json::to_string(&report).unwrap();
|
||||||
|
let decoded: SecretsReport = serde_json::from_str(&json).unwrap();
|
||||||
|
assert_eq!(decoded.keys[0].name, "TEST_KEY");
|
||||||
|
assert_eq!(decoded.scanned_files, 10);
|
||||||
|
assert!(!decoded.keys[0].orphan);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_render_ascii_shows_orphan_marker() {
|
||||||
|
let report = SecretsReport {
|
||||||
|
keys: vec![
|
||||||
|
KeyRow {
|
||||||
|
name: "ACTIVE_KEY".into(),
|
||||||
|
source_env_file: "~/.env".into(),
|
||||||
|
usage_count: 5,
|
||||||
|
usage_files: vec!["src/a.rs".into()],
|
||||||
|
orphan: false,
|
||||||
|
},
|
||||||
|
KeyRow {
|
||||||
|
name: "LEGACY_TOKEN".into(),
|
||||||
|
source_env_file: "~/.env".into(),
|
||||||
|
usage_count: 0,
|
||||||
|
usage_files: vec![],
|
||||||
|
orphan: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
scanned_files: 20,
|
||||||
|
env_files: vec!["~/.env".into()],
|
||||||
|
};
|
||||||
|
let ascii = render_ascii(&report);
|
||||||
|
assert!(ascii.contains("*ORPHAN*"));
|
||||||
|
assert!(ascii.contains("LEGACY_TOKEN"));
|
||||||
|
assert!(ascii.contains("ACTIVE_KEY"));
|
||||||
|
assert!(ascii.contains("Total: 2 keys"));
|
||||||
|
assert!(ascii.contains("1 orphan"));
|
||||||
|
}
|
||||||
398
_primitives/_rust/kei-registry/src/status.rs
Normal file
398
_primitives/_rust/kei-registry/src/status.rs
Normal file
|
|
@ -0,0 +1,398 @@
|
||||||
|
//! Cross-cutting "what is alive right now" view.
|
||||||
|
//!
|
||||||
|
//! Constructor Pattern: pure read-side cube. Joins three sources for a
|
||||||
|
//! single dashboard:
|
||||||
|
//! 1. `blocks` table from kei-registry — atoms, skills, rules, hooks,
|
||||||
|
//! primitives, plus path-atoms (atoms whose source file is
|
||||||
|
//! `_blocks/path-*.md`).
|
||||||
|
//! 2. `agents` table from `~/.claude/agents/ledger.sqlite` if present —
|
||||||
|
//! agent forks per RULE 0.12, with status (running / done / failed /
|
||||||
|
//! merged / rejected).
|
||||||
|
//! 3. `git for-each-ref refs/heads` shell-out — local branches with
|
||||||
|
//! `ahead`, `behind` and `dirty` flags relative to their upstream.
|
||||||
|
//!
|
||||||
|
//! No I/O beyond DB reads + one git invocation. No writes. The handler
|
||||||
|
//! formats the gathered struct into either an ASCII table (default) or
|
||||||
|
//! JSON (`--format json`).
|
||||||
|
|
||||||
|
use anyhow::{Context, Result};
|
||||||
|
use rusqlite::Connection;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use std::collections::BTreeMap;
|
||||||
|
use std::path::{Path, PathBuf};
|
||||||
|
use std::process::Command;
|
||||||
|
|
||||||
|
use crate::block::BlockType;
|
||||||
|
|
||||||
|
/// Aggregate snapshot returned by `compute_status`.
|
||||||
|
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
|
||||||
|
pub struct Status {
|
||||||
|
pub blocks_by_type: BTreeMap<String, u64>,
|
||||||
|
pub path_atoms: Vec<PathAtomRow>,
|
||||||
|
pub branches: Vec<BranchRow>,
|
||||||
|
pub agents: Option<AgentSummary>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||||
|
pub struct PathAtomRow {
|
||||||
|
pub name: String,
|
||||||
|
pub dna_prefix: String,
|
||||||
|
pub body_sha8: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||||
|
pub struct BranchRow {
|
||||||
|
pub name: String,
|
||||||
|
pub current: bool,
|
||||||
|
pub upstream: Option<String>,
|
||||||
|
pub ahead: u32,
|
||||||
|
pub behind: u32,
|
||||||
|
pub last_commit: String,
|
||||||
|
/// Deterministic DNA-style identifier for the branch. Format
|
||||||
|
/// `branch::git::<sha8(branch_name)>::<sha8(commit_sha)>`. Computed
|
||||||
|
/// on-the-fly from `(name, last_commit)` so it survives without DB
|
||||||
|
/// persistence — the underlying truth lives in `.git/refs/heads/<name>`.
|
||||||
|
pub dna: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
|
||||||
|
pub struct AgentSummary {
|
||||||
|
pub running: u64,
|
||||||
|
pub done: u64,
|
||||||
|
pub failed: u64,
|
||||||
|
pub merged: u64,
|
||||||
|
pub rejected: u64,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Compute the full status snapshot. `git_repo` is the path to scan for
|
||||||
|
/// branches (typically the current working directory). `ledger_db` is
|
||||||
|
/// the optional path to `~/.claude/agents/ledger.sqlite`; if it doesn't
|
||||||
|
/// exist, `agents` field is `None`.
|
||||||
|
pub fn compute_status(
|
||||||
|
conn: &Connection,
|
||||||
|
git_repo: Option<&Path>,
|
||||||
|
ledger_db: Option<&Path>,
|
||||||
|
) -> Result<Status> {
|
||||||
|
let mut s = Status::default();
|
||||||
|
s.blocks_by_type = block_counts(conn)?;
|
||||||
|
s.path_atoms = path_atom_rows(conn)?;
|
||||||
|
if let Some(repo) = git_repo {
|
||||||
|
s.branches = git_branches(repo).unwrap_or_default();
|
||||||
|
}
|
||||||
|
if let Some(db) = ledger_db {
|
||||||
|
if db.exists() {
|
||||||
|
s.agents = ledger_agent_summary(db).ok();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(s)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn block_counts(conn: &Connection) -> Result<BTreeMap<String, u64>> {
|
||||||
|
let mut out = BTreeMap::new();
|
||||||
|
for bt in BlockType::all() {
|
||||||
|
let mut stmt = conn
|
||||||
|
.prepare(
|
||||||
|
"SELECT COUNT(*) FROM blocks \
|
||||||
|
WHERE block_type = ?1 AND superseded_by IS NULL",
|
||||||
|
)
|
||||||
|
.context("prepare block_counts")?;
|
||||||
|
let n: i64 = stmt
|
||||||
|
.query_row(rusqlite::params![bt.as_str()], |r| r.get(0))
|
||||||
|
.context("query block_counts")?;
|
||||||
|
out.insert(bt.as_str().to_string(), n as u64);
|
||||||
|
}
|
||||||
|
Ok(out)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn path_atom_rows(conn: &Connection) -> Result<Vec<PathAtomRow>> {
|
||||||
|
// Convention: path-atoms are atoms whose source file matches
|
||||||
|
// `_blocks/path-<name>.md`. SQL LIKE keeps it server-side; the
|
||||||
|
// resulting rows are sorted by name for stable output.
|
||||||
|
let mut stmt = conn
|
||||||
|
.prepare(
|
||||||
|
"SELECT name, dna, body_sha FROM blocks \
|
||||||
|
WHERE block_type = 'atom' \
|
||||||
|
AND superseded_by IS NULL \
|
||||||
|
AND path LIKE '%/_blocks/path-%.md' \
|
||||||
|
ORDER BY name",
|
||||||
|
)
|
||||||
|
.context("prepare path_atom_rows")?;
|
||||||
|
let rows = stmt
|
||||||
|
.query_map([], |r| {
|
||||||
|
let dna: String = r.get(1)?;
|
||||||
|
let dna_prefix = dna_prefix(&dna);
|
||||||
|
Ok(PathAtomRow {
|
||||||
|
name: r.get(0)?,
|
||||||
|
dna_prefix,
|
||||||
|
body_sha8: r.get(2)?,
|
||||||
|
})
|
||||||
|
})?
|
||||||
|
.filter_map(Result::ok)
|
||||||
|
.collect();
|
||||||
|
Ok(rows)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Compute a deterministic DNA-style identifier for a git branch. Mirrors
|
||||||
|
/// the kei-shared wire format `<role>::<caps>::<scope_sha8>::<body_sha8>`:
|
||||||
|
/// role is fixed `branch`, caps is fixed `git`, scope_sha is the first 8
|
||||||
|
/// hex chars of `sha256(branch_name)`, body_sha is the first 8 chars of
|
||||||
|
/// the commit SHA (which is itself a SHA-1 prefix). The pair is unique
|
||||||
|
/// per (name, head_commit) so the DNA changes on every commit, mirroring
|
||||||
|
/// the immutable-content invariant atoms have.
|
||||||
|
fn compute_branch_dna(name: &str, commit_sha: &str) -> String {
|
||||||
|
use sha2::{Digest, Sha256};
|
||||||
|
let mut h = Sha256::new();
|
||||||
|
h.update(name.as_bytes());
|
||||||
|
let name_sha = format!("{:x}", h.finalize());
|
||||||
|
let scope8 = &name_sha[..8];
|
||||||
|
let body8 = commit_sha
|
||||||
|
.get(..8)
|
||||||
|
.unwrap_or(commit_sha)
|
||||||
|
.to_ascii_lowercase();
|
||||||
|
format!("branch::git::{scope8}::{body8}")
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Take the first three segments of a `<role>::<caps>::<scope_sha8>::...`
|
||||||
|
/// DNA so the displayed prefix is readable but identifying.
|
||||||
|
fn dna_prefix(dna: &str) -> String {
|
||||||
|
let mut parts = dna.split("::").take(3).collect::<Vec<_>>();
|
||||||
|
if parts.len() < 3 {
|
||||||
|
return dna.to_string();
|
||||||
|
}
|
||||||
|
parts.push("…");
|
||||||
|
parts.join("::")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn git_branches(repo: &Path) -> Result<Vec<BranchRow>> {
|
||||||
|
let current_branch = run_git(repo, &["rev-parse", "--abbrev-ref", "HEAD"]).ok();
|
||||||
|
let out = run_git(
|
||||||
|
repo,
|
||||||
|
&[
|
||||||
|
"for-each-ref",
|
||||||
|
"--format=%(refname:short)\t%(upstream:short)\t%(upstream:track,nobracket)\t%(objectname:short)",
|
||||||
|
"refs/heads",
|
||||||
|
],
|
||||||
|
)?;
|
||||||
|
let mut rows = Vec::new();
|
||||||
|
for line in out.lines() {
|
||||||
|
let parts: Vec<&str> = line.split('\t').collect();
|
||||||
|
if parts.len() < 4 {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
let name = parts[0].to_string();
|
||||||
|
let upstream = if parts[1].is_empty() {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(parts[1].to_string())
|
||||||
|
};
|
||||||
|
let (ahead, behind) = parse_track(parts[2]);
|
||||||
|
let last_commit = parts[3].to_string();
|
||||||
|
let dna = compute_branch_dna(&name, &last_commit);
|
||||||
|
rows.push(BranchRow {
|
||||||
|
current: current_branch.as_deref() == Some(&name),
|
||||||
|
name,
|
||||||
|
upstream,
|
||||||
|
ahead,
|
||||||
|
behind,
|
||||||
|
last_commit,
|
||||||
|
dna,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
Ok(rows)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Parse `upstream:track,nobracket` output. Examples:
|
||||||
|
/// `""` (in sync), `"ahead 3"`, `"behind 1"`, `"ahead 3, behind 1"`,
|
||||||
|
/// `"gone"` (upstream deleted).
|
||||||
|
fn parse_track(s: &str) -> (u32, u32) {
|
||||||
|
let mut ahead = 0u32;
|
||||||
|
let mut behind = 0u32;
|
||||||
|
for part in s.split(',') {
|
||||||
|
let part = part.trim();
|
||||||
|
if let Some(n) = part.strip_prefix("ahead ") {
|
||||||
|
ahead = n.parse().unwrap_or(0);
|
||||||
|
} else if let Some(n) = part.strip_prefix("behind ") {
|
||||||
|
behind = n.parse().unwrap_or(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
(ahead, behind)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run_git(repo: &Path, args: &[&str]) -> Result<String> {
|
||||||
|
let out = Command::new("git")
|
||||||
|
.arg("-C")
|
||||||
|
.arg(repo)
|
||||||
|
.args(args)
|
||||||
|
.output()
|
||||||
|
.context("spawn git")?;
|
||||||
|
if !out.status.success() {
|
||||||
|
anyhow::bail!(
|
||||||
|
"git {:?} failed: {}",
|
||||||
|
args,
|
||||||
|
String::from_utf8_lossy(&out.stderr)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
Ok(String::from_utf8_lossy(&out.stdout).trim_end().to_string())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn ledger_agent_summary(db: &Path) -> Result<AgentSummary> {
|
||||||
|
let conn = rusqlite::Connection::open_with_flags(
|
||||||
|
db,
|
||||||
|
rusqlite::OpenFlags::SQLITE_OPEN_READ_ONLY,
|
||||||
|
)
|
||||||
|
.context("open ledger DB read-only")?;
|
||||||
|
let mut s = AgentSummary::default();
|
||||||
|
for (status, slot) in [
|
||||||
|
("running", &mut s.running),
|
||||||
|
("done", &mut s.done),
|
||||||
|
("failed", &mut s.failed),
|
||||||
|
("merged", &mut s.merged),
|
||||||
|
("rejected", &mut s.rejected),
|
||||||
|
] {
|
||||||
|
let mut stmt = conn.prepare("SELECT COUNT(*) FROM agents WHERE status = ?1")?;
|
||||||
|
let n: i64 = stmt.query_row(rusqlite::params![status], |r| r.get(0))?;
|
||||||
|
*slot = n as u64;
|
||||||
|
}
|
||||||
|
Ok(s)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Render `Status` as a multi-section ASCII report.
|
||||||
|
pub fn render_ascii(s: &Status) -> String {
|
||||||
|
let mut out = String::new();
|
||||||
|
out.push_str("=== Substrate Status ===\n\n");
|
||||||
|
out.push_str("[Blocks — active count by type]\n");
|
||||||
|
for (k, v) in &s.blocks_by_type {
|
||||||
|
out.push_str(&format!(" {:<14} {}\n", k, v));
|
||||||
|
}
|
||||||
|
out.push('\n');
|
||||||
|
|
||||||
|
out.push_str(&format!("[Path Atoms — {}]\n", s.path_atoms.len()));
|
||||||
|
for p in &s.path_atoms {
|
||||||
|
out.push_str(&format!(
|
||||||
|
" {:<14} {:<28} body:{}\n",
|
||||||
|
p.name, p.dna_prefix, p.body_sha8
|
||||||
|
));
|
||||||
|
}
|
||||||
|
if s.path_atoms.is_empty() {
|
||||||
|
out.push_str(" (none registered)\n");
|
||||||
|
}
|
||||||
|
out.push('\n');
|
||||||
|
|
||||||
|
out.push_str(&format!("[Local Branches — {}]\n", s.branches.len()));
|
||||||
|
for b in &s.branches {
|
||||||
|
let marker = if b.current { "*" } else { " " };
|
||||||
|
let track = match (b.ahead, b.behind) {
|
||||||
|
(0, 0) => "in sync".to_string(),
|
||||||
|
(a, 0) => format!("ahead {a}"),
|
||||||
|
(0, b_) => format!("behind {b_}"),
|
||||||
|
(a, b_) => format!("ahead {a}, behind {b_}"),
|
||||||
|
};
|
||||||
|
let upstream = b.upstream.as_deref().unwrap_or("(none)");
|
||||||
|
out.push_str(&format!(
|
||||||
|
" {} {:<40} → {:<25} {} @ {} {}\n",
|
||||||
|
marker, b.name, upstream, track, b.last_commit, dna_prefix(&b.dna)
|
||||||
|
));
|
||||||
|
}
|
||||||
|
out.push('\n');
|
||||||
|
|
||||||
|
if let Some(a) = &s.agents {
|
||||||
|
out.push_str("[Agent Forks — kei-ledger]\n");
|
||||||
|
out.push_str(&format!(
|
||||||
|
" running:{} done:{} merged:{} failed:{} rejected:{}\n",
|
||||||
|
a.running, a.done, a.merged, a.failed, a.rejected
|
||||||
|
));
|
||||||
|
} else {
|
||||||
|
out.push_str("[Agent Forks]\n (no kei-ledger DB found)\n");
|
||||||
|
}
|
||||||
|
out.push('\n');
|
||||||
|
out
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Default ledger path: `$KEI_LEDGER_DB` or `~/.claude/agents/ledger.sqlite`.
|
||||||
|
pub fn default_ledger_path() -> PathBuf {
|
||||||
|
if let Some(v) = std::env::var_os("KEI_LEDGER_DB") {
|
||||||
|
return PathBuf::from(v);
|
||||||
|
}
|
||||||
|
let home = std::env::var_os("HOME").unwrap_or_default();
|
||||||
|
PathBuf::from(home).join(".claude/agents/ledger.sqlite")
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn parse_track_in_sync() {
|
||||||
|
assert_eq!(parse_track(""), (0, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn parse_track_ahead() {
|
||||||
|
assert_eq!(parse_track("ahead 3"), (3, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn parse_track_behind() {
|
||||||
|
assert_eq!(parse_track("behind 7"), (0, 7));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn parse_track_both() {
|
||||||
|
assert_eq!(parse_track("ahead 3, behind 1"), (3, 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn parse_track_gone_treated_as_zero() {
|
||||||
|
// Upstream deleted — git emits "gone"; we don't surface it as
|
||||||
|
// ahead/behind, so callers see (0, 0). Acceptable for a status
|
||||||
|
// dashboard; a future field could carry it explicitly.
|
||||||
|
assert_eq!(parse_track("gone"), (0, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn dna_prefix_three_segments() {
|
||||||
|
let dna = "atom::md::1a771d51::b8f9e85f-abc12345";
|
||||||
|
assert_eq!(dna_prefix(dna), "atom::md::1a771d51::…");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn branch_dna_is_deterministic_and_well_formed() {
|
||||||
|
let dna = compute_branch_dna("feat/foo-bar", "3422bdca12d4567");
|
||||||
|
assert!(dna.starts_with("branch::git::"));
|
||||||
|
let parts: Vec<&str> = dna.split("::").collect();
|
||||||
|
assert_eq!(parts.len(), 4);
|
||||||
|
assert_eq!(parts[0], "branch");
|
||||||
|
assert_eq!(parts[1], "git");
|
||||||
|
assert_eq!(parts[2].len(), 8); // sha8 of branch name
|
||||||
|
assert_eq!(parts[3], "3422bdca"); // first 8 of commit
|
||||||
|
// determinism: same input → same DNA
|
||||||
|
let dna2 = compute_branch_dna("feat/foo-bar", "3422bdca12d4567");
|
||||||
|
assert_eq!(dna, dna2);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn branch_dna_changes_on_commit() {
|
||||||
|
let a = compute_branch_dna("main", "aaaaaaaa1111");
|
||||||
|
let b = compute_branch_dna("main", "bbbbbbbb2222");
|
||||||
|
assert_ne!(a, b, "DNA should change when commit changes");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn branch_dna_changes_on_rename() {
|
||||||
|
let a = compute_branch_dna("main", "deadbeef");
|
||||||
|
let b = compute_branch_dna("trunk", "deadbeef");
|
||||||
|
assert_ne!(a, b, "DNA should change when name changes");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn render_ascii_empty_status_has_all_sections() {
|
||||||
|
let s = Status::default();
|
||||||
|
let out = render_ascii(&s);
|
||||||
|
assert!(out.contains("Blocks"));
|
||||||
|
assert!(out.contains("Path Atoms"));
|
||||||
|
assert!(out.contains("Local Branches"));
|
||||||
|
assert!(out.contains("Agent Forks"));
|
||||||
|
assert!(out.contains("(none registered)"));
|
||||||
|
assert!(out.contains("(no kei-ledger DB found)"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,130 +1,133 @@
|
||||||
# KeiSeiKit DNA Encyclopedia
|
# KeiSeiKit DNA Encyclopedia
|
||||||
|
|
||||||
> Auto-generated from kei-registry. Last regenerated: 2026-05-01T13:08:56Z.
|
> Auto-generated from kei-registry. Last regenerated: 2026-05-01T16:06:16Z.
|
||||||
> Total blocks: 501. Per-type breakdown:
|
> Total blocks: 512. Per-type breakdown:
|
||||||
|
|
||||||
| Type | Count |
|
| Type | Count |
|
||||||
|---|---:|
|
|---|---:|
|
||||||
| atom | 117 |
|
| atom | 121 |
|
||||||
| hook | 36 |
|
| hook | 40 |
|
||||||
| primitive | 106 |
|
| primitive | 109 |
|
||||||
| rule | 174 |
|
| rule | 174 |
|
||||||
| skill | 68 |
|
| skill | 68 |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Primitive (106)
|
## Primitive (109)
|
||||||
|
|
||||||
Sorted alphabetically by name.
|
Sorted alphabetically by name.
|
||||||
|
|
||||||
| Name | DNA prefix | Path | Body sha8 |
|
| Name | DNA prefix | Path | Body sha8 |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| firewall-diff | primitive::cli,md::c… | _primitives/_rust/firewall-diff/Cargo.toml | e42f1e32 |
|
| firewall-diff | primitive::cli,md::c… | _primitives/_rust/firewall-diff/Cargo.toml | 8260ffc0 |
|
||||||
| frustration-matrix | primitive::cli,fs,md… | _primitives/_rust/frustration-matrix/Cargo.toml | 0923b30a |
|
| frustration-matrix | primitive::cli,fs,md… | _primitives/_rust/frustration-matrix/Cargo.toml | d51e63c8 |
|
||||||
| kei-agent-runtime | primitive::cli,fs,ha… | _primitives/_rust/kei-agent-runtime/Cargo.toml | 708830d4 |
|
| kei-agent-runtime | primitive::cli,fs,ha… | _primitives/_rust/kei-agent-runtime/Cargo.toml | 33b44d6c |
|
||||||
| kei-artifact | primitive::cli,hash,… | _primitives/_rust/kei-artifact/Cargo.toml | 2c55b84a |
|
| kei-artifact | primitive::cli,hash,… | _primitives/_rust/kei-artifact/Cargo.toml | a33abf97 |
|
||||||
| kei-atom-discovery | primitive::fs,md::85… | _primitives/_rust/kei-atom-discovery/Cargo.toml | 0d532c9f |
|
| kei-atom-discovery | primitive::fs,md::85… | _primitives/_rust/kei-atom-discovery/Cargo.toml | ca9202b5 |
|
||||||
| kei-auth | primitive::cli,hash,… | _primitives/_rust/kei-auth/Cargo.toml | bb941dd2 |
|
| kei-auth | primitive::cli,hash,… | _primitives/_rust/kei-auth/Cargo.toml | 28e0b700 |
|
||||||
| kei-auth-apple | primitive::md,networ… | _primitives/_rust/kei-auth-apple/Cargo.toml | 29ddf78c |
|
| kei-auth-apple | primitive::md,networ… | _primitives/_rust/kei-auth-apple/Cargo.toml | 166a2e48 |
|
||||||
| kei-auth-google | primitive::md,networ… | _primitives/_rust/kei-auth-google/Cargo.toml | 49664ff6 |
|
| kei-auth-google | primitive::md,networ… | _primitives/_rust/kei-auth-google/Cargo.toml | 0ff85382 |
|
||||||
| kei-auth-magiclink | primitive::hash,md,n… | _primitives/_rust/kei-auth-magiclink/Cargo.toml | 526ecba4 |
|
| kei-auth-magiclink | primitive::hash,md,n… | _primitives/_rust/kei-auth-magiclink/Cargo.toml | 96da0df3 |
|
||||||
| kei-auth-webauthn | primitive::md,networ… | _primitives/_rust/kei-auth-webauthn/Cargo.toml | 4ad3dfc1 |
|
| kei-auth-webauthn | primitive::md,networ… | _primitives/_rust/kei-auth-webauthn/Cargo.toml | 4560153e |
|
||||||
| kei-backend-daytona | primitive::md,networ… | _primitives/_rust/kei-backend-daytona/Cargo.toml | 83b09611 |
|
| kei-backend-daytona | primitive::md,networ… | _primitives/_rust/kei-backend-daytona/Cargo.toml | 4b57d079 |
|
||||||
| kei-brain-view | primitive::cli,md,sq… | _primitives/_rust/kei-brain-view/Cargo.toml | ecad62ab |
|
| kei-brain-view | primitive::cli,md,sq… | _primitives/_rust/kei-brain-view/Cargo.toml | d9d812f1 |
|
||||||
| kei-cache | primitive::cli,hash,… | _primitives/_rust/kei-cache/Cargo.toml | 77c8ff97 |
|
| kei-cache | primitive::cli,hash,… | _primitives/_rust/kei-cache/Cargo.toml | 9d482614 |
|
||||||
| kei-capability | primitive::cli,md::d… | _primitives/_rust/kei-capability/Cargo.toml | 6a5b93b1 |
|
| kei-capability | primitive::cli,md::d… | _primitives/_rust/kei-capability/Cargo.toml | daf6cc6b |
|
||||||
| kei-changelog | primitive::cli,regex… | _primitives/_rust/kei-changelog/Cargo.toml | 3753d7ec |
|
| kei-changelog | primitive::cli,regex… | _primitives/_rust/kei-changelog/Cargo.toml | 1146ef08 |
|
||||||
| kei-chat-store | primitive::cli,md,sq… | _primitives/_rust/kei-chat-store/Cargo.toml | ecae9608 |
|
| kei-chat-store | primitive::cli,md,sq… | _primitives/_rust/kei-chat-store/Cargo.toml | 87fa079c |
|
||||||
| kei-compute-baremetal | primitive::cli,md,ne… | _primitives/_rust/kei-compute-baremetal/Cargo.toml | 5b90defe |
|
| kei-compute-baremetal | primitive::cli,md,ne… | _primitives/_rust/kei-compute-baremetal/Cargo.toml | 1dd98120 |
|
||||||
| kei-compute-digitalocean | primitive::md,networ… | _primitives/_rust/kei-compute-digitalocean/Cargo.toml | 369b3a00 |
|
| kei-compute-digitalocean | primitive::md,networ… | _primitives/_rust/kei-compute-digitalocean/Cargo.toml | e502d22d |
|
||||||
| kei-compute-linode | primitive::cli,md,ne… | _primitives/_rust/kei-compute-linode/Cargo.toml | f63c4aa6 |
|
| kei-compute-linode | primitive::cli,md,ne… | _primitives/_rust/kei-compute-linode/Cargo.toml | df87593e |
|
||||||
| kei-compute-vultr | primitive::cli,md,ne… | _primitives/_rust/kei-compute-vultr/Cargo.toml | 4cb6c0b7 |
|
| kei-compute-vultr | primitive::cli,md,ne… | _primitives/_rust/kei-compute-vultr/Cargo.toml | eb1cd34c |
|
||||||
| kei-conflict-scan | primitive::cli,fs,md… | _primitives/_rust/kei-conflict-scan/Cargo.toml | 381b80ad |
|
| kei-conflict-scan | primitive::cli,fs,md… | _primitives/_rust/kei-conflict-scan/Cargo.toml | dee396b9 |
|
||||||
| kei-content-store | primitive::cli,hash,… | _primitives/_rust/kei-content-store/Cargo.toml | 11ed9bd8 |
|
| kei-content-store | primitive::cli,hash,… | _primitives/_rust/kei-content-store/Cargo.toml | ea462cc4 |
|
||||||
| kei-cortex::kei-cortex | primitive::_::b9680d… | _primitives/_rust/kei-cortex/Cargo.toml | 213f02fc |
|
| kei-cortex | primitive::cli,fs,md… | _primitives/_rust/kei-cortex/Cargo.toml | 47d1b6ba |
|
||||||
| kei-cron-scheduler | primitive::md,networ… | _primitives/_rust/kei-cron-scheduler/Cargo.toml | da2674f5 |
|
| kei-cron-scheduler | primitive::md,networ… | _primitives/_rust/kei-cron-scheduler/Cargo.toml | a702296b |
|
||||||
| kei-crossdomain | primitive::cli,md,sq… | _primitives/_rust/kei-crossdomain/Cargo.toml | 7a263b47 |
|
| kei-crossdomain | primitive::cli,md,sq… | _primitives/_rust/kei-crossdomain/Cargo.toml | b8e72f87 |
|
||||||
| kei-curator | primitive::cli,md,sq… | _primitives/_rust/kei-curator/Cargo.toml | dad1e6e3 |
|
| kei-curator | primitive::cli,md,sq… | _primitives/_rust/kei-curator/Cargo.toml | b244d7b8 |
|
||||||
| kei-db-contract::kei-db-contract | primitive::_::ef3f4c… | _primitives/_rust/kei-db-contract/Cargo.toml | 2ef926dc |
|
| kei-db-contract | primitive::cli,fs,md… | _primitives/_rust/kei-db-contract/Cargo.toml | d29338b0 |
|
||||||
| kei-decision | primitive::cli,fs,md… | _primitives/_rust/kei-decision/Cargo.toml | 29049ab5 |
|
| kei-decision | primitive::cli,fs,md… | _primitives/_rust/kei-decision/Cargo.toml | ec7583ad |
|
||||||
| kei-decompose | primitive::cli,fs,md… | _primitives/_rust/kei-decompose/Cargo.toml | 7495424e |
|
| kei-decompose | primitive::cli,fs,md… | _primitives/_rust/kei-decompose/Cargo.toml | d08c5b40 |
|
||||||
| kei-diff | primitive::md::2f52c… | _primitives/_rust/kei-diff/Cargo.toml | 0b1d7d44 |
|
| kei-diff | primitive::md::2f52c… | _primitives/_rust/kei-diff/Cargo.toml | 5503a110 |
|
||||||
| kei-discover | primitive::cli,md,sq… | _primitives/_rust/kei-discover/Cargo.toml | 9e30c653 |
|
| kei-discover | primitive::cli,md,sq… | _primitives/_rust/kei-discover/Cargo.toml | 88c299e4 |
|
||||||
| kei-dna-index | primitive::cli,md,sq… | _primitives/_rust/kei-dna-index/Cargo.toml | d4050bea |
|
| kei-dna-index | primitive::cli,md,sq… | _primitives/_rust/kei-dna-index/Cargo.toml | 6a5b990e |
|
||||||
| kei-entity-store | primitive::md,sqlite… | _primitives/_rust/kei-entity-store/Cargo.toml | e0856206 |
|
| kei-entity-store | primitive::md,sqlite… | _primitives/_rust/kei-entity-store/Cargo.toml | 3c138274 |
|
||||||
| kei-export-trajectories | primitive::cli,md,sq… | _primitives/_rust/kei-export-trajectories/Cargo.toml | 55753570 |
|
| kei-export-trajectories | primitive::cli,md,sq… | _primitives/_rust/kei-export-trajectories/Cargo.toml | d765f055 |
|
||||||
| kei-forge | primitive::md,networ… | _primitives/_rust/kei-forge/Cargo.toml | b11967b7 |
|
| kei-forge | primitive::md,networ… | _primitives/_rust/kei-forge/Cargo.toml | e9116d6a |
|
||||||
| kei-fork | primitive::cli,md,sq… | _primitives/_rust/kei-fork/Cargo.toml | 980d5588 |
|
| kei-fork | primitive::cli,md,sq… | _primitives/_rust/kei-fork/Cargo.toml | a3252cb9 |
|
||||||
| kei-frustration-loop | primitive::cli,fs,md… | _primitives/_rust/kei-frustration-loop/Cargo.toml | 474e1d3d |
|
| kei-frustration-loop | primitive::cli,fs,md… | _primitives/_rust/kei-frustration-loop/Cargo.toml | 8bf9dddb |
|
||||||
| kei-gateway | primitive::md,networ… | _primitives/_rust/kei-gateway/Cargo.toml | 28d41236 |
|
| kei-gateway | primitive::md,networ… | _primitives/_rust/kei-gateway/Cargo.toml | 91173d2d |
|
||||||
| kei-gdrive-import | primitive::cli,md::c… | _primitives/_rust/kei-gdrive-import/Cargo.toml | 99ffbed8 |
|
| kei-gdrive-import | primitive::cli,md::c… | _primitives/_rust/kei-gdrive-import/Cargo.toml | d5b115ef |
|
||||||
| kei-git-bitbucket | primitive::md,networ… | _primitives/_rust/kei-git-bitbucket/Cargo.toml | 85c850ba |
|
| kei-git-bitbucket | primitive::md,networ… | _primitives/_rust/kei-git-bitbucket/Cargo.toml | b2298cc9 |
|
||||||
| kei-git-forgejo | primitive::md,networ… | _primitives/_rust/kei-git-forgejo/Cargo.toml | a0f19163 |
|
| kei-git-forgejo | primitive::md,networ… | _primitives/_rust/kei-git-forgejo/Cargo.toml | d71efb0f |
|
||||||
| kei-git-gitea | primitive::md,networ… | _primitives/_rust/kei-git-gitea/Cargo.toml | ea30f0cc |
|
| kei-git-gitea | primitive::md,networ… | _primitives/_rust/kei-git-gitea/Cargo.toml | 0de210a2 |
|
||||||
| kei-git-gitlab | primitive::md,networ… | _primitives/_rust/kei-git-gitlab/Cargo.toml | 744859c4 |
|
| kei-git-gitlab | primitive::md,networ… | _primitives/_rust/kei-git-gitlab/Cargo.toml | 59a5271b |
|
||||||
| kei-graph-check | primitive::cli,fs,md… | _primitives/_rust/kei-graph-check/Cargo.toml | e08f240e |
|
| kei-graph-check | primitive::cli,fs,md… | _primitives/_rust/kei-graph-check/Cargo.toml | 2c0e38d8 |
|
||||||
| kei-hibernate | primitive::cli,hash,… | _primitives/_rust/kei-hibernate/Cargo.toml | 25f6d5bc |
|
| kei-hibernate | primitive::cli,hash,… | _primitives/_rust/kei-hibernate/Cargo.toml | 1ea136f5 |
|
||||||
| kei-import-project | primitive::cli,fs,ha… | _primitives/_rust/kei-import-project/Cargo.toml | aa3750a0 |
|
| kei-import-project | primitive::cli,fs,ha… | _primitives/_rust/kei-import-project/Cargo.toml | 2de0fd64 |
|
||||||
| kei-leak-matrix | primitive::cli,fs,md… | _primitives/_rust/kei-leak-matrix/Cargo.toml | 06a89af2 |
|
| kei-leak-matrix | primitive::cli,fs,md… | _primitives/_rust/kei-leak-matrix/Cargo.toml | a3803ef9 |
|
||||||
| kei-ledger | primitive::cli,md,sq… | _primitives/_rust/kei-ledger/Cargo.toml | 8d59d685 |
|
| kei-ledger | primitive::cli,md,sq… | _primitives/_rust/kei-ledger/Cargo.toml | 269810bf |
|
||||||
| kei-ledger-sign | primitive::cli,md::e… | _primitives/_rust/kei-ledger-sign/Cargo.toml | 339bd55a |
|
| kei-ledger-sign | primitive::cli,md::e… | _primitives/_rust/kei-ledger-sign/Cargo.toml | c12a2016 |
|
||||||
| kei-llm-bridge-mlx | primitive::network::… | _primitives/_rust/kei-llm-bridge-mlx/Cargo.toml | 23e9e5b8 |
|
| kei-llm-bridge-mlx | primitive::network::… | _primitives/_rust/kei-llm-bridge-mlx/Cargo.toml | b09d3703 |
|
||||||
| kei-llm-llamacpp | primitive::cli,md,ne… | _primitives/_rust/kei-llm-llamacpp/Cargo.toml | 8cd7b0c0 |
|
| kei-llm-llamacpp | primitive::cli,md,ne… | _primitives/_rust/kei-llm-llamacpp/Cargo.toml | d6781358 |
|
||||||
| kei-llm-mlx | primitive::cli,md,ne… | _primitives/_rust/kei-llm-mlx/Cargo.toml | 9fb79f0f |
|
| kei-llm-mlx | primitive::cli,md,ne… | _primitives/_rust/kei-llm-mlx/Cargo.toml | d276d3e6 |
|
||||||
| kei-llm-ollama | primitive::cli,md,ne… | _primitives/_rust/kei-llm-ollama/Cargo.toml | cb99ce2c |
|
| kei-llm-ollama | primitive::cli,md,ne… | _primitives/_rust/kei-llm-ollama/Cargo.toml | 6876e1e7 |
|
||||||
| kei-llm-router | primitive::cli,md,ne… | _primitives/_rust/kei-llm-router/Cargo.toml | bd772802 |
|
| kei-llm-router | primitive::cli,md,ne… | _primitives/_rust/kei-llm-router/Cargo.toml | a59cb2e9 |
|
||||||
| kei-machine-probe | primitive::cli,md,re… | _primitives/_rust/kei-machine-probe/Cargo.toml | 634b2e86 |
|
| kei-machine-probe | primitive::cli,md,re… | _primitives/_rust/kei-machine-probe/Cargo.toml | 6810f0b5 |
|
||||||
| kei-mcp | primitive::md,networ… | _primitives/_rust/kei-mcp/Cargo.toml | 3425ff56 |
|
| kei-mcp | primitive::md,networ… | _primitives/_rust/kei-mcp/Cargo.toml | 3a39649c |
|
||||||
| kei-memory-postgres | primitive::md,networ… | _primitives/_rust/kei-memory-postgres/Cargo.toml | a9da92d3 |
|
| kei-memory | primitive::cli,md,re… | _primitives/_rust/kei-memory/Cargo.toml | 654e3516 |
|
||||||
| kei-memory-redis | primitive::md,networ… | _primitives/_rust/kei-memory-redis/Cargo.toml | fd7a49a9 |
|
| kei-memory-postgres | primitive::md,networ… | _primitives/_rust/kei-memory-postgres/Cargo.toml | c95bff7d |
|
||||||
| kei-memory-sled | primitive::md,networ… | _primitives/_rust/kei-memory-sled/Cargo.toml | 6bd5485f |
|
| kei-memory-redis | primitive::md,networ… | _primitives/_rust/kei-memory-redis/Cargo.toml | e749b491 |
|
||||||
| kei-memory-sqlite | primitive::md,networ… | _primitives/_rust/kei-memory-sqlite/Cargo.toml | f64bbb1d |
|
| kei-memory-sled | primitive::md,networ… | _primitives/_rust/kei-memory-sled/Cargo.toml | 6fdae904 |
|
||||||
| kei-memory::kei-memory | primitive::_::e47cd8… | _primitives/_rust/kei-memory/Cargo.toml | 0dd1dfc8 |
|
| kei-memory-sqlite | primitive::md,networ… | _primitives/_rust/kei-memory-sqlite/Cargo.toml | 93761682 |
|
||||||
| kei-migrate | primitive::cli,hash,… | _primitives/_rust/kei-migrate/Cargo.toml | db2e7bd0 |
|
| kei-migrate | primitive::cli,hash,… | _primitives/_rust/kei-migrate/Cargo.toml | fd996e76 |
|
||||||
| kei-model | primitive::cli,md,re… | _primitives/_rust/kei-model/Cargo.toml | 0a6ce8bc |
|
| kei-model-router | primitive::md,sqlite… | _primitives/_rust/kei-model-router/Cargo.toml | b67e44b9 |
|
||||||
| kei-model-router | primitive::md,sqlite… | _primitives/_rust/kei-model-router/Cargo.toml | 1280a1dd |
|
| kei-model::kei-model | primitive::_::6a479a… | _primitives/_rust/kei-model/Cargo.toml | 3f74b167 |
|
||||||
| kei-net-ipsec | primitive::md,networ… | _primitives/_rust/kei-net-ipsec/Cargo.toml | 600684a8 |
|
| kei-net-ipsec | primitive::md,networ… | _primitives/_rust/kei-net-ipsec/Cargo.toml | edb79478 |
|
||||||
| kei-net-openvpn | primitive::md,networ… | _primitives/_rust/kei-net-openvpn/Cargo.toml | d4c94d69 |
|
| kei-net-openvpn | primitive::md,networ… | _primitives/_rust/kei-net-openvpn/Cargo.toml | a209e645 |
|
||||||
| kei-net-wireguard | primitive::md,networ… | _primitives/_rust/kei-net-wireguard/Cargo.toml | e2c8fab8 |
|
| kei-net-wireguard | primitive::md,networ… | _primitives/_rust/kei-net-wireguard/Cargo.toml | 05a75c60 |
|
||||||
| kei-notify-discord | primitive::md,networ… | _primitives/_rust/kei-notify-discord/Cargo.toml | 1060b266 |
|
| kei-notify-discord | primitive::md,networ… | _primitives/_rust/kei-notify-discord/Cargo.toml | a080b52b |
|
||||||
| kei-notify-slack | primitive::md,networ… | _primitives/_rust/kei-notify-slack/Cargo.toml | 6ecc85e5 |
|
| kei-notify-slack | primitive::md,networ… | _primitives/_rust/kei-notify-slack/Cargo.toml | 241f0aa1 |
|
||||||
| kei-notify-sms | primitive::md,networ… | _primitives/_rust/kei-notify-sms/Cargo.toml | 97776ab9 |
|
| kei-notify-sms | primitive::md,networ… | _primitives/_rust/kei-notify-sms/Cargo.toml | d0fb8237 |
|
||||||
| kei-notify-telegram | primitive::md,networ… | _primitives/_rust/kei-notify-telegram/Cargo.toml | b2384d0d |
|
| kei-notify-telegram | primitive::md,networ… | _primitives/_rust/kei-notify-telegram/Cargo.toml | d3bff93d |
|
||||||
| kei-pet | primitive::cli,hash,… | _primitives/_rust/kei-pet/Cargo.toml | 8b7b8ee7 |
|
| kei-pet | primitive::cli,hash,… | _primitives/_rust/kei-pet/Cargo.toml | 2af7e9fd |
|
||||||
| kei-ping | primitive::md,networ… | _primitives/_rust/kei-ping/Cargo.toml | d0c626c3 |
|
| kei-ping | primitive::md,networ… | _primitives/_rust/kei-ping/Cargo.toml | 23b06c85 |
|
||||||
| kei-pipe | primitive::cli,md,sq… | _primitives/_rust/kei-pipe/Cargo.toml | 3efc46a4 |
|
| kei-pipe | primitive::cli,md,sq… | _primitives/_rust/kei-pipe/Cargo.toml | a23aec78 |
|
||||||
| kei-projects-index | primitive::cli,fs,md… | _primitives/_rust/kei-projects-index/Cargo.toml | ce1576f0 |
|
| kei-projects-index | primitive::cli,fs,md… | _primitives/_rust/kei-projects-index/Cargo.toml | c5ecb5ee |
|
||||||
| kei-projects-watcher | primitive::cli,md,ne… | _primitives/_rust/kei-projects-watcher/Cargo.toml | dedc5323 |
|
| kei-projects-watcher | primitive::cli,md,ne… | _primitives/_rust/kei-projects-watcher/Cargo.toml | dd3a3b8c |
|
||||||
| kei-provision | primitive::cli,md::1… | _primitives/_rust/kei-provision/Cargo.toml | 1d613e5d |
|
| kei-provision | primitive::cli,md::1… | _primitives/_rust/kei-provision/Cargo.toml | cfa53bb3 |
|
||||||
| kei-prune | primitive::cli,md,sq… | _primitives/_rust/kei-prune/Cargo.toml | 7c0a0c11 |
|
| kei-prune | primitive::cli,md,sq… | _primitives/_rust/kei-prune/Cargo.toml | 4454513b |
|
||||||
| kei-refactor-engine | primitive::cli,md::c… | _primitives/_rust/kei-refactor-engine/Cargo.toml | 90048888 |
|
| kei-refactor-engine | primitive::cli,md::c… | _primitives/_rust/kei-refactor-engine/Cargo.toml | 92e83ce0 |
|
||||||
| kei-registry::foo | primitive::_::12366c… | _primitives/_rust/kei-registry/tests/fixtures/fake-kit/_primitives/_rust/foo/Cargo.toml | 403bc4b0 |
|
| kei-registry::foo | primitive::_::12366c… | _primitives/_rust/kei-registry/tests/fixtures/fake-kit/_primitives/_rust/foo/Cargo.toml | 403bc4b0 |
|
||||||
| kei-registry::kei-registry | primitive::_::4744f0… | _primitives/_rust/kei-registry/Cargo.toml | 30e6dee3 |
|
| kei-registry::foo | primitive::_::3937fa… | _primitives/_rust/kei-registry/tests/fixtures/fake-kit/_primitives/_rust/foo/Cargo.toml | 403bc4b0 |
|
||||||
|
| kei-registry::kei-registry | primitive::_::30e60a… | _primitives/_rust/kei-registry/Cargo.toml | d5146bbd |
|
||||||
|
| kei-registry::kei-registry | primitive::_::4744f0… | _primitives/_rust/kei-registry/Cargo.toml | 4e595599 |
|
||||||
| kei-registry::mini-prim | primitive::_::57f8eb… | _primitives/_rust/kei-registry/tests/fixtures/mini-kit/_primitives/_rust/mini-prim/Cargo.toml | 9fa2b304 |
|
| kei-registry::mini-prim | primitive::_::57f8eb… | _primitives/_rust/kei-registry/tests/fixtures/mini-kit/_primitives/_rust/mini-prim/Cargo.toml | 9fa2b304 |
|
||||||
| kei-replay | primitive::cli,hash,… | _primitives/_rust/kei-replay/Cargo.toml | 420ceb46 |
|
| kei-registry::mini-prim | primitive::_::bb2052… | _primitives/_rust/kei-registry/tests/fixtures/mini-kit/_primitives/_rust/mini-prim/Cargo.toml | 9fa2b304 |
|
||||||
| kei-router::kei-router | primitive::_::1e654e… | _primitives/_rust/kei-router/Cargo.toml | 98ab93cd |
|
| kei-replay | primitive::cli,hash,… | _primitives/_rust/kei-replay/Cargo.toml | 74f2fcc4 |
|
||||||
| kei-runtime | primitive::cli,fs,md… | _primitives/_rust/kei-runtime/Cargo.toml | 44b695ea |
|
| kei-router | primitive::cli,md,ne… | _primitives/_rust/kei-router/Cargo.toml | 2cfaa362 |
|
||||||
| kei-runtime-core | primitive::hash,md,n… | _primitives/_rust/kei-runtime-core/Cargo.toml | 100eec0c |
|
| kei-runtime | primitive::cli,fs,md… | _primitives/_rust/kei-runtime/Cargo.toml | c19f68cf |
|
||||||
| kei-sage | primitive::cli,fs,md… | _primitives/_rust/kei-sage/Cargo.toml | 773af2fd |
|
| kei-runtime-core | primitive::hash,md,n… | _primitives/_rust/kei-runtime-core/Cargo.toml | dedb3de0 |
|
||||||
| kei-scheduler | primitive::cli,md,sq… | _primitives/_rust/kei-scheduler/Cargo.toml | 589d4c96 |
|
| kei-sage | primitive::cli,fs,md… | _primitives/_rust/kei-sage/Cargo.toml | e7617e42 |
|
||||||
| kei-search-core | primitive::cli,md,sq… | _primitives/_rust/kei-search-core/Cargo.toml | 3e15b74a |
|
| kei-scheduler | primitive::cli,md,sq… | _primitives/_rust/kei-scheduler/Cargo.toml | b20fdba2 |
|
||||||
| kei-shared | primitive::md::9db37… | _primitives/_rust/kei-shared/Cargo.toml | 5990b174 |
|
| kei-search-core | primitive::cli,md,sq… | _primitives/_rust/kei-search-core/Cargo.toml | 7f980b0f |
|
||||||
| kei-skill-importer | primitive::cli,fs,md… | _primitives/_rust/kei-skill-importer/Cargo.toml | 18270170 |
|
| kei-shared | primitive::md::9db37… | _primitives/_rust/kei-shared/Cargo.toml | c9abc1ac |
|
||||||
| kei-skills | primitive::fs,md,reg… | _primitives/_rust/kei-skills/Cargo.toml | 0bc302bc |
|
| kei-skill-importer | primitive::cli,fs,md… | _primitives/_rust/kei-skill-importer/Cargo.toml | 8a09d39e |
|
||||||
| kei-social-store | primitive::cli,md,sq… | _primitives/_rust/kei-social-store/Cargo.toml | 901fa890 |
|
| kei-skills | primitive::fs,md,reg… | _primitives/_rust/kei-skills/Cargo.toml | 9b27964c |
|
||||||
| kei-spawn | primitive::cli,hash,… | _primitives/_rust/kei-spawn/Cargo.toml | fd3b3939 |
|
| kei-social-store | primitive::cli,md,sq… | _primitives/_rust/kei-social-store/Cargo.toml | f5409d5f |
|
||||||
| kei-store | primitive::cli,md,ne… | _primitives/_rust/kei-store/Cargo.toml | 381485a1 |
|
| kei-spawn | primitive::cli,hash,… | _primitives/_rust/kei-spawn/Cargo.toml | fd4e54ad |
|
||||||
| kei-svc-systemd | primitive::cli,md,ne… | _primitives/_rust/kei-svc-systemd/Cargo.toml | 13da0fd2 |
|
| kei-store | primitive::cli,md,ne… | _primitives/_rust/kei-store/Cargo.toml | cd08369f |
|
||||||
| kei-task | primitive::cli,md,sq… | _primitives/_rust/kei-task/Cargo.toml | f1204d34 |
|
| kei-svc-systemd | primitive::cli,md,ne… | _primitives/_rust/kei-svc-systemd/Cargo.toml | cb3a6e65 |
|
||||||
| kei-tlog | primitive::md::9efee… | _primitives/_rust/kei-tlog/Cargo.toml | 8a4a1f56 |
|
| kei-task | primitive::cli,md,sq… | _primitives/_rust/kei-task/Cargo.toml | bba6a7b7 |
|
||||||
| kei-token-tracker::kei-token-tracker | primitive::_::bd583f… | _primitives/_rust/kei-token-tracker/Cargo.toml | 28bdb3b1 |
|
| kei-tlog | primitive::md::9efee… | _primitives/_rust/kei-tlog/Cargo.toml | b3a16003 |
|
||||||
| kei-tty | primitive::cli,md,ne… | _primitives/_rust/kei-tty/Cargo.toml | 42f78a71 |
|
| kei-token-tracker | primitive::cli,md,sq… | _primitives/_rust/kei-token-tracker/Cargo.toml | 16feb4d4 |
|
||||||
| kei-watch | primitive::cli,md::2… | _primitives/_rust/kei-watch/Cargo.toml | c7e67afd |
|
| kei-tty | primitive::cli,md,ne… | _primitives/_rust/kei-tty/Cargo.toml | fa00dbff |
|
||||||
| keisei | primitive::cli,md,re… | _primitives/_rust/keisei/Cargo.toml | 6911bb1e |
|
| kei-watch | primitive::cli,md::2… | _primitives/_rust/kei-watch/Cargo.toml | 5889eebd |
|
||||||
| mock-render | primitive::hash,md::… | _primitives/_rust/mock-render/Cargo.toml | 99b0927a |
|
| keisei | primitive::cli,md,re… | _primitives/_rust/keisei/Cargo.toml | 94467a31 |
|
||||||
| ssh-check | primitive::cli,md::8… | _primitives/_rust/ssh-check/Cargo.toml | f419e2b0 |
|
| mock-render | primitive::hash,md::… | _primitives/_rust/mock-render/Cargo.toml | f5f4d966 |
|
||||||
| tokens-sync | primitive::md::32f10… | _primitives/_rust/tokens-sync/Cargo.toml | 54c149ab |
|
| ssh-check | primitive::cli,md::8… | _primitives/_rust/ssh-check/Cargo.toml | ebd97541 |
|
||||||
| visual-diff | primitive::_::d495df… | _primitives/_rust/visual-diff/Cargo.toml | 557bdc21 |
|
| tokens-sync | primitive::md::32f10… | _primitives/_rust/tokens-sync/Cargo.toml | 69857925 |
|
||||||
|
| visual-diff | primitive::_::d495df… | _primitives/_rust/visual-diff/Cargo.toml | 4516e372 |
|
||||||
|
|
||||||
## Skill (68)
|
## Skill (68)
|
||||||
|
|
||||||
|
|
@ -835,12 +838,13 @@ Sorted alphabetically by name.
|
||||||
| sleep-layer::the-rule | rule::_::576bbb7f::d… | d0e03a0d |
|
| sleep-layer::the-rule | rule::_::576bbb7f::d… | d0e03a0d |
|
||||||
|
|
||||||
|
|
||||||
## Hook (36)
|
## Hook (40)
|
||||||
|
|
||||||
Sorted alphabetically by name.
|
Sorted alphabetically by name.
|
||||||
|
|
||||||
| Name | Event | DNA prefix | Path |
|
| Name | Event | DNA prefix | Path |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
|
| affect-live-scan | shell | hook::shell::b7f9b36… | hooks/affect-live-scan.sh |
|
||||||
| agent-capability-check | shell | hook::shell::eab55b0… | hooks/agent-capability-check.sh |
|
| agent-capability-check | shell | hook::shell::eab55b0… | hooks/agent-capability-check.sh |
|
||||||
| agent-capability-verify | shell | hook::shell::86c19ba… | hooks/agent-capability-verify.sh |
|
| agent-capability-verify | shell | hook::shell::86c19ba… | hooks/agent-capability-verify.sh |
|
||||||
| agent-fork-done | shell | hook::shell::eeaa011… | hooks/agent-fork-done.sh |
|
| agent-fork-done | shell | hook::shell::eeaa011… | hooks/agent-fork-done.sh |
|
||||||
|
|
@ -851,9 +855,12 @@ Sorted alphabetically by name.
|
||||||
| assemble-agents | shell | hook::shell::9cd98a7… | hooks/assemble-agents.sh |
|
| assemble-agents | shell | hook::shell::9cd98a7… | hooks/assemble-agents.sh |
|
||||||
| assemble-validate | shell | hook::shell::eace6b3… | hooks/assemble-validate.sh |
|
| assemble-validate | shell | hook::shell::eace6b3… | hooks/assemble-validate.sh |
|
||||||
| auto-dev-guard | shell | hook::shell::96e1fb2… | hooks/auto-dev-guard.sh |
|
| auto-dev-guard | shell | hook::shell::96e1fb2… | hooks/auto-dev-guard.sh |
|
||||||
|
| auto-encyclopedia-refresh | shell | hook::shell::e585647… | hooks/auto-encyclopedia-refresh.sh |
|
||||||
|
| auto-register-on-edit | shell | hook::shell::80be71a… | hooks/auto-register-on-edit.sh |
|
||||||
| block-dangerous | shell | hook::shell::e26e2af… | hooks/block-dangerous.sh |
|
| block-dangerous | shell | hook::shell::e26e2af… | hooks/block-dangerous.sh |
|
||||||
| check-error-patterns | shell | hook::shell::3bdab81… | hooks/check-error-patterns.sh |
|
| check-error-patterns | shell | hook::shell::3bdab81… | hooks/check-error-patterns.sh |
|
||||||
| citation-verify | shell | hook::shell::180a844… | hooks/citation-verify.sh |
|
| citation-verify | shell | hook::shell::180a844… | hooks/citation-verify.sh |
|
||||||
|
| decompose-rules-on-edit | shell | hook::shell::d504b63… | hooks/decompose-rules-on-edit.sh |
|
||||||
| destructive-guard | shell | hook::shell::f1d2325… | hooks/destructive-guard.sh |
|
| destructive-guard | shell | hook::shell::f1d2325… | hooks/destructive-guard.sh |
|
||||||
| disk-headroom-check | shell | hook::shell::b375667… | hooks/disk-headroom-check.sh |
|
| disk-headroom-check | shell | hook::shell::b375667… | hooks/disk-headroom-check.sh |
|
||||||
| disk-reclaim | shell | hook::shell::47b7bf4… | hooks/disk-reclaim.sh |
|
| disk-reclaim | shell | hook::shell::47b7bf4… | hooks/disk-reclaim.sh |
|
||||||
|
|
@ -878,7 +885,7 @@ Sorted alphabetically by name.
|
||||||
| task-timer | shell | hook::shell::dda5e94… | hooks/task-timer.sh |
|
| task-timer | shell | hook::shell::dda5e94… | hooks/task-timer.sh |
|
||||||
| tomd-preread | shell | hook::shell::8a95b76… | hooks/tomd-preread.sh |
|
| tomd-preread | shell | hook::shell::8a95b76… | hooks/tomd-preread.sh |
|
||||||
|
|
||||||
## Atom (117)
|
## Atom (121)
|
||||||
|
|
||||||
Sorted alphabetically by name.
|
Sorted alphabetically by name.
|
||||||
|
|
||||||
|
|
@ -912,7 +919,7 @@ Sorted alphabetically by name.
|
||||||
| DEPLOY — Generic VPS (provider-agnostic cloud-init + ssh-first-contact) | atom::_::1e1a442e::c… | _blocks/deploy-vps-generic.md | c278455b |
|
| DEPLOY — Generic VPS (provider-agnostic cloud-init + ssh-first-contact) | atom::_::1e1a442e::c… | _blocks/deploy-vps-generic.md | c278455b |
|
||||||
| DEPLOY — Hetzner Cloud (CX22 / CAX11 + TF + Cloud Firewall) | atom::_::3760e45f::b… | _blocks/deploy-hetzner-cloud.md | b6340db6 |
|
| DEPLOY — Hetzner Cloud (CX22 / CAX11 + TF + Cloud Firewall) | atom::_::3760e45f::b… | _blocks/deploy-hetzner-cloud.md | b6340db6 |
|
||||||
| DEPLOY — LOCAL ONLY (sensitive / pre-disclosure project) | atom::_::67c56d06::0… | _blocks/deploy-local-only.md | 0ed597d2 |
|
| DEPLOY — LOCAL ONLY (sensitive / pre-disclosure project) | atom::_::67c56d06::0… | _blocks/deploy-local-only.md | 0ed597d2 |
|
||||||
| DEPLOY — Modal (GPU compute) | atom::_::a3e3aa06::9… | _blocks/deploy-modal.md | 9598fb12 |
|
| DEPLOY — Modal (GPU compute) | atom::_::a3e3aa06::e… | _blocks/deploy-modal.md | e3c07b09 |
|
||||||
| DOCS — Architecture diagrams (Mermaid) | atom::_::e87474f7::7… | _blocks/docs-architecture-diagrams.md | 7ae83b02 |
|
| DOCS — Architecture diagrams (Mermaid) | atom::_::e87474f7::7… | _blocks/docs-architecture-diagrams.md | 7ae83b02 |
|
||||||
| DOCS — Operational runbook template | atom::_::c130bd64::d… | _blocks/docs-runbook.md | d28961e0 |
|
| DOCS — Operational runbook template | atom::_::c130bd64::d… | _blocks/docs-runbook.md | d28961e0 |
|
||||||
| DOCS — Public `README.md` scaffold | atom::_::c616c9c0::9… | _blocks/docs-readme-template.md | 9f54ac42 |
|
| DOCS — Public `README.md` scaffold | atom::_::c616c9c0::9… | _blocks/docs-readme-template.md | 9f54ac42 |
|
||||||
|
|
@ -929,7 +936,7 @@ Sorted alphabetically by name.
|
||||||
| EVIDENCE GRADING | atom::_::a96dc5e7::1… | _blocks/evidence-grading.md | 1f53dd20 |
|
| EVIDENCE GRADING | atom::_::a96dc5e7::1… | _blocks/evidence-grading.md | 1f53dd20 |
|
||||||
| MATH FIRST (mandatory for ML / physics / theory work) | atom::_::85d26d3e::c… | _blocks/rule-math-first.md | c4be5d41 |
|
| MATH FIRST (mandatory for ML / physics / theory work) | atom::_::85d26d3e::c… | _blocks/rule-math-first.md | c4be5d41 |
|
||||||
| MEMORY PROTOCOL | atom::_::c3633f9a::5… | _blocks/memory-protocol.md | 51fe1c55 |
|
| MEMORY PROTOCOL | atom::_::c3633f9a::5… | _blocks/memory-protocol.md | 51fe1c55 |
|
||||||
| MODE — Agent × Cognitive-Mode Matrix | atom::_::b66bab8c::5… | _blocks/mode-matrix.md | 51067491 |
|
| MODE — Agent × Cognitive-Mode Matrix | atom::_::b66bab8c::e… | _blocks/mode-matrix.md | e9a7019b |
|
||||||
| MODE — Devil's Advocate | atom::_::2dbb2590::4… | _blocks/mode-devils-advocate.md | 4592adea |
|
| MODE — Devil's Advocate | atom::_::2dbb2590::4… | _blocks/mode-devils-advocate.md | 4592adea |
|
||||||
| MODE — First Principles | atom::_::78f84026::5… | _blocks/mode-first-principles.md | 5a96e03c |
|
| MODE — First Principles | atom::_::78f84026::5… | _blocks/mode-first-principles.md | 5a96e03c |
|
||||||
| MODE — Maximalist | atom::_::704957b8::1… | _blocks/mode-maximalist.md | 1e62f540 |
|
| MODE — Maximalist | atom::_::704957b8::1… | _blocks/mode-maximalist.md | 1e62f540 |
|
||||||
|
|
@ -952,7 +959,7 @@ Sorted alphabetically by name.
|
||||||
| STACK — Flutter + Riverpod + Clean Architecture | atom::_::44208b34::b… | _blocks/stack-flutter.md | b66a5b3a |
|
| STACK — Flutter + Riverpod + Clean Architecture | atom::_::44208b34::b… | _blocks/stack-flutter.md | b66a5b3a |
|
||||||
| STACK — Go server | atom::_::cd4d99db::d… | _blocks/stack-go-server.md | dd9dd97c |
|
| STACK — Go server | atom::_::cd4d99db::d… | _blocks/stack-go-server.md | dd9dd97c |
|
||||||
| STACK — Next.js 15/16 (App Router + TS + Server Components) | atom::_::f1e362c9::a… | _blocks/stack-nextjs.md | ab3b00c8 |
|
| STACK — Next.js 15/16 (App Router + TS + Server Components) | atom::_::f1e362c9::a… | _blocks/stack-nextjs.md | ab3b00c8 |
|
||||||
| STACK — Python ML (PyTorch / JAX) | atom::_::ffd80d3c::c… | _blocks/stack-python-ml.md | ceb1fc98 |
|
| STACK — Python ML (PyTorch / JAX) | atom::_::ffd80d3c::4… | _blocks/stack-python-ml.md | 4afd934a |
|
||||||
| STACK — Rust CLI / tooling | atom::_::dfcc02e8::f… | _blocks/stack-rust-cli.md | f9b3d3e1 |
|
| STACK — Rust CLI / tooling | atom::_::dfcc02e8::f… | _blocks/stack-rust-cli.md | f9b3d3e1 |
|
||||||
| STACK — Rust HTTP server (axum + tokio + sqlx) | atom::_::3ff89b59::f… | _blocks/stack-rust-axum.md | ffce850f |
|
| STACK — Rust HTTP server (axum + tokio + sqlx) | atom::_::3ff89b59::f… | _blocks/stack-rust-axum.md | ffce850f |
|
||||||
| STACK — SvelteKit (Svelte 5 Runes + TS) | atom::_::e310ae03::7… | _blocks/stack-sveltekit.md | 7739c3ad |
|
| STACK — SvelteKit (Svelte 5 Runes + TS) | atom::_::e310ae03::7… | _blocks/stack-sveltekit.md | 7739c3ad |
|
||||||
|
|
@ -980,6 +987,7 @@ Sorted alphabetically by name.
|
||||||
| foo | atom::md::63a73aa1::… | _primitives/_rust/kei-registry/tests/fixtures/atom-sample/atom.md | 309b88fa |
|
| foo | atom::md::63a73aa1::… | _primitives/_rust/kei-registry/tests/fixtures/atom-sample/atom.md | 309b88fa |
|
||||||
| foo | atom::md::0f507ef3::… | _primitives/_rust/kei-registry/tests/fixtures/atom-sample/atom.md | 309b88fa |
|
| foo | atom::md::0f507ef3::… | _primitives/_rust/kei-registry/tests/fixtures/atom-sample/atom.md | 309b88fa |
|
||||||
| foo | atom::md::40c9240c::… | _primitives/_rust/kei-registry/tests/fixtures/atom-sample/atom.md | 309b88fa |
|
| foo | atom::md::40c9240c::… | _primitives/_rust/kei-registry/tests/fixtures/atom-sample/atom.md | 309b88fa |
|
||||||
|
| foo | atom::md::077f9361::… | _primitives/_rust/kei-registry/tests/fixtures/atom-sample/atom.md | 309b88fa |
|
||||||
| git-ops | atom::_::6da713d3::d… | _roles/git-ops.toml | da80a8e7 |
|
| git-ops | atom::_::6da713d3::d… | _roles/git-ops.toml | da80a8e7 |
|
||||||
| merger | atom::_::183b6add::a… | _roles/merger.toml | af2bf880 |
|
| merger | atom::_::183b6add::a… | _roles/merger.toml | af2bf880 |
|
||||||
| output::merge-result | atom::output::d58ef5… | _capabilities/output/merge-result/capability.toml | 91cb9245 |
|
| output::merge-result | atom::output::d58ef5… | _capabilities/output/merge-result/capability.toml | 91cb9245 |
|
||||||
|
|
@ -1000,6 +1008,9 @@ Sorted alphabetically by name.
|
||||||
| tools::cargo-only-bash | atom::_::692833ce::9… | _capabilities/tools/cargo-only-bash/capability.toml | 98e70f68 |
|
| tools::cargo-only-bash | atom::_::692833ce::9… | _capabilities/tools/cargo-only-bash/capability.toml | 98e70f68 |
|
||||||
| tools::deny-tools | atom::tools::d64414a… | _capabilities/tools/deny-tools/capability.toml | 8f342dd8 |
|
| tools::deny-tools | atom::tools::d64414a… | _capabilities/tools/deny-tools/capability.toml | 8f342dd8 |
|
||||||
| tools::read-only | atom::_::eded5636::2… | _capabilities/tools/read-only/capability.toml | 22bba452 |
|
| tools::read-only | atom::_::eded5636::2… | _capabilities/tools/read-only/capability.toml | 22bba452 |
|
||||||
|
| user-hooks | atom::md::331b9a34::… | _blocks/path-user-hooks.md | 023e5a08 |
|
||||||
|
| user-memory | atom::md::1a771d51::… | _blocks/path-user-memory.md | b8f9e85f |
|
||||||
|
| user-rules | atom::md::97292045::… | _blocks/path-user-rules.md | bc8e0acf |
|
||||||
| verify::fork-audit | atom::verify::81e519… | _capabilities/verify/fork-audit/capability.toml | 3fb8694d |
|
| verify::fork-audit | atom::verify::81e519… | _capabilities/verify/fork-audit/capability.toml | 3fb8694d |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
@ -1008,14 +1019,134 @@ Sorted alphabetically by name.
|
||||||
|
|
||||||
- `/dev-guard — Continuous Development Guard` — 4 versions: 66daa27e → 59e77fbc → a1f93eb9 → 7ed68721
|
- `/dev-guard — Continuous Development Guard` — 4 versions: 66daa27e → 59e77fbc → a1f93eb9 → 7ed68721
|
||||||
- `/dev-ship — Pre-Merge Quality Gate` — 4 versions: d698e957 → 405cd8c5 → f621cf3c → c124440b
|
- `/dev-ship — Pre-Merge Quality Gate` — 4 versions: d698e957 → 405cd8c5 → f621cf3c → c124440b
|
||||||
- `3D Scene Skill` — 2 versions: e31a87ca → ca06fcac
|
- `3D Scene Skill` — 3 versions: e31a87ca → ca06fcac → e31a87ca
|
||||||
- `foo` — 10 versions: 309b88fa → 309b88fa → 309b88fa → 309b88fa → 309b88fa → 309b88fa → 309b88fa → 309b88fa → 309b88fa → 309b88fa
|
- `DEPLOY — Modal (GPU compute)` — 2 versions: 9598fb12 → e3c07b09
|
||||||
|
- `Escalate Recurrence — Interactive Codifier` — 2 versions: c1111db8 → db16763f
|
||||||
|
- `MODE — Agent × Cognitive-Mode Matrix` — 2 versions: 51067491 → e9a7019b
|
||||||
|
- `New Agent — Project-Specialist Wizard` — 2 versions: dfdaea5c → bcf5a0d9
|
||||||
|
- `STACK — Python ML (PyTorch / JAX)` — 2 versions: ceb1fc98 → 4afd934a
|
||||||
|
- `Self-Audit — Session Retrospective Triage (index)` — 2 versions: 339cb507 → 38fd80b7
|
||||||
|
- `agent-heartbeat-tick` — 2 versions: 5eb00dc3 → 560fa0f8
|
||||||
|
- `alignment-check` — 2 versions: 4e7389b1 → b1e18549
|
||||||
|
- `extract-task-durations` — 2 versions: e6854ef5 → 859873eb
|
||||||
|
- `firewall-diff` — 2 versions: e42f1e32 → 8260ffc0
|
||||||
|
- `foo` — 11 versions: 309b88fa → 309b88fa → 309b88fa → 309b88fa → 309b88fa → 309b88fa → 309b88fa → 309b88fa → 309b88fa → 309b88fa → 309b88fa
|
||||||
|
- `frustration-matrix` — 2 versions: 0923b30a → d51e63c8
|
||||||
|
- `kei-agent-runtime` — 2 versions: 708830d4 → 33b44d6c
|
||||||
|
- `kei-artifact` — 2 versions: 2c55b84a → a33abf97
|
||||||
|
- `kei-atom-discovery` — 2 versions: 0d532c9f → ca9202b5
|
||||||
|
- `kei-auth` — 2 versions: bb941dd2 → 28e0b700
|
||||||
|
- `kei-auth-apple` — 2 versions: 29ddf78c → 166a2e48
|
||||||
|
- `kei-auth-google` — 2 versions: 49664ff6 → 0ff85382
|
||||||
|
- `kei-auth-magiclink` — 2 versions: 526ecba4 → 96da0df3
|
||||||
|
- `kei-auth-webauthn` — 2 versions: 4ad3dfc1 → 4560153e
|
||||||
|
- `kei-backend-daytona` — 2 versions: 83b09611 → 4b57d079
|
||||||
|
- `kei-brain-view` — 2 versions: ecad62ab → d9d812f1
|
||||||
|
- `kei-cache` — 2 versions: 77c8ff97 → 9d482614
|
||||||
|
- `kei-capability` — 2 versions: 6a5b93b1 → daf6cc6b
|
||||||
|
- `kei-changelog` — 2 versions: 3753d7ec → 1146ef08
|
||||||
|
- `kei-chat-store` — 2 versions: ecae9608 → 87fa079c
|
||||||
|
- `kei-compute-baremetal` — 2 versions: 5b90defe → 1dd98120
|
||||||
|
- `kei-compute-digitalocean` — 2 versions: 369b3a00 → e502d22d
|
||||||
|
- `kei-compute-linode` — 2 versions: f63c4aa6 → df87593e
|
||||||
|
- `kei-compute-vultr` — 2 versions: 4cb6c0b7 → eb1cd34c
|
||||||
|
- `kei-conflict-scan` — 2 versions: 381b80ad → dee396b9
|
||||||
|
- `kei-content-store` — 2 versions: 11ed9bd8 → ea462cc4
|
||||||
|
- `kei-cortex` — 2 versions: 4815eb79 → 47d1b6ba
|
||||||
- `kei-cortex::kei-cortex` — 50 versions: 2305a894 → b046411d → 31e30021 → 0e1fdd58 → ee42ea3c → ea55151c → 5a91990e → 48b55962 → 9d197f44 → 44dcf2b8 → f82717c3 → 6beb14d1 → 7c783b8b → 6f4566d6 → ae6673fb → cb55caac → 0544a125 → 906fe71e → dda08557 → a9d9835c → c6bb1a76 → ff69e910 → 8c2a2cd0 → a4f10ba1 → 3e1d80b9 → a42dc172 → 9d1faba6 → 8c098c2a → ed51e643 → 8e611e78 → b0e5fc42 → d5acba40 → ea37b0a2 → ef485e8b → 4ee863b3 → 7b9b0b84 → b75a06c5 → 154d5906 → ccf3586b → bfa4e51e → 2d4d2abe → 5f7a5fac → ae4e5a1a → 81387a8b → 98f37df7 → 1f8a6a5e → a7910ea4 → bcbb7ede → 44165ca9 → 213f02fc
|
- `kei-cortex::kei-cortex` — 50 versions: 2305a894 → b046411d → 31e30021 → 0e1fdd58 → ee42ea3c → ea55151c → 5a91990e → 48b55962 → 9d197f44 → 44dcf2b8 → f82717c3 → 6beb14d1 → 7c783b8b → 6f4566d6 → ae6673fb → cb55caac → 0544a125 → 906fe71e → dda08557 → a9d9835c → c6bb1a76 → ff69e910 → 8c2a2cd0 → a4f10ba1 → 3e1d80b9 → a42dc172 → 9d1faba6 → 8c098c2a → ed51e643 → 8e611e78 → b0e5fc42 → d5acba40 → ea37b0a2 → ef485e8b → 4ee863b3 → 7b9b0b84 → b75a06c5 → 154d5906 → ccf3586b → bfa4e51e → 2d4d2abe → 5f7a5fac → ae4e5a1a → 81387a8b → 98f37df7 → 1f8a6a5e → a7910ea4 → bcbb7ede → 44165ca9 → 213f02fc
|
||||||
|
- `kei-cron-scheduler` — 2 versions: da2674f5 → a702296b
|
||||||
|
- `kei-crossdomain` — 2 versions: 7a263b47 → b8e72f87
|
||||||
|
- `kei-curator` — 2 versions: dad1e6e3 → b244d7b8
|
||||||
- `kei-db-contract::kei-db-contract` — 17 versions: 2e9d962a → 07651211 → e4200114 → facc4312 → 20bb0441 → dcd5de23 → bbd7a9df → 2662f63e → e067292d → e39caba6 → 42411821 → ec449d79 → 48d6d10f → c06e17c1 → 82de90e6 → e4c729d2 → 2ef926dc
|
- `kei-db-contract::kei-db-contract` — 17 versions: 2e9d962a → 07651211 → e4200114 → facc4312 → 20bb0441 → dcd5de23 → bbd7a9df → 2662f63e → e067292d → e39caba6 → 42411821 → ec449d79 → 48d6d10f → c06e17c1 → 82de90e6 → e4c729d2 → 2ef926dc
|
||||||
|
- `kei-decision` — 2 versions: 29049ab5 → ec7583ad
|
||||||
|
- `kei-decompose` — 2 versions: 7495424e → d08c5b40
|
||||||
|
- `kei-diff` — 2 versions: 0b1d7d44 → 5503a110
|
||||||
|
- `kei-discover` — 2 versions: 9e30c653 → 88c299e4
|
||||||
|
- `kei-dna-index` — 2 versions: d4050bea → 6a5b990e
|
||||||
|
- `kei-entity-store` — 2 versions: e0856206 → 3c138274
|
||||||
|
- `kei-export-trajectories` — 2 versions: 55753570 → d765f055
|
||||||
|
- `kei-forge` — 2 versions: b11967b7 → e9116d6a
|
||||||
|
- `kei-fork` — 2 versions: 980d5588 → a3252cb9
|
||||||
|
- `kei-frustration-loop` — 2 versions: 474e1d3d → 8bf9dddb
|
||||||
|
- `kei-gateway` — 2 versions: 28d41236 → 91173d2d
|
||||||
|
- `kei-gdrive-import` — 2 versions: 99ffbed8 → d5b115ef
|
||||||
|
- `kei-git-bitbucket` — 2 versions: 85c850ba → b2298cc9
|
||||||
|
- `kei-git-forgejo` — 2 versions: a0f19163 → d71efb0f
|
||||||
|
- `kei-git-gitea` — 2 versions: ea30f0cc → 0de210a2
|
||||||
|
- `kei-git-gitlab` — 2 versions: 744859c4 → 59a5271b
|
||||||
|
- `kei-graph-check` — 2 versions: e08f240e → 2c0e38d8
|
||||||
|
- `kei-hibernate` — 2 versions: 25f6d5bc → 1ea136f5
|
||||||
|
- `kei-import-project` — 2 versions: aa3750a0 → 2de0fd64
|
||||||
|
- `kei-leak-matrix` — 2 versions: 06a89af2 → a3803ef9
|
||||||
|
- `kei-ledger` — 2 versions: 8d59d685 → 269810bf
|
||||||
|
- `kei-ledger-sign` — 2 versions: 339bd55a → c12a2016
|
||||||
|
- `kei-llm-bridge-mlx` — 2 versions: 23e9e5b8 → b09d3703
|
||||||
|
- `kei-llm-llamacpp` — 2 versions: 8cd7b0c0 → d6781358
|
||||||
|
- `kei-llm-mlx` — 2 versions: 9fb79f0f → d276d3e6
|
||||||
|
- `kei-llm-ollama` — 2 versions: cb99ce2c → 6876e1e7
|
||||||
|
- `kei-llm-router` — 2 versions: bd772802 → a59cb2e9
|
||||||
|
- `kei-machine-probe` — 2 versions: 634b2e86 → 6810f0b5
|
||||||
|
- `kei-mcp` — 2 versions: 3425ff56 → 3a39649c
|
||||||
|
- `kei-memory` — 2 versions: fd941920 → 654e3516
|
||||||
|
- `kei-memory-postgres` — 2 versions: a9da92d3 → c95bff7d
|
||||||
|
- `kei-memory-redis` — 2 versions: fd7a49a9 → e749b491
|
||||||
|
- `kei-memory-sled` — 2 versions: 6bd5485f → 6fdae904
|
||||||
|
- `kei-memory-sqlite` — 2 versions: f64bbb1d → 93761682
|
||||||
- `kei-memory::kei-memory` — 33 versions: adcd4146 → 4645a074 → a8883527 → 898880d6 → 63248191 → 13461cd3 → 43470a70 → a2665f92 → fc8f7afb → 347c6675 → 2405f427 → a64eaf5c → 6fd5449b → d8509f53 → bba89ea5 → 4c12d77d → 5940f848 → e3b6aa5d → 7de01ed1 → fd2b0d2d → 2054601f → 04b9f270 → 0e6a981d → 802f8487 → 0da8e0c7 → c136273f → 1035f140 → a02e197e → 739a6c0f → 5a1ebf4f → 0bf3b6f7 → 2f7698b2 → 0dd1dfc8
|
- `kei-memory::kei-memory` — 33 versions: adcd4146 → 4645a074 → a8883527 → 898880d6 → 63248191 → 13461cd3 → 43470a70 → a2665f92 → fc8f7afb → 347c6675 → 2405f427 → a64eaf5c → 6fd5449b → d8509f53 → bba89ea5 → 4c12d77d → 5940f848 → e3b6aa5d → 7de01ed1 → fd2b0d2d → 2054601f → 04b9f270 → 0e6a981d → 802f8487 → 0da8e0c7 → c136273f → 1035f140 → a02e197e → 739a6c0f → 5a1ebf4f → 0bf3b6f7 → 2f7698b2 → 0dd1dfc8
|
||||||
- `kei-registry::kei-registry` — 12 versions: a9d4104f → 4110ba86 → 6e2dc3fd → 1f486539 → f10a08ba → 48886c98 → 6aeaf85c → ca0c09e0 → 130372c0 → f69680b3 → 50364568 → 30e6dee3
|
- `kei-migrate` — 2 versions: db2e7bd0 → fd996e76
|
||||||
|
- `kei-model` — 2 versions: 0a6ce8bc → 1a4038fd
|
||||||
|
- `kei-model-router` — 2 versions: 1280a1dd → b67e44b9
|
||||||
|
- `kei-model::kei-model` — 2 versions: 0948fb4f → 3f74b167
|
||||||
|
- `kei-net-ipsec` — 2 versions: 600684a8 → edb79478
|
||||||
|
- `kei-net-openvpn` — 2 versions: d4c94d69 → a209e645
|
||||||
|
- `kei-net-wireguard` — 2 versions: e2c8fab8 → 05a75c60
|
||||||
|
- `kei-notify-discord` — 2 versions: 1060b266 → a080b52b
|
||||||
|
- `kei-notify-slack` — 2 versions: 6ecc85e5 → 241f0aa1
|
||||||
|
- `kei-notify-sms` — 2 versions: 97776ab9 → d0fb8237
|
||||||
|
- `kei-notify-telegram` — 2 versions: b2384d0d → d3bff93d
|
||||||
|
- `kei-pet` — 2 versions: 8b7b8ee7 → 2af7e9fd
|
||||||
|
- `kei-ping` — 2 versions: d0c626c3 → 23b06c85
|
||||||
|
- `kei-pipe` — 2 versions: 3efc46a4 → a23aec78
|
||||||
|
- `kei-projects-index` — 2 versions: ce1576f0 → c5ecb5ee
|
||||||
|
- `kei-projects-watcher` — 2 versions: dedc5323 → dd3a3b8c
|
||||||
|
- `kei-provision` — 2 versions: 1d613e5d → cfa53bb3
|
||||||
|
- `kei-prune` — 2 versions: 7c0a0c11 → 4454513b
|
||||||
|
- `kei-refactor-engine` — 2 versions: 90048888 → 92e83ce0
|
||||||
|
- `kei-registry` — 3 versions: 7d9570ad → 5a2e79d8 → 5a2e79d8
|
||||||
|
- `kei-registry::foo` — 2 versions: 403bc4b0 → 403bc4b0
|
||||||
|
- `kei-registry::kei-registry` — 36 versions: a9d4104f → 4110ba86 → 6e2dc3fd → 1f486539 → f10a08ba → 48886c98 → 6aeaf85c → ca0c09e0 → 130372c0 → f69680b3 → 50364568 → 30e6dee3 → 3bb6d4f8 → 26a25696 → 0951d355 → 3261f321 → 5a190e74 → 80762a78 → d2bd49f3 → 99859be7 → b134cecf → 713f693b → 5faa1d45 → 84b3d3aa → f0fd45d4 → a50c01c9 → a4b4526d → b6f981f1 → 93eeffff → d3feb512 → f21fe020 → cbe1a45d → d5146bbd → a33bb21f → a3f03a74 → 4e595599
|
||||||
|
- `kei-registry::mini-prim` — 2 versions: 9fa2b304 → 9fa2b304
|
||||||
|
- `kei-replay` — 2 versions: 420ceb46 → 74f2fcc4
|
||||||
|
- `kei-router` — 2 versions: fc8c6820 → 2cfaa362
|
||||||
- `kei-router::kei-router` — 15 versions: 186634e6 → d91e8a11 → 80d4f8c6 → f8677f1d → a2e47f61 → 299a5afe → 675effa4 → 1fa6b4bb → 89c81c79 → 29340bbb → 51682c29 → ec0a1bfb → f4fce214 → 184e4f53 → 98ab93cd
|
- `kei-router::kei-router` — 15 versions: 186634e6 → d91e8a11 → 80d4f8c6 → f8677f1d → a2e47f61 → 299a5afe → 675effa4 → 1fa6b4bb → 89c81c79 → 29340bbb → 51682c29 → ec0a1bfb → f4fce214 → 184e4f53 → 98ab93cd
|
||||||
|
- `kei-runtime` — 2 versions: 44b695ea → c19f68cf
|
||||||
|
- `kei-runtime-core` — 2 versions: 100eec0c → dedb3de0
|
||||||
|
- `kei-sage` — 2 versions: 773af2fd → e7617e42
|
||||||
|
- `kei-scheduler` — 2 versions: 589d4c96 → b20fdba2
|
||||||
|
- `kei-search-core` — 2 versions: 3e15b74a → 7f980b0f
|
||||||
|
- `kei-shared` — 2 versions: 5990b174 → c9abc1ac
|
||||||
|
- `kei-skill-importer` — 2 versions: 18270170 → 8a09d39e
|
||||||
|
- `kei-skills` — 2 versions: 0bc302bc → 9b27964c
|
||||||
|
- `kei-social-store` — 2 versions: 901fa890 → f5409d5f
|
||||||
|
- `kei-spawn` — 2 versions: fd3b3939 → fd4e54ad
|
||||||
|
- `kei-store` — 2 versions: 381485a1 → cd08369f
|
||||||
|
- `kei-svc-systemd` — 2 versions: 13da0fd2 → cb3a6e65
|
||||||
|
- `kei-task` — 2 versions: f1204d34 → bba6a7b7
|
||||||
|
- `kei-tlog` — 2 versions: 8a4a1f56 → b3a16003
|
||||||
- `kei-token-tracker::kei-token-tracker` — 10 versions: 2e9d962a → 425b08f0 → 9a5196eb → 200eba01 → 2caec2d6 → 4538adbc → 0acb6793 → 1fa333e0 → dffb827c → 28bdb3b1
|
- `kei-token-tracker::kei-token-tracker` — 10 versions: 2e9d962a → 425b08f0 → 9a5196eb → 200eba01 → 2caec2d6 → 4538adbc → 0acb6793 → 1fa333e0 → dffb827c → 28bdb3b1
|
||||||
|
- `kei-tty` — 2 versions: 42f78a71 → fa00dbff
|
||||||
|
- `kei-watch` — 2 versions: c7e67afd → 5889eebd
|
||||||
|
- `keisei` — 2 versions: 6911bb1e → 94467a31
|
||||||
|
- `mock-render` — 2 versions: 99b0927a → f5f4d966
|
||||||
|
- `no-python-without-approval` — 2 versions: 45d3e0ab → 48fdb89e
|
||||||
|
- `numeric-claims-guard` — 2 versions: 90f697e6 → d5ed33c8
|
||||||
|
- `post-write-check` — 2 versions: 6ceb2237 → 4aaf1c5e
|
||||||
|
- `safety-guard` — 2 versions: 32b889cf → 665e7cd1
|
||||||
|
- `site-wysiwyd-check` — 2 versions: a0d38a22 → 416c0648
|
||||||
|
- `ssh-check` — 2 versions: f419e2b0 → ebd97541
|
||||||
|
- `task-timer` — 2 versions: 202823f9 → 16e4f0a3
|
||||||
|
- `tokens-sync` — 2 versions: 54c149ab → 69857925
|
||||||
|
- `visual-diff` — 2 versions: 557bdc21 → 4516e372
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
79
tests/hook-outcome-backfill-test.sh
Executable file
79
tests/hook-outcome-backfill-test.sh
Executable file
|
|
@ -0,0 +1,79 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# hook-outcome-backfill-test.sh — exercises agent-outcome-backfill.sh
|
||||||
|
# against a temp ledger DB. Asserts UPDATE behaviour for the 4 outcomes,
|
||||||
|
# missing-marker no-op, bypass no-op, and missing-sqlite3 no-op.
|
||||||
|
set -u
|
||||||
|
|
||||||
|
HOOK="$HOME/.claude/hooks/agent-outcome-backfill.sh"
|
||||||
|
[ -x "$HOOK" ] || { echo "FAIL: hook not executable at $HOOK"; exit 1; }
|
||||||
|
|
||||||
|
TMP=$(mktemp -d)
|
||||||
|
trap 'rm -rf "$TMP"' EXIT
|
||||||
|
DB="$TMP/ledger.sqlite"
|
||||||
|
export KEI_LEDGER_DB="$DB"
|
||||||
|
|
||||||
|
sqlite3 "$DB" "CREATE TABLE agents (
|
||||||
|
id TEXT PRIMARY KEY,
|
||||||
|
outcome TEXT CHECK (outcome IN ('functional','partial','scaffolding','fail')),
|
||||||
|
stubs_count INTEGER DEFAULT 0
|
||||||
|
);"
|
||||||
|
|
||||||
|
PASS=0; FAIL=0
|
||||||
|
assert_eq() {
|
||||||
|
if [ "$1" = "$2" ]; then PASS=$((PASS+1));
|
||||||
|
else FAIL=$((FAIL+1)); echo " FAIL: $3 — got '$1' expected '$2'"; fi
|
||||||
|
}
|
||||||
|
|
||||||
|
run_case() {
|
||||||
|
# $1=id $2=shipped $3=stubs_count_in_marker
|
||||||
|
sqlite3 "$DB" "INSERT OR REPLACE INTO agents(id,outcome,stubs_count) VALUES('$1',NULL,0);"
|
||||||
|
BODY="prelude text
|
||||||
|
=== STATUS-TRUTH MARKER ===
|
||||||
|
shipped: $2
|
||||||
|
stubs: $3
|
||||||
|
cargo-check: PASS
|
||||||
|
behaviour-verified: yes
|
||||||
|
follow-up-required:
|
||||||
|
- none"
|
||||||
|
PAYLOAD=$(jq -nc --arg id "$1" --arg body "$BODY" \
|
||||||
|
'{tool_use_id:$id, tool_response:$body}')
|
||||||
|
printf '%s' "$PAYLOAD" | "$HOOK"
|
||||||
|
OUT=$(sqlite3 "$DB" "SELECT outcome||'|'||stubs_count FROM agents WHERE id='$1';")
|
||||||
|
assert_eq "$OUT" "$2|$3" "outcome=$2"
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "[1] 4 valid outcomes update correctly"
|
||||||
|
run_case "id-func" "functional" 0
|
||||||
|
run_case "id-part" "partial" 3
|
||||||
|
run_case "id-scaf" "scaffolding" 7
|
||||||
|
run_case "id-fail" "fail" 12
|
||||||
|
|
||||||
|
echo "[2] idempotent re-run produces same row"
|
||||||
|
run_case "id-func" "functional" 0
|
||||||
|
|
||||||
|
echo "[3] missing marker → no-op"
|
||||||
|
sqlite3 "$DB" "INSERT OR REPLACE INTO agents(id,outcome,stubs_count) VALUES('id-bare',NULL,0);"
|
||||||
|
printf '%s' '{"tool_use_id":"id-bare","tool_response":"just a plain reply"}' | "$HOOK"
|
||||||
|
OUT=$(sqlite3 "$DB" "SELECT IFNULL(outcome,'NULL')||'|'||stubs_count FROM agents WHERE id='id-bare';")
|
||||||
|
assert_eq "$OUT" "NULL|0" "no-marker no-op"
|
||||||
|
|
||||||
|
echo "[4] bypass env → no-op"
|
||||||
|
sqlite3 "$DB" "INSERT OR REPLACE INTO agents(id,outcome,stubs_count) VALUES('id-byp',NULL,0);"
|
||||||
|
BODY="=== STATUS-TRUTH MARKER ===
|
||||||
|
shipped: functional
|
||||||
|
stubs: 0"
|
||||||
|
PAYLOAD=$(jq -nc --arg id "id-byp" --arg body "$BODY" '{tool_use_id:$id,tool_response:$body}')
|
||||||
|
printf '%s' "$PAYLOAD" | OUTCOME_BACKFILL_BYPASS=1 "$HOOK"
|
||||||
|
OUT=$(sqlite3 "$DB" "SELECT IFNULL(outcome,'NULL') FROM agents WHERE id='id-byp';")
|
||||||
|
assert_eq "$OUT" "NULL" "bypass no-op"
|
||||||
|
|
||||||
|
echo "[5] missing sqlite3 → no-op (PATH stripped)"
|
||||||
|
sqlite3 "$DB" "INSERT OR REPLACE INTO agents(id,outcome,stubs_count) VALUES('id-nosql',NULL,0);"
|
||||||
|
PAYLOAD=$(jq -nc --arg id "id-nosql" --arg body "$BODY" '{tool_use_id:$id,tool_response:$body}')
|
||||||
|
JQ_DIR=$(dirname "$(command -v jq)")
|
||||||
|
printf '%s' "$PAYLOAD" | env -i HOME="$HOME" KEI_LEDGER_DB="$DB" PATH="$JQ_DIR" "$HOOK" 2>/dev/null
|
||||||
|
OUT=$(sqlite3 "$DB" "SELECT IFNULL(outcome,'NULL') FROM agents WHERE id='id-nosql';")
|
||||||
|
assert_eq "$OUT" "NULL" "no-sqlite3 no-op"
|
||||||
|
|
||||||
|
echo "Passed: $PASS Failed: $FAIL"
|
||||||
|
[ "$FAIL" -eq 0 ] || exit 1
|
||||||
Loading…
Reference in a new issue