Audit of github.com/affaan-m/ECC ("Everything Claude Code") against IKA Concierge needs. Compiled 2026-06-09. Companion to /ika-pro-architecture, /odysseus, /superpowers, /skills.
ECC (MIT, v2.0.0-rc.1) is a plugin pack for AI coding harnesses — 64 specialist agents, 261 skills, 84 commands, ~25 lifecycle hooks, and a continuous-learning subsystem that turns observed sessions into atomic "instincts" with confidence scoring. Built for Claude Code, Cursor, Codex, OpenCode, Gemini, Zed and Copilot — i.e. for developers, not for the prosumer / SMB knowledge-work surface IKA targets. The 261-skill catalog itself is almost entirely coding-specific and irrelevant to IKA. The architecture underneath the catalog, however, contains four things worth lifting: a runtime hook-profile switch, a fact-force gate that blocks first-write-per-file until the agent investigates, a context-budget audit skill, and — most importantly — the "instinct" model: atomic, confidence-weighted, project-scoped learned behaviors that promote to global when seen in two or more projects. IKA Concierge is, in effect, the same problem shape (a long-running agent harness over knowledge-work) without the coding-vertical bias. We adopt the primitives, ignore the catalog, and keep our own posture.
Posture: harness-native operator system for agentic coding work, distributed as an NPM/marketplace install across seven AI coding harnesses. MIT-licensed. Single maintainer, weekly cadence, ~150 GitHub App installs at clone time.
Stack: JavaScript/TypeScript for the hook runtime, Python for the dashboard + LLM core (src/llm/ with provider abstractions over Ollama / AstraFlow / Claude / OpenAI), Rust prototype for an out-of-process control plane (ecc2/), shell installers.
Distribution: ecc-universal + ecc-agentshield NPM packages; ecc-tools GitHub App; gitagent agent.yaml spec; per-harness manifest shells (.claude-plugin/, .codex-plugin/, .opencode/, .cursor/, .kiro/, .gemini/, .qwen/, .zed/, .codebuddy/, .trae/).
Repo shape:
agents/ — 64 markdown specialist subagent definitions (planner, code-reviewer, security-reviewer, language-specific reviewers + build-resolvers, harness-optimizer, loop-operator…)skills/ — 261 directories, each SKILL.md with YAML frontmatter (name, description, origin)commands/ — 84 legacy slash-command shims (now deprecated by ECC themselves; skills-first)hooks/hooks.json — ~25 lifecycle hooks wired to dispatcher scriptsrules/ — common + per-language always-on guidelinesmcp-configs/ — 14 MCP server configurationsecc2/ — Rust control-plane prototype with SQLite state store; CLI dashboard / start / sessions / status / stop / resume / daemonsrc/llm/ — Python LLM core with pluggable providersDesign choices worth naming:
ECC_HOOK_PROFILE=minimal|standard|strict and ECC_DISABLED_HOOKS=... let an operator turn hooks down without editing files. Graceful degradation, not all-or-nothing.pre:bash:dispatcher and post:bash:dispatcher route through one preflight/postflight script each, instead of N separate hook entries. Faster cold start, easier to reason about ordering.PreToolUse, PostToolUse, PreCompact, SessionStart, Stop, SessionEnd, PostToolUseFailure. Hook contract is wider than what IKA's Superpowers adoption (v25.12) currently uses.pre:edit-write:gateguard-fact-force blocks the FIRST Edit/Write per file per session until the agent has demonstrably investigated (importers, schemas, user instructions). Cuts the "agent edited the file without reading the file it depends on" failure mode.| ECC primitive | IKA counterpart today | Verdict |
|---|---|---|
| Skill = markdown + trigger-focused frontmatter | Already first-class entity per architecture, with 3-tier vetting + ed25519 + Firecracker | Already adopted (v25.11 / v25.12) |
| Specialist subagent (markdown spec) | Per-neuron Agents entity | Already adopted |
| Hook lifecycle events (PreToolUse / PostToolUse / PreCompact / SessionStart / Stop / SessionEnd / PostToolUseFailure) | SessionStart hook contract from Superpowers adoption (v25.12) — startup / clear / compact. skill_hooks table exists. | EXTEND — add the missing event names; current contract is a subset |
Hook profile env-var (ECC_HOOK_PROFILE, ECC_DISABLED_HOOKS) | Nothing — hooks are on if present, off if deleted | ADOPT (E1) — runtime kill-switch |
| GateGuard fact-force — block first write per file until investigation | superpowers/verification-before-completion fires at done-time, not write-time | ADOPT (E2) — write-time complement to verification-at-done |
| Context-budget audit skill | Nothing — no audit of per-neuron component token overhead | ADOPT (E3) — Engineering-neuron default |
| Instincts — atomic, confidence-weighted, project-scoped learned behaviors with promotion | Gbrain dream-cycle writes assessments (about the world), not instincts (about IKA's own behavior) | ADOPT (E4) — new data layer, sits between Notes and Skills |
| In-conversation cost/context monitor — injects warnings into the next system turn on threshold breach | Per-IKA cost cap exists at the budget layer; no agent-facing warning channel | ADOPT (E5) — agent-level self-correction |
Status as portable markdown handoff (ecc status --markdown) | Conversation Surface morning brief — same shape, single channel | ADOPT (E6) — multi-channel emit |
| Safety-Guard freeze mode — lock writes to a directory tree | Nothing scope-bounded for autonomous Automation runs | ADOPT (E7) — per-Automation write_scope_path |
| Iterative-retrieval pattern (4-phase DISPATCH/EVAL/REFINE/LOOP, cap 3) | Subagent context-handoff is currently ad-hoc per Paperclip skill | WATCH — pattern is correct; we may already cover it implicitly via gbrain RRF + classifier gate. 1h code-walk before deciding. |
| 261-skill catalog (django-tdd, kotlin-coroutines-flows, springboot-security, manim-video…) | Per-neuron Skills with per-Company onboarding seed map | Skip — coding-vertical bias; IKA is knowledge-work |
Multi-harness manifest translation (agent.yaml + 10 per-harness manifest shells) | Anthropic .claude-plugin/plugin.json wire-format already adopted (v25.11) | Skip — IKA is the harness |
Rust control-plane (ecc2/) | Go ika-api backend + Flask BI on :3055 | Skip — third process language is not on the table; lift the status surface only (E6) |
| NPM distribution + GitHub App marketplace | Per-IKA install + Anthropic plugin marketplace compatibility (v25.11) | Skip — distribution model, not architecture |
Legacy commands/ shim layer (84 commands) | Commands entity (v25.11) | Skip — ECC itself flagged this for deprecation |
Tkinter dashboard GUI (ecc_dashboard.py) | BI shell on main.ika.ai | Skip — wrong design language |
Pattern: ECC_HOOK_PROFILE=minimal|standard|strict + ECC_DISABLED_HOOKS=<id>,<id> let an operator turn the hook pipeline down without editing files. Each hook declares which profiles it runs under (e.g. minimal,standard,strict for the metrics bridge; standard,strict for stricter gates).
Why now: IKA shipped the SessionStart hook contract in v25.12. There is no runtime kill-switch yet — a misbehaving hook has to be deleted from skill_hooks, which means a migration. Adding a min_profile column and reading an env var at the dispatcher is ~50 lines and gives us a graceful degradation path for incidents.
IKA integration: extend the skill_hooks table from v25.12 with min_profile TEXT NOT NULL DEFAULT 'standard'. Read IKA_HOOK_PROFILE (default standard) and IKA_DISABLED_HOOKS (comma list of hook ids) in the dispatcher. No new entity, no schema-per-IKA work — global infrastructure.
Effort: ~½ day.
Pattern: a PreToolUse hook on Edit/Write that blocks the FIRST modification per file per session until the agent has demonstrably investigated the file's context (importers, schema references, user instructions referencing it). Subsequent edits to the same file in the same session pass without the gate.
Why now: the most common Conversation-Surface failure mode is "IKA wrote the field, but the field doesn't exist in the schema" or "IKA updated the contact name, but the contact lives in a different IKA". A write-time gate that forces a read first turns this from a silent failure into a deliberate investigation. Pairs with superpowers/verification-before-completion, which fires at done-time — fact-force fires at write-time, so the two together bracket every operation.
IKA integration: new PreToolUse hook on Operations Edit / Write tool calls. Track (conversation_id, entity_type, entity_id) "investigated" flags in conversation state. Skip the gate when the user explicitly asked for the change ("agent-initiated" vs "user-explicit" distinction).
Effort: ~1 day including the user-vs-agent classifier wired to the existing conversation-surface classifier gate (v22).
Pattern: a skill that scans every loaded component (agents, skills, rules, MCP servers, CLAUDE.md), estimates token overhead (words × 1.3), classifies into Always / Sometimes / Rarely needed, flags bloat (descriptions >30 words, files >200 lines, MCPs wrapping native CLIs, >10 servers, redundant content), and emits a prioritized savings report.
Why now: we are going to land in the exact same trap ECC hit. Once we have 30+ per-neuron Skills, 12+ MCP integrations, 8+ hooks installed across templates, the question "why is the Conversation Surface slow today?" becomes unanswerable without instrumentation. Building the audit as a first-class skill — and surfacing it both as /context-budget and as a chip in MyPanel — turns the question into a one-click answer.
IKA integration: add IKA-curated/context-budget skill backed by a SQL view over neuron_skills / neuron_commands / neuron_plugins / neuron_integrations. Token estimate uses the same words × 1.3 heuristic ECC uses (no need for the actual tokenizer in the audit path). Per-IKA report stored as an Artifact in the Engineering neuron.
Effort: ~1 day.
Pattern (the most original idea in the repo): an instinct is a small learned behavior with shape
{ id, trigger, action, confidence: 0.3–0.9, domain, scope: project|global, evidence: [] }.
Observations come in via the hook pipeline; a background Haiku agent (not the main context) clusters and writes instincts. Confidence decays without reinforcement. Project-scoped by default (keyed off git remote URL hash) so behaviors don't leak between projects. Promotion path: an instinct seen in 2+ projects gets promoted to global. Evolution path: instincts → cluster → Skill / Command / Agent.
Why this matters most: IKA already has the dream-cycle (gbrain lift #5) writing assessments — claims about the world. We do not have a place for claims about IKA's own behavior ("when Mats asks for a brief he means morning + Spanish + ≤10 bullets"). Instincts fill that gap with a primitive that is small enough to write automatically, confidence-weighted so the system knows what to trust, and scoped so multi-IKA isolation holds. It sits naturally between Notes (raw, free-form) and Skills (formal, vetted).
IKA integration:
instincts table per IKA (schema-per-IKA, fits the RLS floor).(ika_id, neuron_id) with a scope: neuron | ika | global ladder. Promotion: neuron → ika when seen in 2+ neurons of the same IKA; ika → global when seen in 2+ IKAs of the same user.assessments.subject_type IN ('world', 'self') — keep one storage substrate but partition the index. Decision deferred until the migration is written; see Open questions.Effort: ~3 days (schema + dream-cycle observer + promotion ladder + skill-promotion surface). Highest-leverage adopt on the page.
Pattern: post:ecc-context-monitor injects a structured warning into the agent's next system turn when token cost, context-window utilization, or tool-loop heuristics cross thresholds. The agent self-corrects mid-turn instead of getting hard-stopped by the cap.
Why now: the per-IKA cost cap (in the token-stack section of /ika-pro-architecture) enforces at the budget layer — it kills the request when the cap is breached. The agent has no opportunity to wind down gracefully (write a partial result, defer to a cheaper model, ask the user). Adding the warning-injection pattern at 80% of cap / 70% of context window / 3 consecutive same-tool calls gives the agent a chance to land softly.
IKA integration: wire into the existing per-IKA cost-cap primitive. Emit a structured {type: "cost_warning", budget_remaining_pct, context_used_pct, recent_tool_repeat_count} block into the next system turn. Threshold tunable per-IKA in Settings → Conversation, defaults named above.
Effort: ~½ day.
Pattern: ecc status --markdown --write status.md produces a portable snapshot covering readiness, active sessions, skill-run health, install health, pending governance events, linked work items. Designed for cross-channel handoff (paste into Slack, email, etc.).
Why now: the Conversation Surface morning brief is already exactly this shape, but it lives only in the IKA thread. Making it emit a markdown variant lets Mats forward "what IKA is on today" into any channel without screenshots. Also lights up the IKA-as-collaborator surface for users who live in Slack/email more than in the IKA chrome.
IKA integration: existing Brief generator gains a format: markdown output path; same data, different serializer. Add an "Export" affordance on every Brief that copies the markdown or pipes it to a configured channel (Slack webhook, email, WhatsApp via per-neuron Integration).
Effort: ~½ day.
Pattern: lock all writes to a specific directory tree for the duration of an autonomous run. Any out-of-scope write is blocked with an explanation; reads remain unrestricted.
Why now: an Automation that runs under an agent identity should not, by default, be allowed to mutate the entire IKA. Today the bound is the per-Automation role/permissions, which is correct for ACL but not enforced at the write-tool layer. Adding a write_scope_path field that the PreToolUse hook checks against every Operations write turns "in theory the agent only touches Engineering" into "in fact the agent cannot touch anything else, even if the prompt convinces it to."
IKA integration: new automations.write_scope_path TEXT NULL; when set, every write tool call from the Automation's agent is checked against it. Out-of-scope = blocked at the hook with an explanation, audited to the per-IKA security log.
Effort: ~½ day.
| # | Skip | Reason |
|---|---|---|
| S1 | The 261-skill catalog | 90%+ of the catalog is dev-harness vertical (Django, Spring Boot, Kotlin coroutines, PyTorch, Manim). IKA's vertical is prosumer / SMB knowledge work. We lift the shape of a Skill (markdown + trigger-focused frontmatter — already done) and ignore the inventory. Building Spanish-first Concierge skills against the IKA-owned 3-tier vetting catalog is the right path, not vendoring 261 English coding skills. |
| S2 | Multi-harness manifest translation (agent.yaml, .codex-plugin/, .opencode/, .cursor/, .kiro/, .gemini/, .qwen/, .zed/, .codebuddy/, .trae/) | ECC ships into 10 different surfaces because that is its product. IKA is its own harness for its own users. Anthropic-plugin wire-format compatibility was adopted in v25.11 — that is the only translation layer we need. |
| S3 | Instinct extraction via background Haiku agent over every tool call | The instinct model is the highest-value adopt (E4). The extraction mechanism — sniff every tool call, ship to a background Haiku, write atomic instincts at Stop — is too noisy for the Conversation Surface and doubles our per-turn cost. Run the same logic as a dream-cycle observer instead, on the per-IKA cadence we already pay for. |
| S4 | Rust control-plane (ecc2/) as an architecture model | IKA already has its own Go control-plane (ika-api) and a Flask BI on :3055. A third process language is not on the table. Lift the portable status surface (E6); leave the rest. |
| S5 | NPM-packaged plugin distribution + GitHub App marketplace | Distribution model, not architecture. IKA's distribution is per-IKA + Anthropic-plugin marketplace compatibility (v25.11). |
| S6 | Legacy commands/ shim layer (84 entries) | ECC themselves call this a deprecation surface; new contributions land in skills/. We are net-new and adopt only the skills-first path. |
| S7 | Tkinter dashboard GUI (ecc_dashboard.py) | Wrong design language. The BI shell on main.ika.ai is the IKA chrome — we do not bolt a separate desktop app onto it. |
| S8 | AgentShield as a built-in security scanner | Adjacent product, separately monetized by ECC, with overlapping scope to our existing Security baseline + prompt-injection classifier (v21). Not enough delta to justify vendoring. |
subject_type IN ('world', 'self') discriminator, or two tables with a shared evidence join? The choice constrains the dream-cycle observer code. Lean: one table, two indexes, two views.always_on. v25.12 added always_on BOOL on neuron_skills. Don't ship two parallel disable mechanisms — the new min_profile column should compose with always_on: a hook only runs if (always_on OR profile ≥ min_profile) AND NOT disabled.README.md — top-of-funnel positioning, version history, package surfaceAGENTS.md — agent inventory + orchestration philosophySOUL.md — core identity statementagent.yaml — gitagent spec surface (157 skills, 84 commands at this version)hooks/hooks.json — ~25 hook definitions across PreToolUse / PostToolUse / PreCompact / SessionStart / Stop / SessionEnd / PostToolUseFailureskills/continuous-learning-v2/SKILL.md — instinct model (v2.1 project scoping)skills/iterative-retrieval/SKILL.md — 4-phase subagent retrieval loopskills/context-budget/SKILL.md — token overhead audit + savings reportskills/safety-guard/SKILL.md — Careful / Freeze / Guard modessrc/llm/providers/ — Ollama / AstraFlow / Claude / OpenAI provider abstractions (confirms multi-provider posture)ecc2/ — Rust control-plane prototype with SQLite state store