From de129da5f712eba3bf55d6683e4af4abec6ae79a Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 1 Nov 2026 22:09:10 +0000 Subject: [PATCH] Sync the KITT rename: the handbook is now KITT, Keeper of Intent, Tooling and Tempo Syncs KITT 7209b73 (TheAnswerManIsHere/KITT#272 and #273): every synced file carries the SYNCED FROM KITT banner, and the shared rules name KITT throughout. This repository's own live docs, workflow comments and config notes are renamed the same way. The approved architecture plan under docs/plans/ keeps the old name, because its digest pins the text David approved. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01UMMrrtVH1GgZ1B1ZAS9aso --- .agents/PLANS.md | 2 +- .agents/core/agents-core.md | 18 ++--- .agents/core/claude-core.md | 55 ++++++++++------ .agents/machinery.json | 6 +- .agents/map/architecture.json | 2 +- .agents/map/config.json | 2 +- .agents/map/config.schema.json | 2 +- .agents/map/eval-tasks.json | 2 +- .agents/map/size-baseline.json | 2 +- .agents/map/subsystems.json | 2 +- ...ubagent-answer-is-in-its-own-transcript.md | 6 +- ...bash-signal-safe-spawn-critical-section.md | 2 +- ...t-text-between-tool-calls-is-summarised.md | 2 +- .../memory/check-runs-carry-no-head-sha.md | 6 +- ...-guard-must-fail-loud-on-missing-inputs.md | 2 +- .agents/memory/codex-cli-in-container.md | 4 +- ...t-lookups-discard-good-results-two-ways.md | 2 +- ...b-command-blocked-by-sandbox-classifier.md | 2 +- ...ps-paths-missing-their-top-level-prefix.md | 2 +- ...nt-ceremony-concurrent-docs-pr-conflict.md | 2 +- ...xplore-after-merge-restart-branch-first.md | 2 +- .../memory/git-cat-file-exit-128-ambiguous.md | 4 +- ...mit-message-backtick-shell-substitution.md | 2 +- ...c-limited-to-main-hides-a-pushed-branch.md | 4 +- ...-lock-sweeper-removed-platform-fixed-it.md | 2 +- .agents/memory/git-sync-authenticated-push.md | 2 +- ...ons-concurrency-group-key-and-queue-max.md | 2 +- ...tions-concurrent-label-mutation-pattern.md | 2 +- .../github-actions-outage-mimics-quota.md | 2 +- ...-required-checks-job-if-vs-paths-filter.md | 2 +- .../github-mcp-no-label-creation-tool.md | 2 +- ...review-comments-shape-differs-from-rest.md | 4 +- ...ct-field-names-need-normalized-matching.md | 2 +- .../github-rest-api-blocked-from-bash.md | 2 +- .../github-slugger-is-the-anchor-algorithm.md | 2 +- .../memory/hook-uncaught-throw-fails-open.md | 6 +- ...ool-results-recoverable-from-transcript.md | 8 +-- ...write-update-silently-drops-add-comment.md | 2 +- ...chinery-threat-model-is-my-own-mistakes.md | 8 +-- .../migration-file-immutable-once-merged.md | 2 +- .../plan-doc-path-never-cite-from-code.md | 2 +- .../pnpm-override-scope-and-application.md | 2 +- ...se-cross-refs-invisible-to-link-checker.md | 2 +- ...aw-nul-byte-in-source-makes-file-binary.md | 2 +- .../react-setstate-updater-not-synchronous.md | 2 +- ...g-a-failed-ci-test-from-the-log-archive.md | 4 +- .../reduction-over-a-set-that-changed-size.md | 4 +- ...it-commits-reach-main-only-through-a-pr.md | 2 +- .../repo-wide-typecheck-vs-per-package.md | 2 +- ...ecklist-source-the-plan-not-the-roadmap.md | 2 +- .agents/memory/running-long-test-suites.md | 2 +- .../memory/stacked-pr-gets-no-workflow-run.md | 2 +- ...-remote-tracking-ref-after-squash-merge.md | 2 +- .../workflow-dispatch-needs-default-branch.md | 2 +- .agents/receipts/.gitignore | 4 +- .agents/reviews/.gitignore | 6 +- .agents/roles/review-proxy.md | 2 +- .../schemas/fable-build-report.schema.json | 4 +- .claude/agents/adversarial-modeler.md | 2 +- .claude/agents/fable-build-report.md | 4 +- .claude/agents/fable-review-assessor.md | 4 +- .claude/agents/semgrep-scanner.md | 2 +- .claude/rules/map-before-edit.md | 2 +- .claude/skills/VENDORED_SKILLS_NOTICE.md | 4 +- .../skills/agentic-actions-auditor/SKILL.md | 2 +- .../references/action-profiles.md | 2 +- .../references/cross-file-resolution.md | 2 +- .../references/foundations.md | 2 +- .../vector-a-env-var-intermediary.md | 2 +- .../vector-b-direct-expression-injection.md | 2 +- .../references/vector-c-cli-data-fetch.md | 2 +- .../references/vector-d-pr-target-checkout.md | 2 +- .../vector-e-error-log-injection.md | 2 +- .../references/vector-f-subshell-expansion.md | 2 +- .../references/vector-g-eval-of-ai-output.md | 2 +- .../vector-h-dangerous-sandbox-configs.md | 2 +- .../vector-i-wildcard-allowlists.md | 2 +- .claude/skills/archive/SKILL.md | 2 +- .claude/skills/brainstorming/SKILL.md | 4 +- .../brainstorming/scripts/frame-template.html | 2 +- .../skills/brainstorming/scripts/helper.js | 2 +- .../skills/brainstorming/scripts/server.cjs | 2 +- .../brainstorming/scripts/start-server.sh | 2 +- .../brainstorming/scripts/stop-server.sh | 2 +- .../spec-document-reviewer-prompt.md | 2 +- .../skills/brainstorming/visual-companion.md | 2 +- .claude/skills/bugfix/SKILL.md | 2 +- .claude/skills/bugfix/live-diagnosis.md | 2 +- .claude/skills/differential-review/SKILL.md | 2 +- .../skills/differential-review/adversarial.md | 2 +- .../skills/differential-review/methodology.md | 2 +- .../skills/differential-review/patterns.md | 2 +- .../skills/differential-review/reporting.md | 2 +- .../dispatching-parallel-agents/SKILL.md | 2 +- .claude/skills/document/SKILL.md | 2 +- .claude/skills/executing-plans/SKILL.md | 4 +- .../finishing-a-development-branch/SKILL.md | 4 +- .claude/skills/fp-check/SKILL.md | 2 +- .../references/bug-class-verification.md | 2 +- .../fp-check/references/deep-verification.md | 2 +- .../fp-check/references/evidence-templates.md | 2 +- .../references/false-positive-patterns.md | 2 +- .../fp-check/references/gate-reviews.md | 2 +- .../references/standard-verification.md | 2 +- .claude/skills/grill-me/SKILL.md | 2 +- .claude/skills/grilling/SKILL.md | 2 +- .claude/skills/handoff/SKILL.md | 2 +- .claude/skills/insecure-defaults/SKILL.md | 2 +- .../insecure-defaults/references/examples.md | 2 +- .claude/skills/maintenance/SKILL.md | 16 ++--- .claude/skills/model-routing/SKILL.md | 8 +-- .claude/skills/next/SKILL.md | 6 +- .claude/skills/plan-review-loop/SKILL.md | 4 +- .claude/skills/pr-docs/SKILL.md | 2 +- .claude/skills/pr-watch/SKILL.md | 8 +-- .claude/skills/prose-sweep/SKILL.md | 8 +-- .claude/skills/prototype/LOGIC.md | 4 +- .claude/skills/prototype/SKILL.md | 2 +- .claude/skills/prototype/UI.md | 4 +- .claude/skills/receiving-code-review/SKILL.md | 2 +- .../skills/requesting-code-review/SKILL.md | 2 +- .../requesting-code-review/code-reviewer.md | 2 +- .claude/skills/sarif-parsing/SKILL.md | 2 +- .../sarif-parsing/resources/jq-queries.md | 2 +- .../sarif-parsing/resources/sarif_helpers.py | 2 +- .claude/skills/semgrep/SKILL.md | 2 +- .claude/skills/semgrep/references/rulesets.md | 2 +- .../skills/semgrep/references/scan-modes.md | 2 +- .../semgrep/references/scanner-task-prompt.md | 2 +- .claude/skills/semgrep/scripts/merge_sarif.py | 2 +- .../skills/semgrep/workflows/scan-workflow.md | 2 +- .claude/skills/status-all/SKILL.md | 6 +- .claude/skills/status/SKILL.md | 2 +- .../subagent-driven-development/SKILL.md | 2 +- .../implementer-prompt.md | 2 +- .../scripts/review-package | 2 +- .../scripts/sdd-workspace | 2 +- .../scripts/task-brief | 2 +- .../task-reviewer-prompt.md | 2 +- .../skills/supply-chain-risk-auditor/SKILL.md | 2 +- .../resources/results-template.md | 2 +- .../systematic-debugging/CREATION-LOG.md | 2 +- .claude/skills/systematic-debugging/SKILL.md | 4 +- .../condition-based-waiting-example.ts | 2 +- .../condition-based-waiting.md | 2 +- .../systematic-debugging/defense-in-depth.md | 2 +- .../systematic-debugging/find-polluter.sh | 2 +- .../root-cause-tracing.md | 2 +- .../systematic-debugging/test-academic.md | 2 +- .../systematic-debugging/test-pressure-1.md | 2 +- .../systematic-debugging/test-pressure-2.md | 2 +- .../systematic-debugging/test-pressure-3.md | 2 +- .../skills/test-driven-development/SKILL.md | 6 +- .../testing-anti-patterns.md | 2 +- .claude/skills/uat/SKILL.md | 4 +- .claude/skills/using-git-worktrees/SKILL.md | 4 +- .claude/skills/using-superpowers/SKILL.md | 4 +- .../references/antigravity-tools.md | 2 +- .../references/codex-tools.md | 2 +- .../using-superpowers/references/pi-tools.md | 2 +- .../verification-before-completion/SKILL.md | 2 +- .claude/skills/writing-plans/SKILL.md | 4 +- .../plan-document-reviewer-prompt.md | 2 +- .claude/skills/writing-skills/SKILL.md | 2 +- .../anthropic-best-practices.md | 2 +- .../examples/CLAUDE_MD_TESTING.md | 2 +- .../writing-skills/graphviz-conventions.dot | 2 +- .../writing-skills/persuasion-principles.md | 2 +- .../skills/writing-skills/render-graphs.js | 2 +- .../testing-skills-with-subagents.md | 2 +- .github/workflows/ci.yml | 2 +- .github/workflows/project-sync.yml | 6 +- CLAUDE.md | 2 +- .../ai-context/agent-legible-codebase-eval.md | 2 +- docs/ai-context/agent-legible-codebase.md | 14 ++-- docs/ai-context/agent-working-rules.md | 6 +- docs/ai-context/architecture.md | 4 +- docs/ai-context/async-ui-status.md | 2 +- docs/ai-context/codex-environment.md | 2 +- docs/ai-context/documentation-workflow.md | 2 +- docs/ai-context/known-failure-patterns.md | 24 +++---- docs/ai-context/overlay-declarations.md | 2 +- docs/ai-context/planning-contract.md | 2 +- docs/ai-context/product-brief.md | 8 +-- docs/ai-context/prose-sweep.md | 8 +-- docs/ai-context/replit-platform.md | 66 ++++++++++++++----- docs/ai-context/review-judgment.md | 2 +- docs/ai-context/token-pricing.md | 22 +++---- docs/ai-context/web-research.md | 2 +- docs/ai-context/working-modes.md | 6 +- docs/ai-context/workstream-tracking.md | 6 +- docs/engineering/code-review.md | 2 +- docs/engineering/deferred-work.md | 4 +- docs/plans/.gitignore | 2 +- docs/tests/TESTING.md | 6 +- docs/tests/uat-doc-format.md | 6 +- scripts/__tests__/build-report.test.mjs | 6 +- .../__tests__/check-docs-accuracy.test.mjs | 2 +- scripts/__tests__/check-uat-format.test.mjs | 2 +- .../__tests__/entry-point-comparison.test.mjs | 4 +- scripts/__tests__/machinery.test.mjs | 4 +- scripts/__tests__/map.unit.test.mjs | 9 +-- scripts/__tests__/needs-you-alert.test.mjs | 2 +- .../__tests__/plan-review-recipes.test.mjs | 18 ++--- scripts/__tests__/plan-review.test.mjs | 4 +- scripts/__tests__/review-proxy.test.mjs | 2 +- scripts/__tests__/sweep-scope.test.mjs | 4 +- .../__tests__/sync-project-fields.test.mjs | 2 +- scripts/build-report.mjs | 6 +- scripts/check-docs-accuracy.mjs | 6 +- scripts/check-uat-format.mjs | 2 +- scripts/machinery.mjs | 22 +++---- scripts/map-eval.mjs | 4 +- scripts/map.mjs | 16 +++-- scripts/needs-you-alert.mjs | 14 ++-- scripts/plan-review.mjs | 12 ++-- scripts/retry-on-eagain.sh | 2 +- scripts/review-proxy.mjs | 8 +-- scripts/sweep-scope.mjs | 12 ++-- scripts/sync-project-fields.mjs | 2 +- 220 files changed, 477 insertions(+), 427 deletions(-) diff --git a/.agents/PLANS.md b/.agents/PLANS.md index 07ba2ef..31f458d 100644 --- a/.agents/PLANS.md +++ b/.agents/PLANS.md @@ -1,4 +1,4 @@ - + # Implementation Plan Template diff --git a/.agents/core/agents-core.md b/.agents/core/agents-core.md index 280bacf..79a7911 100644 --- a/.agents/core/agents-core.md +++ b/.agents/core/agents-core.md @@ -1,13 +1,13 @@ - + # Agent instructions — portable core (all agents) > **Who this is for.** Every AI agent working in a repo governed by the -> AI-Handbook — Codex, Claude Code, Replit, and whatever comes next. It tells +> KITT — Codex, Claude Code, Replit, and whatever comes next. It tells > you **how to behave and what is non-negotiable**, independent of which > product you are working on. The repo's own `AGENTS.md` carries the product > half: what this product is, where its truth lives, and how to build and @@ -32,7 +32,7 @@ > **One source of truth for all agents.** These rules are shared. Claude > Code's `CLAUDE.md` holds only Claude-specific ceremony and defers here for > every cross-agent principle. When a shared rule changes, it changes in the -> handbook — never as a forked copy in one agent's own file or private +> KITT — never as a forked copy in one agent's own file or private > memory. ## Working agreement with David @@ -169,7 +169,7 @@ does not apply. The tool, its contract and its back-out: output: observe those and refuse on disagreement. Everything a script gets from the agent that runs it — its argv, a file it authored following its own protocol, a ref or path it chose — falls into one of two kinds, and - the rule differs (David, 2026-10-15, on AI-Handbook #211, where two + the rule differs (David, 2026-10-15, on KITT #211, where two assessments weighed an id the agent would have had to mistype against its own protocol: *"you are the one who would write the id"*): - **Derivable** — the script already holds every input needed to compute @@ -177,7 +177,7 @@ does not apply. The tool, its contract and its back-out: input at all.** A check whose two sides you both own carries no independent information — it fails only when the code between them is wrong, and that code is exactly as likely to be wrong as the check - (AI-Handbook #73: four review rounds on one flag, then the flag was + (KITT #73: four review rounds on one flag, then the flag was deleted). - **A choice** — it encodes intent the script cannot know (`--role`, `--timeout`, `sync --to `). Take it. A cheap check that it is @@ -187,7 +187,7 @@ does not apply. The tool, its contract and its back-out: planted symlink, a traversal, a hard link the operator would have to create on purpose, a file whose entries collide only if its author contradicts the format it is writing to — is not, and the response to - such a finding is to decline it, not to guard (AI-Handbook #7: eleven + such a finding is to decline it, not to guard (KITT #7: eleven findings and no added safety; #211: two assessments and a ruling, for a guard that was never written). **Ask who produced the value, never which directory the file sits in.** A diff --git a/.agents/core/claude-core.md b/.agents/core/claude-core.md index 4688d15..4125132 100644 --- a/.agents/core/claude-core.md +++ b/.agents/core/claude-core.md @@ -1,13 +1,13 @@ - + # Working agreements — portable core (Claude Code) + ## Rule @@ -75,7 +75,7 @@ and a call made with `true` the same day returned *"Async agent launched successfully"* and completed later as a harness task notification. So the flag has now been observed both ways, dated. A rule that depends on it was written anyway, off the single favourable sample, in the same commit that edited this -note; the reviewer caught it (Codex, AI-Handbook #109 round 4). **The one thing +note; the reviewer caught it (Codex, KITT #109 round 4). **The one thing every observation shares is that the harness reports completion** — in the tool result when the call blocked, as a later notification when it did not. Depend on that signal, whichever way it arrives; never on the flag, and never assume @@ -139,7 +139,7 @@ transcript is genuinely missing rather than blaming the agent. retyping. That note covers `tool_result` blocks in the session transcript; this one covers the case where the block you want is not there at all. - `capture-from-transcript.mjs` implemented this (`backgroundAgentId`, - `agentAnswer`), discovered by running it rather than by review — AI-Handbook + `agentAnswer`), discovered by running it rather than by review — KITT #79 — and was removed by the #89 cut. **The measured failure is worth carrying into #96**: on #91 the harness moved the answer one block further out than the recovery path expected, the script refused, and its refusal diff --git a/.agents/memory/bash-signal-safe-spawn-critical-section.md b/.agents/memory/bash-signal-safe-spawn-critical-section.md index f513faf..354d719 100644 --- a/.agents/memory/bash-signal-safe-spawn-critical-section.md +++ b/.agents/memory/bash-signal-safe-spawn-critical-section.md @@ -3,7 +3,7 @@ name: Signal-safe spawn loops need the PID published inside a critical section description: Publishing a spawned child's PID to a cleanup-visible array "immediately after" the spawn still leaves a real bash safe-point gap a signal can land in; close it with a defer-flag, not just tighter ordering. --- - + # A spawn (`&`) and its PID-recording append are two separate commands — a signal can land between them diff --git a/.agents/memory/chat-text-between-tool-calls-is-summarised.md b/.agents/memory/chat-text-between-tool-calls-is-summarised.md index ebe0501..027c440 100644 --- a/.agents/memory/chat-text-between-tool-calls-is-summarised.md +++ b/.agents/memory/chat-text-between-tool-calls-is-summarised.md @@ -3,7 +3,7 @@ name: In the Claude app, text I write between tool calls reaches David as a para description: A question posted before a PushNotification (or any other tool call) in the same turn rendered on David's iPad as a one-paragraph summary in a different voice, and he could not tell what the question was. Anything he must read exactly — a question, an ask, a banner — goes after the last tool call of the turn, written once: the notification fires first, the message follows it. --- - + # Text between tool calls is summarised on David's side diff --git a/.agents/memory/check-runs-carry-no-head-sha.md b/.agents/memory/check-runs-carry-no-head-sha.md index b1f009f..4615d4c 100644 --- a/.agents/memory/check-runs-carry-no-head-sha.md +++ b/.agents/memory/check-runs-carry-no-head-sha.md @@ -3,7 +3,7 @@ name: get_check_runs carries no head_sha — for an Actions job, get_workflow_jo description: pull_request_read method get_check_runs returns no head_sha, and neither does get_check_run. For a check run produced by GitHub Actions, re-fetch the same id through actions_get get_workflow_job, which carries head_sha. For a check run from any other App there is no known MCP route to its head_sha. The collection is also paginated — total_count is the collection size, not proof of a single page. --- - + ## Rule @@ -30,7 +30,7 @@ When a readiness snapshot needs check runs bound to a commit: no other field naming a commit** — `html_url` embeds a *run* id, not a sha. `get_workflow_job` on the same id returns `head_sha` and `head_branch` beside -the same `name` / `status` / `conclusion`. Measured on AI-Handbook PR #78 +the same `name` / `status` / `conclusion`. Measured on KITT PR #78 (2026-09-11), job ids `103345180809` and `103345181037`: both returned `head_sha` for the PR's head commit. @@ -43,7 +43,7 @@ assembled for it by this route. Say so rather than inventing the field. ## Why the binding matters rather than being pedantry -The handbook's former readiness gate refused on exactly this: +KITT's former readiness gate refused on exactly this: > `N check run(s) carry no head_sha, so they cannot be tied to -- capture head_sha with each run` diff --git a/.agents/memory/ci-guard-must-fail-loud-on-missing-inputs.md b/.agents/memory/ci-guard-must-fail-loud-on-missing-inputs.md index 9dcdd09..92bd4d8 100644 --- a/.agents/memory/ci-guard-must-fail-loud-on-missing-inputs.md +++ b/.agents/memory/ci-guard-must-fail-loud-on-missing-inputs.md @@ -3,7 +3,7 @@ name: A CI guard that skips on missing inputs is indistinguishable from one that description: check-ledger-coverage.mjs's coverage half returned exit 0 both when it ran the real check and when GITHUB_TOKEN/PR_NUMBER were absent and it silently skipped. First CI run showed green either way — indistinguishable from the check status a reader sees without opening the job log, whose stdout does differ between the two paths. --- - + # A CI guard that skips on missing inputs is indistinguishable from one that verified everything, by CI status alone diff --git a/.agents/memory/codex-cli-in-container.md b/.agents/memory/codex-cli-in-container.md index 7976f60..1d5195f 100644 --- a/.agents/memory/codex-cli-in-container.md +++ b/.agents/memory/codex-cli-in-container.md @@ -3,7 +3,7 @@ name: Codex CLI in a cloud session — closed stdin, a sandbox that blocks /tmp, description: Running `codex exec` from a Bash tool call has four traps that each look like something else. An open stdin hangs forever (looks like a slow model). `--sandbox read-only` blocks /tmp, so a reviewer told to run the suite gets EROFS (looks like a broken repo). A run longer than the tool timeout needs setsid nohup plus an exit file. And `pkill -f 'codex exec'` matches the calling shell's own command line and kills the session's shell. --- - + # Spawning Codex CLI inside a Claude cloud session @@ -104,5 +104,5 @@ the same turn rather than preparing work first. A background waiter for the sign-in (or for any detached `codex` run) polls `login status` or a file the run writes — never `pgrep -f ''`, whose pattern is in the waiter's own command line, so it matches itself and the loop -never exits (measured 2026-10-29: a 30-minute background wait on AI-Handbook +never exits (measured 2026-10-29: a 30-minute background wait on KITT #252 ran to its time limit after the run it watched had finished). diff --git a/.agents/memory/concurrent-lookups-discard-good-results-two-ways.md b/.agents/memory/concurrent-lookups-discard-good-results-two-ways.md index 7cda066..3c921d4 100644 --- a/.agents/memory/concurrent-lookups-discard-good-results-two-ways.md +++ b/.agents/memory/concurrent-lookups-discard-good-results-two-ways.md @@ -1,4 +1,4 @@ - + # Two ways a concurrent lookup pair throws away a result you already had diff --git a/.agents/memory/db-command-blocked-by-sandbox-classifier.md b/.agents/memory/db-command-blocked-by-sandbox-classifier.md index c942e00..32e0649 100644 --- a/.agents/memory/db-command-blocked-by-sandbox-classifier.md +++ b/.agents/memory/db-command-blocked-by-sandbox-classifier.md @@ -3,7 +3,7 @@ name: `pnpm --filter @workspace/db push-force` blocked by the sandbox's auto-mod description: Even with a session-provisioned test DB running, the drizzle-kit push-force command was denied by the Claude Code auto-mode permission classifier as a category, not a one-off. Rely on equivalent CI evidence instead of fighting it. --- - + # Local DB-schema-push command blocked, even with a working test DB diff --git a/.agents/memory/docs-accuracy-skips-paths-missing-their-top-level-prefix.md b/.agents/memory/docs-accuracy-skips-paths-missing-their-top-level-prefix.md index a3ead02..89c1b10 100644 --- a/.agents/memory/docs-accuracy-skips-paths-missing-their-top-level-prefix.md +++ b/.agents/memory/docs-accuracy-skips-paths-missing-their-top-level-prefix.md @@ -1,4 +1,4 @@ - + # Path citation: two deliberate conventions, and what the docs-accuracy gate actually covers diff --git a/.agents/memory/document-ceremony-concurrent-docs-pr-conflict.md b/.agents/memory/document-ceremony-concurrent-docs-pr-conflict.md index e23c546..46d4e8f 100644 --- a/.agents/memory/document-ceremony-concurrent-docs-pr-conflict.md +++ b/.agents/memory/document-ceremony-concurrent-docs-pr-conflict.md @@ -3,7 +3,7 @@ name: A /document harvest branch can hit a real merge conflict against another c description: Restarting a /document ceremony's branch fresh off origin/main only fixes staleness — if another PR merged in the meantime and touched the same shared docs files, popping stashed edits produces genuine content conflicts, not just a rebase formality. --- - + ## Rule The `/document` ceremony's default placement rule diff --git a/.agents/memory/explore-after-merge-restart-branch-first.md b/.agents/memory/explore-after-merge-restart-branch-first.md index e4a2124..3b7b02c 100644 --- a/.agents/memory/explore-after-merge-restart-branch-first.md +++ b/.agents/memory/explore-after-merge-restart-branch-first.md @@ -3,7 +3,7 @@ name: restart the branch onto origin/main BEFORE exploring/planning, not just be description: Why an Explore/Plan pass can silently read a stale local working tree after a prior PR on the same branch squash-merged, and produce a wrong plan a live-code check would have caught. --- - + # Explore/plan against a stale local checkout after a squash-merge diff --git a/.agents/memory/git-cat-file-exit-128-ambiguous.md b/.agents/memory/git-cat-file-exit-128-ambiguous.md index 083735a..fd9c68c 100644 --- a/.agents/memory/git-cat-file-exit-128-ambiguous.md +++ b/.agents/memory/git-cat-file-exit-128-ambiguous.md @@ -3,7 +3,7 @@ name: git show / cat-file -e exit 128 for BOTH a missing path and a missing ref description: A script shelling out to git cannot tell "the file isn't in that commit" from "that ref doesn't exist" by exit status alone; resolve the ref first, then ask about the path, or the actionable error branch is unreachable. --- - + ## Rule `git cat-file -e :` and `git show :` **both exit 128** @@ -26,7 +26,7 @@ just never said the one useful thing it was written to say. Resolving the ref first splits the cases, and this is worth a test **against real git rather than a fake** — the defect lives in the adapter, so a fake that returns whatever the adapter expects cannot catch it going back. See -the handbook's former `review-budget.mjs` `gitShow` (which returned +KITT's former `review-budget.mjs` `gitShow` (which returned present-with-contents / absent / unknown) and its real-git test. ## Related diff --git a/.agents/memory/git-commit-message-backtick-shell-substitution.md b/.agents/memory/git-commit-message-backtick-shell-substitution.md index f69ceb9..1f45fc4 100644 --- a/.agents/memory/git-commit-message-backtick-shell-substitution.md +++ b/.agents/memory/git-commit-message-backtick-shell-substitution.md @@ -3,7 +3,7 @@ name: Git commit message backticks trigger shell command substitution description: A `-m "..."` string with backtick-quoted code spans gets executed by bash before git ever sees it — write the message to a file and use `-F` instead. --- - + ## Rule Never pass a commit message containing backtick-quoted text (e.g. `` `--pr ` ``, diff --git a/.agents/memory/git-fetch-refspec-limited-to-main-hides-a-pushed-branch.md b/.agents/memory/git-fetch-refspec-limited-to-main-hides-a-pushed-branch.md index dfec79c..f2eefa8 100644 --- a/.agents/memory/git-fetch-refspec-limited-to-main-hides-a-pushed-branch.md +++ b/.agents/memory/git-fetch-refspec-limited-to-main-hides-a-pushed-branch.md @@ -3,7 +3,7 @@ name: A fetch refspec limited to main makes a pushed branch look unpushed description: A clone whose remote.origin.fetch names only main never gets a remote-tracking ref for a pushed feature branch, so the stop hook and `@{u}` report the branch as unpushed with no remote branch. Widen the refspec; do not re-push. --- - + # A fetch refspec limited to `main` makes a pushed branch look unpushed @@ -17,7 +17,7 @@ PR is open on it. `remote.origin.fetch = +refs/heads/main:refs/remotes/origin/main` — so no `refs/remotes/origin/claude/` ref is ever created or updated, and every tool that compares the branch to its remote-tracking ref sees nothing -there. Measured twice on 2026-10-11 (ai-handbook, then DojoOS), both clones +there. Measured twice on 2026-10-11 (kitt, then DojoOS), both clones set up by the session harness. **Fix.** Widen the refspec and fetch the branch once; never re-push to diff --git a/.agents/memory/git-lock-sweeper-removed-platform-fixed-it.md b/.agents/memory/git-lock-sweeper-removed-platform-fixed-it.md index 1e5d389..9bd6b61 100644 --- a/.agents/memory/git-lock-sweeper-removed-platform-fixed-it.md +++ b/.agents/memory/git-lock-sweeper-removed-platform-fixed-it.md @@ -3,7 +3,7 @@ name: the git-lock sweeper was deleted — the Replit constraint it worked aroun description: Why scripts/clean-stale-git-locks.sh and its watcher were removed rather than hardened, and what evidence to gather before anyone proposes rebuilding automatic .git lock cleanup. --- - + # The git-lock sweeper, and why it is not coming back diff --git a/.agents/memory/git-sync-authenticated-push.md b/.agents/memory/git-sync-authenticated-push.md index 9d1c3f8..ff3a6e2 100644 --- a/.agents/memory/git-sync-authenticated-push.md +++ b/.agents/memory/git-sync-authenticated-push.md @@ -3,7 +3,7 @@ name: Authenticated Git sync description: Shell HTTPS pushes can fail even when Replit's authenticated Git sync works. --- - + When publishing to a GitHub remote from this workspace, prefer the authenticated Git sync integration over a direct shell `git push` if HTTPS credentials are rejected. diff --git a/.agents/memory/github-actions-concurrency-group-key-and-queue-max.md b/.agents/memory/github-actions-concurrency-group-key-and-queue-max.md index 780a791..ac7e9d3 100644 --- a/.agents/memory/github-actions-concurrency-group-key-and-queue-max.md +++ b/.agents/memory/github-actions-concurrency-group-key-and-queue-max.md @@ -1,4 +1,4 @@ - + ## `concurrency` groups: `github.ref` collides across pushes; `queue: max` can't combine with a conditional `cancel-in-progress` diff --git a/.agents/memory/github-actions-concurrent-label-mutation-pattern.md b/.agents/memory/github-actions-concurrent-label-mutation-pattern.md index 62e5032..c748c7c 100644 --- a/.agents/memory/github-actions-concurrent-label-mutation-pattern.md +++ b/.agents/memory/github-actions-concurrent-label-mutation-pattern.md @@ -1,4 +1,4 @@ - + ## Writing a GitHub Action that mutates issue labels concurrently with agents/humans diff --git a/.agents/memory/github-actions-outage-mimics-quota.md b/.agents/memory/github-actions-outage-mimics-quota.md index b7a91f9..a84ba51 100644 --- a/.agents/memory/github-actions-outage-mimics-quota.md +++ b/.agents/memory/github-actions-outage-mimics-quota.md @@ -1,4 +1,4 @@ - + ## GitHub Actions runs silently not starting can be a status.github.com outage, not a quota/billing problem diff --git a/.agents/memory/github-actions-required-checks-job-if-vs-paths-filter.md b/.agents/memory/github-actions-required-checks-job-if-vs-paths-filter.md index 3ed0b95..37a351d 100644 --- a/.agents/memory/github-actions-required-checks-job-if-vs-paths-filter.md +++ b/.agents/memory/github-actions-required-checks-job-if-vs-paths-filter.md @@ -1,4 +1,4 @@ - + ## Skipping CI on some PRs: job-level `if:`, never workflow-level `paths:` diff --git a/.agents/memory/github-mcp-no-label-creation-tool.md b/.agents/memory/github-mcp-no-label-creation-tool.md index 7911fd8..b6ce9b0 100644 --- a/.agents/memory/github-mcp-no-label-creation-tool.md +++ b/.agents/memory/github-mcp-no-label-creation-tool.md @@ -1,4 +1,4 @@ - + # No GitHub label-creation tool in this environment's MCP surface diff --git a/.agents/memory/github-mcp-review-comments-shape-differs-from-rest.md b/.agents/memory/github-mcp-review-comments-shape-differs-from-rest.md index 83b2476..97833d8 100644 --- a/.agents/memory/github-mcp-review-comments-shape-differs-from-rest.md +++ b/.agents/memory/github-mcp-review-comments-shape-differs-from-rest.md @@ -3,7 +3,7 @@ name: GitHub MCP pull_request_read shape differs materially from the REST API description: get_review_comments groups by thread with a bare author string, no numeric id, no in_reply_to_id, and no pull_request_review_id — and the reviewer bot's login has an inconsistent [bot] suffix across methods. --- - + ## Rule Never assume the GitHub MCP server's `pull_request_read` tool returns the @@ -44,7 +44,7 @@ conversation**, not the code. `resolved`.** A live `get_review_comments` response observed 2026-08-19 returns **`is_resolved` / `is_outdated` / `is_collapsed`** (snake_case) on each thread, while the tool's own description advertises **`isResolved` / `isOutdated` / -`isCollapsed`**. The handbook's former `review-loop-record.mjs` read `thread.isResolved` off +`isCollapsed`**. KITT's former `review-loop-record.mjs` read `thread.isResolved` off a captured snapshot and emits its own flattened `resolved` field, so all three spellings are live in this repo at different layers. **Check the shape of the snapshot in front of you** — a miss here reads `undefined`, which the record diff --git a/.agents/memory/github-project-field-names-need-normalized-matching.md b/.agents/memory/github-project-field-names-need-normalized-matching.md index f0c88ef..fb7bfea 100644 --- a/.agents/memory/github-project-field-names-need-normalized-matching.md +++ b/.agents/memory/github-project-field-names-need-normalized-matching.md @@ -1,4 +1,4 @@ - + # GitHub Project v2 field/option names typed by hand need normalized matching, not exact string comparison diff --git a/.agents/memory/github-rest-api-blocked-from-bash.md b/.agents/memory/github-rest-api-blocked-from-bash.md index af5fa13..1684dc2 100644 --- a/.agents/memory/github-rest-api-blocked-from-bash.md +++ b/.agents/memory/github-rest-api-blocked-from-bash.md @@ -3,7 +3,7 @@ name: The agent proxy blocks ALL direct api.github.com calls from bash — GitHu description: Any curl/fetch to api.github.com from a Bash tool call returns 403 "GitHub access is not enabled for this session", whatever the endpoint, token or URL. A poll loop built on it does not fail — it silently returns nothing and sleeps, which looks exactly like "still waiting". Use mcp__github__* for every GitHub read. --- - + # There is no bash path to the GitHub API in this environment diff --git a/.agents/memory/github-slugger-is-the-anchor-algorithm.md b/.agents/memory/github-slugger-is-the-anchor-algorithm.md index ea36dae..8330c9a 100644 --- a/.agents/memory/github-slugger-is-the-anchor-algorithm.md +++ b/.agents/memory/github-slugger-is-the-anchor-algorithm.md @@ -1,4 +1,4 @@ - + # `github-slugger` IS GitHub's anchor algorithm — never hand-roll a slug regex diff --git a/.agents/memory/hook-uncaught-throw-fails-open.md b/.agents/memory/hook-uncaught-throw-fails-open.md index 7a49b47..983183b 100644 --- a/.agents/memory/hook-uncaught-throw-fails-open.md +++ b/.agents/memory/hook-uncaught-throw-fails-open.md @@ -1,13 +1,13 @@ --- name: A control that cannot evaluate must refuse, and a PreToolUse hook that throws fails OPEN -description: The blocking signal for a PreToolUse hook is exit code 2; an escaping exception exits 1, which the harness reads as a hook error and lets the tool call proceed. The handbook's PreToolUse hooks are gone (its one hook now is the needs-you alert, which never blocks), but the exit-code contract and the general rule both still apply to anything that runs as one. +description: The blocking signal for a PreToolUse hook is exit code 2; an escaping exception exits 1, which the harness reads as a hook error and lets the tool call proceed. KITT's PreToolUse hooks are gone (its one hook now is the needs-you alert, which never blocks), but the exit-code contract and the general rule both still apply to anything that runs as one. --- - + ## The mechanism this was written about is gone -The handbook shipped three `PreToolUse` hooks — a destructive-command guard, a +KITT shipped three `PreToolUse` hooks — a destructive-command guard, a review-request guard and a merge gate — all forwarding to one decision script. The #89 cut removed them (#94, #97) in favour of server-side GitHub rulesets, which cannot fail open because there is no local process whose exit code diff --git a/.agents/memory/inline-tool-results-recoverable-from-transcript.md b/.agents/memory/inline-tool-results-recoverable-from-transcript.md index b89d24c..56b644b 100644 --- a/.agents/memory/inline-tool-results-recoverable-from-transcript.md +++ b/.agents/memory/inline-tool-results-recoverable-from-transcript.md @@ -3,7 +3,7 @@ name: An inline tool result can be recovered byte-exact from the session transcr description: A tool response small enough to come back inline is normally re-typed into a capture file, which is where evidence gets corrupted. The same bytes are on disk at ~/.claude/projects//.jsonl as tool_result blocks. Write the extract OUTSIDE any tool-results directory, or captureSource() will classify it harness-capture and discard your declared fetch time. --- - + ## Rule @@ -43,14 +43,14 @@ costs nothing to refresh, and evidence it hands back inline costs a transcription.** So any rule demanding a large capture per round is free, and one demanding a small capture is a tax — and the discipline that is expensive is the one that gets skipped, which is how evidence got fabricated in the -first place (AI-Handbook #38, round 4: a snapshot carrying invented ids). +first place (KITT #38, round 4: a snapshot carrying invented ids). The transcript closes that gap for the inline case. The bytes exist; the retyping step is optional. ## The trap: where you save the extract decides how it is classified -The handbook's former snapshot assembler classified a capture **solely from +KITT's former snapshot assembler classified a capture **solely from the path** its `captureSource()` was handed — and anything that rebuilds this for #95 or #96 will face the same choice: @@ -84,7 +84,7 @@ GitHub's actual timestamps. ## Related -- AI-Handbook #75 — the mechanical record's evidence path had an unguarded +- KITT #75 — the mechanical record's evidence path had an unguarded hand step. **Closed** by #79, which made this recovery a script; the #89 cut then removed that script with the record it fed. The note stays because the technique is still worth knowing, the `tool-results/` trap is still live, diff --git a/.agents/memory/issue-write-update-silently-drops-add-comment.md b/.agents/memory/issue-write-update-silently-drops-add-comment.md index 19453de..c33351b 100644 --- a/.agents/memory/issue-write-update-silently-drops-add-comment.md +++ b/.agents/memory/issue-write-update-silently-drops-add-comment.md @@ -3,7 +3,7 @@ name: issue_write with method "update" silently drops an add_comment payload -- description: Use add_issue_comment to post a comment; never pass a comment body to issue_write update. Verify a posted comment by reading it back, because the success response cannot be told from a real one by its status alone. --- - + # A comment that was never posted, reported as posted diff --git a/.agents/memory/machinery-threat-model-is-my-own-mistakes.md b/.agents/memory/machinery-threat-model-is-my-own-mistakes.md index 07daba0..d19aed9 100644 --- a/.agents/memory/machinery-threat-model-is-my-own-mistakes.md +++ b/.agents/memory/machinery-threat-model-is-my-own-mistakes.md @@ -1,9 +1,9 @@ --- name: The machinery's threat model is my own mistakes, not an adversary — a local script is not a security boundary -description: Ten review rounds on AI-Handbook PR #7 hardened repository identity against an attacker who can edit the working tree, commit to the branch, or substitute another repository's receipts. That attacker is me. The controls against deliberate action are GitHub's server-side ruleset and the human working alongside, who reads the one line every authority-widening PR carries naming what latitude it grants; the scripts exist to catch mistakes, and designing them to resist their own operator produced three trust anchors, eleven findings, and no additional safety. +description: Ten review rounds on KITT PR #7 hardened repository identity against an attacker who can edit the working tree, commit to the branch, or substitute another repository's receipts. That attacker is me. The controls against deliberate action are GitHub's server-side ruleset and the human working alongside, who reads the one line every authority-widening PR carries naming what latitude it grants; the scripts exist to catch mistakes, and designing them to resist their own operator produced three trust anchors, eleven findings, and no additional safety. --- - + # The machinery's threat model is my own mistakes, not an adversary — a local script is not a security boundary @@ -66,7 +66,7 @@ A finding of the shape "an edit to the working tree could…" is declined by pointing at the rule's home (`agents-core.md`, *Important product principles*) and at this note for the history. It is not a defect in a mistake-catcher that its operator can disable it. -## The fifth time, and why the rule did not fire (AI-Handbook #211, 2026-10-15) +## The fifth time, and why the rule did not fire (KITT #211, 2026-10-15) The rule above was on file, in `agents-core.md` and in this note, when Codex's second review of #211 reported that an eval task file carrying the @@ -95,7 +95,7 @@ section: The first four instances: #7 (ten rounds, above), #73 (four rounds on one flag; `agents-core.md`, the home, and `known-failure-patterns.md`'s decline-scoped-to-the-example entry), the link checker of #64 (four rounds -returning 2, 2, 6 and 7 findings; the handbook's `docs/consuming-repos.md`), +returning 2, 2, 6 and 7 findings; KITT's `docs/consuming-repos.md`), and Overhype.me #425 (a guard scoped to habitual mistakes at round seven; `known-failure-patterns.md`'s adversarial-reviewer entry). The cost each time was review rounds, never a defect. diff --git a/.agents/memory/migration-file-immutable-once-merged.md b/.agents/memory/migration-file-immutable-once-merged.md index 90e12ab..082653a 100644 --- a/.agents/memory/migration-file-immutable-once-merged.md +++ b/.agents/memory/migration-file-immutable-once-merged.md @@ -3,7 +3,7 @@ name: A migration file already on main is byte-for-byte immutable description: The migration runner tracks "already applied" by SHA-256 of the whole file — editing even a comment in an already-merged migration makes it replay. --- - + # Editing an already-merged migration file — even a comment — makes it replay diff --git a/.agents/memory/plan-doc-path-never-cite-from-code.md b/.agents/memory/plan-doc-path-never-cite-from-code.md index d989824..34ea0a9 100644 --- a/.agents/memory/plan-doc-path-never-cite-from-code.md +++ b/.agents/memory/plan-doc-path-never-cite-from-code.md @@ -3,7 +3,7 @@ name: Never cite a docs/plans/ path from code — a plan is a point-in-time reco description: A module docstring cited docs/plans/PLAN_ASYNC_QUEUE_HARDENING.md as the tracking location for a deferred decision; that file only ever existed on the never-merged plan-review branch, so the citation was dangling from the first commit. Plans are committed now, but a plan still records what was approved then, not where a deferral is tracked. --- - + # A `docs/plans/PLAN_*.md` path is never a tracking citation from implementation code diff --git a/.agents/memory/pnpm-override-scope-and-application.md b/.agents/memory/pnpm-override-scope-and-application.md index 4d75052..342bc6e 100644 --- a/.agents/memory/pnpm-override-scope-and-application.md +++ b/.agents/memory/pnpm-override-scope-and-application.md @@ -3,7 +3,7 @@ name: pnpm workspace `overrides:` — bare entries can silently no-op; scope is description: A bare package-name override in pnpm-workspace.yaml didn't change the resolved version even after `pnpm install --force`; `pnpm update -r` was what actually worked. Separately, a workspace-wide override does not force a package's own direct dependency specifier for that same package. --- - + # pnpm `overrides:` — two gotchas discovered forcing `fast-uri` and `esbuild` versions diff --git a/.agents/memory/prose-cross-refs-invisible-to-link-checker.md b/.agents/memory/prose-cross-refs-invisible-to-link-checker.md index 865fe77..b3d370d 100644 --- a/.agents/memory/prose-cross-refs-invisible-to-link-checker.md +++ b/.agents/memory/prose-cross-refs-invisible-to-link-checker.md @@ -3,7 +3,7 @@ name: Moving a section between CLAUDE.md and a skill leaves prose cross-referenc description: check-docs-accuracy.mjs only validates `[text](path)` markdown links. A sentence like "see CLAUDE.md's *Automated plan review* section" that names a heading rather than linking to a file passes the checker clean even after that heading moves or is renamed — the check has nothing to verify. --- - + # Moving a section between CLAUDE.md and a skill leaves prose cross-references stale and invisible to the link checker diff --git a/.agents/memory/raw-nul-byte-in-source-makes-file-binary.md b/.agents/memory/raw-nul-byte-in-source-makes-file-binary.md index 8ffd7d1..bc6e2b4 100644 --- a/.agents/memory/raw-nul-byte-in-source-makes-file-binary.md +++ b/.agents/memory/raw-nul-byte-in-source-makes-file-binary.md @@ -3,7 +3,7 @@ name: A raw NUL byte in a TS/JS source file makes Git (and grep) treat the whole description: Why using a literal `\x00` character as a string delimiter in source silently breaks diffing, review, and text search for that file. --- - + # A raw NUL byte in source code makes Git treat the file as binary diff --git a/.agents/memory/react-setstate-updater-not-synchronous.md b/.agents/memory/react-setstate-updater-not-synchronous.md index 814af4b..fbfafd4 100644 --- a/.agents/memory/react-setstate-updater-not-synchronous.md +++ b/.agents/memory/react-setstate-updater-not-synchronous.md @@ -3,7 +3,7 @@ name: React setState functional-updater callback isn't synchronous description: Why writing to a ref inside a setState(prev => …) updater doesn't fix a same-tick stale-read race — and what does. --- - + # A `setState(prev => …)` updater's side effects are not guaranteed to run before your very next line diff --git a/.agents/memory/reading-a-failed-ci-test-from-the-log-archive.md b/.agents/memory/reading-a-failed-ci-test-from-the-log-archive.md index 0cd7008..dbf999e 100644 --- a/.agents/memory/reading-a-failed-ci-test-from-the-log-archive.md +++ b/.agents/memory/reading-a-failed-ci-test-from-the-log-archive.md @@ -1,4 +1,4 @@ - + # Finding which test actually failed in CI — and why the obvious route is blocked @@ -17,7 +17,7 @@ archive (`actions_get` → `get_workflow_run_logs_url`, then download + `grep -r "not ok [0-9]* - "`) does contain it, and the signed `results-receiver.actions.githubusercontent.com` URL is a blob host rather than `api.github.com`. But downloading it needs `curl`/`wget`, and -The handbook's former shell guard **refused those categorically** — no exception for +KITT's former shell guard **refused those categorically** — no exception for argument shape or host (see `github-rest-api-blocked-from-bash.md`). Do not plan around this by reaching for the fetch anyway. diff --git a/.agents/memory/reduction-over-a-set-that-changed-size.md b/.agents/memory/reduction-over-a-set-that-changed-size.md index 6dc1c8f..e9203e8 100644 --- a/.agents/memory/reduction-over-a-set-that-changed-size.md +++ b/.agents/memory/reduction-over-a-set-that-changed-size.md @@ -1,4 +1,4 @@ - + ## A change to a set's cardinality invalidates every reduction over it @@ -10,7 +10,7 @@ error, and the singleton-era tests still pass because they only ever construct one element. **The worked example, stated precisely — because the imprecise version is the -lesson.** In the handbook's former `pr-ready.mjs`, `acceptedAt` used `Math.min` over the +lesson.** In KITT's former `pr-ready.mjs`, `acceptedAt` used `Math.min` over the qualifying review passes. Round 3 of PR #490 introduced a rule that let `qualifying` hold more than one element, and `min` then selected the *earliest* accepted response where the check needed the *latest*. diff --git a/.agents/memory/replit-commits-reach-main-only-through-a-pr.md b/.agents/memory/replit-commits-reach-main-only-through-a-pr.md index b44879d..f172cc8 100644 --- a/.agents/memory/replit-commits-reach-main-only-through-a-pr.md +++ b/.agents/memory/replit-commits-reach-main-only-through-a-pr.md @@ -3,7 +3,7 @@ name: Replit commits reach main only through a pull request — a commit on main description: The sanctioned direct-push lane from Replit to main was retired on 2026-10-03 when David removed every ruleset's bypass; what the old lane taught that still holds, and what replaced it. --- - + # Replit commits reach `main` only through a pull request diff --git a/.agents/memory/repo-wide-typecheck-vs-per-package.md b/.agents/memory/repo-wide-typecheck-vs-per-package.md index a2e5e5d..106deef 100644 --- a/.agents/memory/repo-wide-typecheck-vs-per-package.md +++ b/.agents/memory/repo-wide-typecheck-vs-per-package.md @@ -3,7 +3,7 @@ name: Per-package tsc -b can pass while the repo-wide `pnpm typecheck` fails description: A new cross-package workspace import needs the consuming package's tsconfig.json project reference updated, or `tsc -b`'s stricter resolution fails elsewhere in the repo than the package you were checking. --- - + # Checking one package's `tsc -b` doesn't catch a missing project reference in another diff --git a/.agents/memory/retrofit-checklist-source-the-plan-not-the-roadmap.md b/.agents/memory/retrofit-checklist-source-the-plan-not-the-roadmap.md index a50eb19..ed593f7 100644 --- a/.agents/memory/retrofit-checklist-source-the-plan-not-the-roadmap.md +++ b/.agents/memory/retrofit-checklist-source-the-plan-not-the-roadmap.md @@ -1,4 +1,4 @@ - + # Retrofitting durable, mechanically-read state: source the plan, not the roadmap summary diff --git a/.agents/memory/running-long-test-suites.md b/.agents/memory/running-long-test-suites.md index d05534a..109a629 100644 --- a/.agents/memory/running-long-test-suites.md +++ b/.agents/memory/running-long-test-suites.md @@ -3,7 +3,7 @@ name: Running long test suites in the bash tool description: How to reliably run the multi-minute test suites without the bash tool killing the process mid-run --- - + # Running long test suites without losing output diff --git a/.agents/memory/stacked-pr-gets-no-workflow-run.md b/.agents/memory/stacked-pr-gets-no-workflow-run.md index da01b78..8d78db1 100644 --- a/.agents/memory/stacked-pr-gets-no-workflow-run.md +++ b/.agents/memory/stacked-pr-gets-no-workflow-run.md @@ -1,4 +1,4 @@ - + ## A stacked PR gets no workflow run at all — but zero runs does NOT prove that diff --git a/.agents/memory/stale-remote-tracking-ref-after-squash-merge.md b/.agents/memory/stale-remote-tracking-ref-after-squash-merge.md index 6ce3709..b1b3384 100644 --- a/.agents/memory/stale-remote-tracking-ref-after-squash-merge.md +++ b/.agents/memory/stale-remote-tracking-ref-after-squash-merge.md @@ -3,7 +3,7 @@ name: a squash-merge deletes the remote branch, but a stale local remote-trackin description: git fetch --prune fixes a stop-hook or git-status report that claims unpushed local commits exist when the branch is actually fully merged and identical to origin/main. --- - + # A deleted remote branch leaves a stale tracking ref behind diff --git a/.agents/memory/workflow-dispatch-needs-default-branch.md b/.agents/memory/workflow-dispatch-needs-default-branch.md index 4e0ec49..640a07e 100644 --- a/.agents/memory/workflow-dispatch-needs-default-branch.md +++ b/.agents/memory/workflow-dispatch-needs-default-branch.md @@ -1,4 +1,4 @@ - + # A brand-new workflow can't be `workflow_dispatch`-triggered until it exists on the default branch diff --git a/.agents/receipts/.gitignore b/.agents/receipts/.gitignore index a3f2f68..d5d473b 100644 --- a/.agents/receipts/.gitignore +++ b/.agents/receipts/.gitignore @@ -1,4 +1,4 @@ -# SYNCED FROM AI-Handbook — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change the handbook instead. +# SYNCED FROM KITT — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change KITT instead. # Dispatch receipts, and every one of them is EVIDENCE rather than a decision. # # One file describes one dispatch at one moment: which role ran, on which @@ -20,6 +20,6 @@ # do nothing. # # This lives in the directory it governs rather than in the repo root so that -# it is an ordinary synced file — one copy in the handbook, carried to every +# it is an ordinary synced file — one copy in KITT, carried to every # consumer. Patterns are relative to this directory. fable-*.json diff --git a/.agents/reviews/.gitignore b/.agents/reviews/.gitignore index 7fda2a4..00616f1 100644 --- a/.agents/reviews/.gitignore +++ b/.agents/reviews/.gitignore @@ -1,4 +1,4 @@ -# SYNCED FROM AI-Handbook — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change the handbook instead. +# SYNCED FROM KITT — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change KITT instead. # Per-plan review-loop evidence: the round snapshots `plan-review.mjs` writes # under .agents/reviews//. # @@ -10,13 +10,13 @@ # WHY THIS FILE EXISTS. `plan-review.mjs` writes an ignore file for the # directories a plan loop creates, but only once it has run; a checkout that # has not yet run one was covered by nothing, and an ordinary `git add -A` -# staged a snapshot of the material under review. (AI-Handbook #91 round 1, +# staged a snapshot of the material under review. (KITT #91 round 1, # where the uncovered directory was the code loop's; the code loop is gone and # the same hole remains for the plan loop.) # # WHY THERE ARE TWO COPIES. Git does not follow a symlinked .gitignore, so a # pointer is impossible and a real file at each root is the only option. The -# handbook mirrors this one at .agents/reviews/.gitignore, and +# KITT mirrors this one at .agents/reviews/.gitignore, and # scripts/check-root-wiring.mjs compares the pattern lines so the duplication # is enforced rather than merely intended. Edit THIS copy; the root follows. * diff --git a/.agents/roles/review-proxy.md b/.agents/roles/review-proxy.md index 39872ac..c8d6d2c 100644 --- a/.agents/roles/review-proxy.md +++ b/.agents/roles/review-proxy.md @@ -1,4 +1,4 @@ - + # You are David's independent technical adviser diff --git a/.agents/roles/schemas/fable-build-report.schema.json b/.agents/roles/schemas/fable-build-report.schema.json index ac9143e..983febc 100644 --- a/.agents/roles/schemas/fable-build-report.schema.json +++ b/.agents/roles/schemas/fable-build-report.schema.json @@ -1,5 +1,5 @@ { - "$comment": "SYNCED FROM AI-Handbook — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change the handbook instead.", + "$comment": "SYNCED FROM KITT — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change KITT instead.", "type": "object", "properties": { "about": { @@ -70,7 +70,7 @@ }, "spend": { "type": "object", - "description": "Read from the workstream issue's State of Play (or the private source the brief carries) and the fleet's paid-run ledger issue in the handbook's repository, quoted as found. null in a field means the line was not there.", + "description": "Read from the workstream issue's State of Play (or the private source the brief carries) and the fleet's paid-run ledger issue in KITT's repository, quoted as found. null in a field means the line was not there.", "properties": { "build_total": { "type": ["string", "null"], "minTrimmedLength": 1, "description": "The 'Spend so far' line, as written, from the workstream issue or from the private source when the brief carries one." }, "paid_runs_this_week": { "type": ["string", "null"], "minTrimmedLength": 1, "description": "The paid AI runs in the trailing seven days from the fleet ledger issue, totalled across every product, or null when there is no ledger issue." } diff --git a/.claude/agents/adversarial-modeler.md b/.claude/agents/adversarial-modeler.md index de7e155..b3cdfd9 100644 --- a/.claude/agents/adversarial-modeler.md +++ b/.claude/agents/adversarial-modeler.md @@ -4,7 +4,7 @@ description: "Models attacker perspectives and builds exploit scenarios for HIGH tools: Read, Grep, Glob, Bash --- - + # Adversarial Modeler diff --git a/.claude/agents/fable-build-report.md b/.claude/agents/fable-build-report.md index bf431ab..2370e61 100644 --- a/.claude/agents/fable-build-report.md +++ b/.claude/agents/fable-build-report.md @@ -15,7 +15,7 @@ no argument, so this is its only route. Reasoning and measurements: `model-routing`. --> - + # Report this unit of work to David @@ -87,7 +87,7 @@ one that has repeatedly caught what nobody else did. thing is open. Recorded-gap tables in a pull request body count, and so does anything you see that nobody named. - **`overbuilt`** — each place the builder wrote more than a finding was - worth. The measured case (AI-Handbook #109): the reviewer's login is a + worth. The measured case (KITT #109): the reviewer's login is a constant, and it got a config key, a reader, a refusal and a normalisation rule before being replaced by the constant. A fix is not overbuilt merely for being large. Empty is the common answer. diff --git a/.claude/agents/fable-review-assessor.md b/.claude/agents/fable-review-assessor.md index 3e17b85..c323109 100644 --- a/.claude/agents/fable-review-assessor.md +++ b/.claude/agents/fable-review-assessor.md @@ -1,6 +1,6 @@ --- name: fable-review-assessor -description: "The second independent assessment of a code-review round (AI-Handbook #96). Reads the same brief, findings, intent and revision the other assessor reads, forms its own judgment without seeing theirs, and writes it as Markdown. Advises rather than commands; may settle a purely technical disagreement once the evidence is in, and never a decision reserved for David." +description: "The second independent assessment of a code-review round (KITT #96). Reads the same brief, findings, intent and revision the other assessor reads, forms its own judgment without seeing theirs, and writes it as Markdown. Advises rather than commands; may settle a purely technical disagreement once the evidence is in, and never a decision reserved for David." tools: Read, Grep, Glob, Bash, Write model: claude-fable-5-1 effort: xhigh @@ -23,7 +23,7 @@ whatever session dispatched it, holding the tie-break under Fable's name, for as long as it has existed (#126). --> - + # You are the second independent assessment of this review round diff --git a/.claude/agents/semgrep-scanner.md b/.claude/agents/semgrep-scanner.md index baf771f..b5b6e7e 100644 --- a/.claude/agents/semgrep-scanner.md +++ b/.claude/agents/semgrep-scanner.md @@ -4,7 +4,7 @@ description: "Executes Semgrep CLI scans for a specific language category and pr tools: Bash(semgrep scan:*), Bash --- - + # Semgrep Scanner Agent diff --git a/.claude/rules/map-before-edit.md b/.claude/rules/map-before-edit.md index 4a1677c..8a81724 100644 --- a/.claude/rules/map-before-edit.md +++ b/.claude/rules/map-before-edit.md @@ -3,7 +3,7 @@ paths: - "__complete-during-adoption__/**" --- - + # Query the structure before you change it diff --git a/.claude/skills/VENDORED_SKILLS_NOTICE.md b/.claude/skills/VENDORED_SKILLS_NOTICE.md index 4fd9792..b4d9c9a 100644 --- a/.claude/skills/VENDORED_SKILLS_NOTICE.md +++ b/.claude/skills/VENDORED_SKILLS_NOTICE.md @@ -1,4 +1,4 @@ - + # Vendored / externally-installed skills @@ -179,7 +179,7 @@ Modification status: calibration block for its implementer prompt's escalations; `systematic-debugging`'s three-failed-fixes stop was left as an ask, and its note now says so, since a design flaw after three fixes is Tier C. - The 2026-10-17 paid-run sweep (AI-Handbook #219) added one clause to the + The 2026-10-17 paid-run sweep (KITT #219) added one clause to the existing notes of `prototype/LOGIC.md`, `prototype/UI.md` and `test-driven-development/SKILL.md`: a check that would start a paid AI run runs within David's paid-run budget — $5 a run, $25 a week across every product — and asks him diff --git a/.claude/skills/agentic-actions-auditor/SKILL.md b/.claude/skills/agentic-actions-auditor/SKILL.md index 042940c..87b9c51 100644 --- a/.claude/skills/agentic-actions-auditor/SKILL.md +++ b/.claude/skills/agentic-actions-auditor/SKILL.md @@ -4,7 +4,7 @@ description: "Audits GitHub Actions workflows for security vulnerabilities in AI allowed-tools: Read Grep Glob Bash --- - + # Agentic Actions Auditor diff --git a/.claude/skills/agentic-actions-auditor/references/action-profiles.md b/.claude/skills/agentic-actions-auditor/references/action-profiles.md index 9b5a150..400c73b 100644 --- a/.claude/skills/agentic-actions-auditor/references/action-profiles.md +++ b/.claude/skills/agentic-actions-auditor/references/action-profiles.md @@ -1,4 +1,4 @@ - + # Action Security Profiles diff --git a/.claude/skills/agentic-actions-auditor/references/cross-file-resolution.md b/.claude/skills/agentic-actions-auditor/references/cross-file-resolution.md index 6e906cc..145c42f 100644 --- a/.claude/skills/agentic-actions-auditor/references/cross-file-resolution.md +++ b/.claude/skills/agentic-actions-auditor/references/cross-file-resolution.md @@ -1,4 +1,4 @@ - + # Cross-File Resolution: Composite Actions and Reusable Workflows diff --git a/.claude/skills/agentic-actions-auditor/references/foundations.md b/.claude/skills/agentic-actions-auditor/references/foundations.md index d7a9af3..c98e772 100644 --- a/.claude/skills/agentic-actions-auditor/references/foundations.md +++ b/.claude/skills/agentic-actions-auditor/references/foundations.md @@ -1,4 +1,4 @@ - + # Shared Foundations: Attacker-Controlled Input Model diff --git a/.claude/skills/agentic-actions-auditor/references/vector-a-env-var-intermediary.md b/.claude/skills/agentic-actions-auditor/references/vector-a-env-var-intermediary.md index 8b60907..4222119 100644 --- a/.claude/skills/agentic-actions-auditor/references/vector-a-env-var-intermediary.md +++ b/.claude/skills/agentic-actions-auditor/references/vector-a-env-var-intermediary.md @@ -1,4 +1,4 @@ - + # Vector A: Env Var Intermediary diff --git a/.claude/skills/agentic-actions-auditor/references/vector-b-direct-expression-injection.md b/.claude/skills/agentic-actions-auditor/references/vector-b-direct-expression-injection.md index 7601fe3..9960e8f 100644 --- a/.claude/skills/agentic-actions-auditor/references/vector-b-direct-expression-injection.md +++ b/.claude/skills/agentic-actions-auditor/references/vector-b-direct-expression-injection.md @@ -1,4 +1,4 @@ - + # Vector B: Direct Expression Injection diff --git a/.claude/skills/agentic-actions-auditor/references/vector-c-cli-data-fetch.md b/.claude/skills/agentic-actions-auditor/references/vector-c-cli-data-fetch.md index 8f8fc2c..4ebbfeb 100644 --- a/.claude/skills/agentic-actions-auditor/references/vector-c-cli-data-fetch.md +++ b/.claude/skills/agentic-actions-auditor/references/vector-c-cli-data-fetch.md @@ -1,4 +1,4 @@ - + # Vector C: CLI Data Fetch diff --git a/.claude/skills/agentic-actions-auditor/references/vector-d-pr-target-checkout.md b/.claude/skills/agentic-actions-auditor/references/vector-d-pr-target-checkout.md index ce165c8..dcc53c4 100644 --- a/.claude/skills/agentic-actions-auditor/references/vector-d-pr-target-checkout.md +++ b/.claude/skills/agentic-actions-auditor/references/vector-d-pr-target-checkout.md @@ -1,4 +1,4 @@ - + # Vector D: pull_request_target + PR Head Checkout diff --git a/.claude/skills/agentic-actions-auditor/references/vector-e-error-log-injection.md b/.claude/skills/agentic-actions-auditor/references/vector-e-error-log-injection.md index aece067..c649a0f 100644 --- a/.claude/skills/agentic-actions-auditor/references/vector-e-error-log-injection.md +++ b/.claude/skills/agentic-actions-auditor/references/vector-e-error-log-injection.md @@ -1,4 +1,4 @@ - + # Vector E: Error Log Injection diff --git a/.claude/skills/agentic-actions-auditor/references/vector-f-subshell-expansion.md b/.claude/skills/agentic-actions-auditor/references/vector-f-subshell-expansion.md index fd3ec47..283a913 100644 --- a/.claude/skills/agentic-actions-auditor/references/vector-f-subshell-expansion.md +++ b/.claude/skills/agentic-actions-auditor/references/vector-f-subshell-expansion.md @@ -1,4 +1,4 @@ - + # Vector F: Subshell Expansion in Restricted Tool Lists diff --git a/.claude/skills/agentic-actions-auditor/references/vector-g-eval-of-ai-output.md b/.claude/skills/agentic-actions-auditor/references/vector-g-eval-of-ai-output.md index 93448b7..a86af7d 100644 --- a/.claude/skills/agentic-actions-auditor/references/vector-g-eval-of-ai-output.md +++ b/.claude/skills/agentic-actions-auditor/references/vector-g-eval-of-ai-output.md @@ -1,4 +1,4 @@ - + # Vector G: Eval of AI Output diff --git a/.claude/skills/agentic-actions-auditor/references/vector-h-dangerous-sandbox-configs.md b/.claude/skills/agentic-actions-auditor/references/vector-h-dangerous-sandbox-configs.md index 17a7018..d7f85d3 100644 --- a/.claude/skills/agentic-actions-auditor/references/vector-h-dangerous-sandbox-configs.md +++ b/.claude/skills/agentic-actions-auditor/references/vector-h-dangerous-sandbox-configs.md @@ -1,4 +1,4 @@ - + # Vector H: Dangerous Sandbox Configurations diff --git a/.claude/skills/agentic-actions-auditor/references/vector-i-wildcard-allowlists.md b/.claude/skills/agentic-actions-auditor/references/vector-i-wildcard-allowlists.md index 830056c..45edd04 100644 --- a/.claude/skills/agentic-actions-auditor/references/vector-i-wildcard-allowlists.md +++ b/.claude/skills/agentic-actions-auditor/references/vector-i-wildcard-allowlists.md @@ -1,4 +1,4 @@ - + # Vector I: Wildcard User Allowlists diff --git a/.claude/skills/archive/SKILL.md b/.claude/skills/archive/SKILL.md index 3605fc0..b3833c6 100644 --- a/.claude/skills/archive/SKILL.md +++ b/.claude/skills/archive/SKILL.md @@ -3,7 +3,7 @@ name: archive description: Answer one question cheaply — "are we done with everything this session needs to do, and should we archive it?" — and archive the session when the answer is yes. Use when David says /archive, "can we archive this", "are we done here", or "should I close this session". Checks only what dies with the session (unpushed work, a PR this session watches, armed check-ins, running tasks, unpaid close-out, unpersisted learnings, an open ask), returns one of three verdicts — continue, hand off, archive — and on archive schedules the session's own archiving a minute after the verdict is shown. NOT /handoff (which moves context and costs far more) and NOT /next or /status (which rank or report work); this skill reads no workstream but its own. --- - + # /archive — is this session finished? diff --git a/.claude/skills/brainstorming/SKILL.md b/.claude/skills/brainstorming/SKILL.md index cc7fc25..9614210 100644 --- a/.claude/skills/brainstorming/SKILL.md +++ b/.claude/skills/brainstorming/SKILL.md @@ -3,11 +3,11 @@ name: brainstorming description: "You MUST use this before any creative work - creating features, building components, adding functionality, or modifying behavior. Explores user intent, requirements and design before implementation." --- - + # Brainstorming Ideas Into Designs -> **Local note (AI-Handbook #168, corrected #173).** A feature David has +> **Local note (KITT #168, corrected #173).** A feature David has > declared prototype phase passes the gate below for its **first version**: > the design conversation and Astra's review produce its short plan and its > questions file, and David approves before the build. Later versions skip it diff --git a/.claude/skills/brainstorming/scripts/frame-template.html b/.claude/skills/brainstorming/scripts/frame-template.html index d9a08f5..e59227d 100644 --- a/.claude/skills/brainstorming/scripts/frame-template.html +++ b/.claude/skills/brainstorming/scripts/frame-template.html @@ -1,5 +1,5 @@ - + diff --git a/.claude/skills/brainstorming/scripts/helper.js b/.claude/skills/brainstorming/scripts/helper.js index c5f816f..e903ba6 100644 --- a/.claude/skills/brainstorming/scripts/helper.js +++ b/.claude/skills/brainstorming/scripts/helper.js @@ -1,4 +1,4 @@ -// SYNCED FROM AI-Handbook — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change the handbook instead. +// SYNCED FROM KITT — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change KITT instead. (function() { const MIN_RECONNECT_MS = 500; const MAX_RECONNECT_MS = 30000; diff --git a/.claude/skills/brainstorming/scripts/server.cjs b/.claude/skills/brainstorming/scripts/server.cjs index 67e71f1..89d2a8f 100644 --- a/.claude/skills/brainstorming/scripts/server.cjs +++ b/.claude/skills/brainstorming/scripts/server.cjs @@ -1,4 +1,4 @@ -// SYNCED FROM AI-Handbook — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change the handbook instead. +// SYNCED FROM KITT — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change KITT instead. const crypto = require('crypto'); const http = require('http'); const fs = require('fs'); diff --git a/.claude/skills/brainstorming/scripts/start-server.sh b/.claude/skills/brainstorming/scripts/start-server.sh index 82665e4..db6d076 100755 --- a/.claude/skills/brainstorming/scripts/start-server.sh +++ b/.claude/skills/brainstorming/scripts/start-server.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# SYNCED FROM AI-Handbook — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change the handbook instead. +# SYNCED FROM KITT — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change KITT instead. # Start the brainstorm server and output connection info # Usage: start-server.sh [--project-dir ] [--host ] [--url-host ] [--foreground] [--background] # diff --git a/.claude/skills/brainstorming/scripts/stop-server.sh b/.claude/skills/brainstorming/scripts/stop-server.sh index 7e54641..9257550 100755 --- a/.claude/skills/brainstorming/scripts/stop-server.sh +++ b/.claude/skills/brainstorming/scripts/stop-server.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# SYNCED FROM AI-Handbook — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change the handbook instead. +# SYNCED FROM KITT — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change KITT instead. # Stop the brainstorm server and clean up # Usage: stop-server.sh # diff --git a/.claude/skills/brainstorming/spec-document-reviewer-prompt.md b/.claude/skills/brainstorming/spec-document-reviewer-prompt.md index f265051..134e769 100644 --- a/.claude/skills/brainstorming/spec-document-reviewer-prompt.md +++ b/.claude/skills/brainstorming/spec-document-reviewer-prompt.md @@ -1,4 +1,4 @@ - + # Spec Document Reviewer Prompt Template diff --git a/.claude/skills/brainstorming/visual-companion.md b/.claude/skills/brainstorming/visual-companion.md index ba52c50..213fea5 100644 --- a/.claude/skills/brainstorming/visual-companion.md +++ b/.claude/skills/brainstorming/visual-companion.md @@ -1,4 +1,4 @@ - + # Visual Companion Guide diff --git a/.claude/skills/bugfix/SKILL.md b/.claude/skills/bugfix/SKILL.md index 0ec5376..551e4f1 100644 --- a/.claude/skills/bugfix/SKILL.md +++ b/.claude/skills/bugfix/SKILL.md @@ -3,7 +3,7 @@ name: bugfix description: Bug-fixing workflow — fix a bug without the planning ceremony. Use when David says /bugfix (the explicit override), or whenever a request is bugfix-shaped — a report that already-agreed behavior is broken, "just fix this", a defect with an observable symptom. Announce the classification in one line on entry; ask when it could really be a behavior change. One bug per branch per PR, opened as soon as the fix is verified. Drops the plan file and the plan-review loop; keeps (and tiers) verification — a Tier A/B fix carries a regression test, a blast-radius note, and a bugfix oracle in the PR body, while a trivial Tier C schema fix uses its own dedicated oracle block instead — and Codex still reviews the diff under the write-gate rule. Opposite of the default feature-building flow in CLAUDE.md. --- - + # Bug-fixing mode diff --git a/.claude/skills/bugfix/live-diagnosis.md b/.claude/skills/bugfix/live-diagnosis.md index 7176720..772bae9 100644 --- a/.claude/skills/bugfix/live-diagnosis.md +++ b/.claude/skills/bugfix/live-diagnosis.md @@ -1,4 +1,4 @@ - + # Live-environment evidence during diagnosis diff --git a/.claude/skills/differential-review/SKILL.md b/.claude/skills/differential-review/SKILL.md index 586074d..eab67fa 100644 --- a/.claude/skills/differential-review/SKILL.md +++ b/.claude/skills/differential-review/SKILL.md @@ -8,7 +8,7 @@ description: > allowed-tools: Read Write Grep Glob Bash --- - + # Differential Security Review diff --git a/.claude/skills/differential-review/adversarial.md b/.claude/skills/differential-review/adversarial.md index 90d4a03..2f20fe5 100644 --- a/.claude/skills/differential-review/adversarial.md +++ b/.claude/skills/differential-review/adversarial.md @@ -1,4 +1,4 @@ - + # Adversarial Vulnerability Analysis (Phase 5) diff --git a/.claude/skills/differential-review/methodology.md b/.claude/skills/differential-review/methodology.md index bf27d25..7a3f582 100644 --- a/.claude/skills/differential-review/methodology.md +++ b/.claude/skills/differential-review/methodology.md @@ -1,4 +1,4 @@ - + # Differential Review Methodology diff --git a/.claude/skills/differential-review/patterns.md b/.claude/skills/differential-review/patterns.md index 05e281a..6a06ac1 100644 --- a/.claude/skills/differential-review/patterns.md +++ b/.claude/skills/differential-review/patterns.md @@ -1,4 +1,4 @@ - + # Common Vulnerability Patterns diff --git a/.claude/skills/differential-review/reporting.md b/.claude/skills/differential-review/reporting.md index 1268f4e..b490145 100644 --- a/.claude/skills/differential-review/reporting.md +++ b/.claude/skills/differential-review/reporting.md @@ -1,4 +1,4 @@ - + # Report Generation (Phase 6) diff --git a/.claude/skills/dispatching-parallel-agents/SKILL.md b/.claude/skills/dispatching-parallel-agents/SKILL.md index 5be5a29..3f1ddc4 100644 --- a/.claude/skills/dispatching-parallel-agents/SKILL.md +++ b/.claude/skills/dispatching-parallel-agents/SKILL.md @@ -3,7 +3,7 @@ name: dispatching-parallel-agents description: Use when facing 2+ independent tasks that can be worked on without shared state or sequential dependencies --- - + # Dispatching Parallel Agents diff --git a/.claude/skills/document/SKILL.md b/.claude/skills/document/SKILL.md index 07b773d..84b1bd7 100644 --- a/.claude/skills/document/SKILL.md +++ b/.claude/skills/document/SKILL.md @@ -3,7 +3,7 @@ name: document description: End-of-feature documentation pass — lock a finished feature's decisions, gotchas, and subsystem changes into the durable docs. Use when David says /document, "lock in the learnings", "document this feature", or "commit this feature's learnings to memory" at the end of a build. Harvests from the session + the feature's diff, routes each learning to its one canonical home in docs/ai-context/ / .agents/memory/, and creates or updates the touched area's chapter in the product Manual (docs/manual/). Docs-only. NOT for "remember this" about a single item (that's immediate targeted persistence, not this ceremony). --- - + # /document — the end-of-feature documentation ceremony (Claude enactment) diff --git a/.claude/skills/executing-plans/SKILL.md b/.claude/skills/executing-plans/SKILL.md index 68ba750..03203b6 100644 --- a/.claude/skills/executing-plans/SKILL.md +++ b/.claude/skills/executing-plans/SKILL.md @@ -3,11 +3,11 @@ name: executing-plans description: Use when you have a written implementation plan to execute in a separate session with review checkpoints --- - + # Executing Plans -> **Local note (AI-Handbook, 2026-10-11).** Read "stop and ask" below with the +> **Local note (KITT, 2026-10-11).** Read "stop and ask" below with the > fleet's ask/decide boundary: an instruction unclear about *what the product > should do* is plan ambiguity and stops for David; a technical choice that is > yours to recommend and a corrective commit would undo proceeds on the diff --git a/.claude/skills/finishing-a-development-branch/SKILL.md b/.claude/skills/finishing-a-development-branch/SKILL.md index 1efc316..af457a1 100644 --- a/.claude/skills/finishing-a-development-branch/SKILL.md +++ b/.claude/skills/finishing-a-development-branch/SKILL.md @@ -3,11 +3,11 @@ name: finishing-a-development-branch description: Use when implementation is complete, all tests pass, and you need to decide how to integrate the work - guides completion of development work by presenting structured options for merge, PR, or cleanup --- - + # Finishing a Development Branch -> **Local note (AI-Handbook #168).** A `prototype/` branch is never +> **Local note (KITT #168).** A `prototype/` branch is never > finished through the menu below: while its feature is in prototype phase it > merges nowhere and opens no PR, its environment tracks it, and the flip's > hardening PR is what eventually ends it — the rule is diff --git a/.claude/skills/fp-check/SKILL.md b/.claude/skills/fp-check/SKILL.md index ac3fd07..41f4978 100644 --- a/.claude/skills/fp-check/SKILL.md +++ b/.claude/skills/fp-check/SKILL.md @@ -4,7 +4,7 @@ description: "Systematically verifies suspected security bugs to eliminate false allowed-tools: Read Grep Glob LSP Bash Task Write Edit AskUserQuestion TaskCreate TaskUpdate TaskList TaskGet --- - + # False Positive Check diff --git a/.claude/skills/fp-check/references/bug-class-verification.md b/.claude/skills/fp-check/references/bug-class-verification.md index d90959f..937a210 100644 --- a/.claude/skills/fp-check/references/bug-class-verification.md +++ b/.claude/skills/fp-check/references/bug-class-verification.md @@ -1,4 +1,4 @@ - + # Bug-Class-Specific Verification diff --git a/.claude/skills/fp-check/references/deep-verification.md b/.claude/skills/fp-check/references/deep-verification.md index fb3e953..1748640 100644 --- a/.claude/skills/fp-check/references/deep-verification.md +++ b/.claude/skills/fp-check/references/deep-verification.md @@ -1,4 +1,4 @@ - + # Deep Verification diff --git a/.claude/skills/fp-check/references/evidence-templates.md b/.claude/skills/fp-check/references/evidence-templates.md index 914e254..d1fdcfe 100644 --- a/.claude/skills/fp-check/references/evidence-templates.md +++ b/.claude/skills/fp-check/references/evidence-templates.md @@ -1,4 +1,4 @@ - + # Evidence Templates diff --git a/.claude/skills/fp-check/references/false-positive-patterns.md b/.claude/skills/fp-check/references/false-positive-patterns.md index 15785b7..80196be 100644 --- a/.claude/skills/fp-check/references/false-positive-patterns.md +++ b/.claude/skills/fp-check/references/false-positive-patterns.md @@ -1,4 +1,4 @@ - + # False Positive Patterns — Lessons Learned diff --git a/.claude/skills/fp-check/references/gate-reviews.md b/.claude/skills/fp-check/references/gate-reviews.md index f7bb50a..09c0c99 100644 --- a/.claude/skills/fp-check/references/gate-reviews.md +++ b/.claude/skills/fp-check/references/gate-reviews.md @@ -1,4 +1,4 @@ - + # Gate Reviews and Verdicts diff --git a/.claude/skills/fp-check/references/standard-verification.md b/.claude/skills/fp-check/references/standard-verification.md index cca612e..9e861ad 100644 --- a/.claude/skills/fp-check/references/standard-verification.md +++ b/.claude/skills/fp-check/references/standard-verification.md @@ -1,4 +1,4 @@ - + # Standard Verification diff --git a/.claude/skills/grill-me/SKILL.md b/.claude/skills/grill-me/SKILL.md index e0775f0..88a0836 100644 --- a/.claude/skills/grill-me/SKILL.md +++ b/.claude/skills/grill-me/SKILL.md @@ -4,6 +4,6 @@ description: A relentless interview to sharpen a plan or design. disable-model-invocation: true --- - + Call the Skill tool with "grilling". diff --git a/.claude/skills/grilling/SKILL.md b/.claude/skills/grilling/SKILL.md index 6afa992..1adab4d 100644 --- a/.claude/skills/grilling/SKILL.md +++ b/.claude/skills/grilling/SKILL.md @@ -3,7 +3,7 @@ name: grilling description: Grill David relentlessly about a plan, decision, or idea. Use when he wants to stress-test his thinking, or uses any 'grill' trigger phrases. --- - + Interview the user relentlessly until you reach a shared understanding. Map this as a **design tree**: every decision branches into the decisions that hang off it. diff --git a/.claude/skills/handoff/SKILL.md b/.claude/skills/handoff/SKILL.md index 5b3bb09..ad8ab81 100644 --- a/.claude/skills/handoff/SKILL.md +++ b/.claude/skills/handoff/SKILL.md @@ -3,7 +3,7 @@ name: handoff description: Decide whether this session's context should move to a new session, and if so make it survive the move. Use when David says /handoff, "let's start a fresh session", "should we hand this off", or when a session that finished one thing is about to start something else. First judges whether a handoff is actually needed and stops if it isn't. When it is, externalizes the session's load-bearing context onto the workstream issue and delivers a copy-pasteable prompt for the new session. NOT for durable end-of-feature learnings (that's /document) and NOT the cross-tool docs/handoff/ folder. --- - + # /handoff — moving a session's context to a new session diff --git a/.claude/skills/insecure-defaults/SKILL.md b/.claude/skills/insecure-defaults/SKILL.md index 7ee54b0..4da5e1b 100644 --- a/.claude/skills/insecure-defaults/SKILL.md +++ b/.claude/skills/insecure-defaults/SKILL.md @@ -4,7 +4,7 @@ description: "Detects fail-open insecure defaults (hardcoded secrets, weak auth, allowed-tools: Read Grep Glob Bash --- - + # Insecure Defaults Detection diff --git a/.claude/skills/insecure-defaults/references/examples.md b/.claude/skills/insecure-defaults/references/examples.md index 9679e54..6dee9bf 100644 --- a/.claude/skills/insecure-defaults/references/examples.md +++ b/.claude/skills/insecure-defaults/references/examples.md @@ -1,4 +1,4 @@ - + # Insecure Defaults: Examples and Counter-Examples diff --git a/.claude/skills/maintenance/SKILL.md b/.claude/skills/maintenance/SKILL.md index 9a3e8a3..893f050 100644 --- a/.claude/skills/maintenance/SKILL.md +++ b/.claude/skills/maintenance/SKILL.md @@ -3,7 +3,7 @@ name: maintenance description: Weekly repo maintenance ritual. Use when David says /maintenance or asks for the weekly maintenance pass. Triages the Dependabot PR queue (merges green minor/patch bumps, merges majors on its recommendation and reports them), reviews production errors (Sentry), checks CI health on main, and delivers a "what shipped this week" digest. Ops-shaped, Sonnet-tier work. --- - + # Weekly maintenance @@ -237,7 +237,7 @@ stored records. From the merged-PR list for the window: **A reversal is counted in the window it lands**, against the decision it reverses, whichever window counted that decision — a reversal that follows the pass that counted its decision belongs to the next pass, not to none - (Codex, Overhype.me #639 `4243652055`; AI-Handbook #197 item 2). Two + (Codex, Overhype.me #639 `4243652055`; KITT #197 item 2). Two numbers, reported together: a high reversal rate says the reversible default is proceeding on choices that were his; a zero over many decisions says the asks that @@ -245,10 +245,10 @@ stored records. From the merged-PR list for the window: the per-turn spend cap from these ([`agent-working-rules.md`](../../../docs/ai-context/agent-working-rules.md#a-reversible-choice-proceeds-on-the-recommendation-david-2026-10-10)). -- **Refresh the token price table — in the handbook's pass only** (David, - 2026-10-11; AI-Handbook #194 round 4). The table +- **Refresh the token price table — in KITT's pass only** (David, + 2026-10-11; KITT #194 round 4). The table [`token-pricing.md`](../../../docs/ai-context/token-pricing.md) has one - source, so it has one refresher: when this pass runs **in AI-Handbook**, + source, so it has one refresher: when this pass runs **in KITT**, fetch the two pricing pages the table names, re-quote the rows for every model it carries and any new model this repository's `.agents/machinery.json` pins, update each section's read date and recompute its proxy column by @@ -256,8 +256,8 @@ stored records. From the merged-PR list for the window: vendored copy the sync overwrites (its banner says so), so the pass edits nothing: it reads the shipped table and reports each section's read date and how old it is in this report — and nothing more, since a consumer - holds no record of when the handbook's pass last ran, and a newer table - reaches this repository only by the next sync from the handbook, where the + holds no record of when KITT's pass last ran, and a newer table + reaches this repository only by the next sync from KITT, where the source is refreshed. The spend line on every turn converts tokens with that table, so an old copy misprices every turn until that sync; a page that cannot be fetched keeps its old rows and date, and the report says so. @@ -533,7 +533,7 @@ This is now a standalone maintenance-skill rule.) dependency merges, **with three narrow exceptions**: committing updates to [`docs/engineering/deferred-work.md`](../../../docs/engineering/deferred-work.md) (step 4) — recording a newly-parked item or updating an entry's status — - the batched documentation harvest (step 6a), and, in the handbook's pass + the batched documentation harvest (step 6a), and, in KITT's pass only, the token price table refresh (step 6b; [`token-pricing.md`](../../../docs/ai-context/token-pricing.md), *Refreshing this table*). All three are diff --git a/.claude/skills/model-routing/SKILL.md b/.claude/skills/model-routing/SKILL.md index 8c00730..078ff5b 100644 --- a/.claude/skills/model-routing/SKILL.md +++ b/.claude/skills/model-routing/SKILL.md @@ -3,7 +3,7 @@ name: model-routing description: Use when deciding or explaining a model/effort escalation beyond what CLAUDE.md's *Model, cost, and routing* states, or when David asks whether a switch can be automated. --- - + # Model and effort routing — the reference detail @@ -195,7 +195,7 @@ Opus side) — so it is always a deliberate escalation. That route is for design and diagnosis only: the code itself is written on Opus (*Fable to explore, Opus to build*, above). **The two layers take different values, and this bullet used to say they take - the same ones** (AI-Handbook #131 round 2, where the Fable assessor found the + the same ones** (KITT #131 round 2, where the Fable assessor found the sentence contradicting the measured table below it, in the same file): the **per-invocation `model` parameter takes an alias only** — the Agent tool declares it as an enum of `sonnet`, `opus`, `haiku`, `fable`, and @@ -324,7 +324,7 @@ covers the other's failure: **The declarations are derived from the pin, never typed.** `node scripts/check-agent-models.mjs` fails when a `fable-*` definition disagrees with `models.strongestClaude`, and `--fix` rewrites it from there, so -David's one-line edit propagates. It runs in the handbook's CI and not in a +David's one-line edit propagates. It runs in KITT's CI and not in a consumer's: a consumer receives the definitions carrying THIS repository's pin and must not edit a synced file, so a check shipped to them would be permanently red with no fix available. What reaches a consumer's own tier is @@ -377,7 +377,7 @@ disagrees", which round 2 removed. Each time the sentence survived the change it described. That is the defect this skill's own rule names: two live instructions that contradict each other mean either can fire.)* -The reporting side has its own limit, measured on AI-Handbook #131 rounds 1–3: +The reporting side has its own limit, measured on KITT #131 rounds 1–3: the assessor answered `at unable to name` every time, because its context shows reasoning effort as a number (`80`) rather than a named level. **An effort nobody can name is a limit to state once, not a mismatch to raise every round.** diff --git a/.claude/skills/next/SKILL.md b/.claude/skills/next/SKILL.md index 6606f7c..aa7ca32 100644 --- a/.claude/skills/next/SKILL.md +++ b/.claude/skills/next/SKILL.md @@ -3,7 +3,7 @@ name: next description: Answer "given where we are in our development lifecycle, what is the next thing we should be doing?" — the prioritized recommendation across all work in the active repository only, not one session's state and never other repositories. Use when David says /next, "what's next", "what should I work on", or has just finished something and needs the next task. Ranks work closest to done ahead of new starts, reads every approved plan still being built so the next step of a build is named even where no issue lists it, follows Blocked-by chains so an interrupted UAT is never lost, and names which candidates can safely run in parallel sessions. For "where does THIS session stand" use /status; for "what needs me across everything" use /status-all. --- - + # /next — what should we work on now @@ -32,7 +32,7 @@ this skill's. **`/next` answers for one repository: the one this session is working in.** Every candidate, every recommendation, and the empty-queue proposal come from that repository's issues, PRs, and docs. Work in other repositories — -the handbook, a sibling product, anything remembered from another session — +KITT, a sibling product, anything remembered from another session — is out of scope: never ranked, never recommended, never mentioned as "also worth a look." "What's next" means next *here*. @@ -45,7 +45,7 @@ worth a look." "What's next" means next *here*. placeholder, stop and ask** which repository David means. A `/next` that guesses its repository answers confidently about the wrong product. - **David naming a repository overrides the default** ("what's next in - AI-Handbook"). If this session has several repositories attached and he + KITT"). If this session has several repositories attached and he didn't name one, the working tree's repository is the answer — never a merge of all of them. - **Every GitHub call passes that `owner`/`repo` explicitly.** Never diff --git a/.claude/skills/plan-review-loop/SKILL.md b/.claude/skills/plan-review-loop/SKILL.md index 046b616..f7c229e 100644 --- a/.claude/skills/plan-review-loop/SKILL.md +++ b/.claude/skills/plan-review-loop/SKILL.md @@ -3,7 +3,7 @@ name: plan-review-loop description: Use in feature-building mode once the pre-plan conversation has settled intent, or whenever a plan needs to be delivered to David for approval. Runs the planning loop in-session — Astra and I develop the plan together as peers, reading one contract, with the next action stated by me rather than derived from an assessment. No plan-review PR and no page; everything reaches David in chat, and the approved plan is committed on its feature branch. NOT for bugfix mode, which skips planning entirely. --- - + # The in-session planning loop @@ -17,7 +17,7 @@ git, while we develop it; at approval it is committed on the feature branch **The script's path differs by repository, so resolve it once per session** rather than typing either form. The sync routes `core/X -> X`, so the file is -`core/scripts/plan-review.mjs` in the handbook and `scripts/plan-review.mjs` +`core/scripts/plan-review.mjs` in KITT and `scripts/plan-review.mjs` in every consumer: ``` diff --git a/.claude/skills/pr-docs/SKILL.md b/.claude/skills/pr-docs/SKILL.md index 85ab6dc..b1eea83 100644 --- a/.claude/skills/pr-docs/SKILL.md +++ b/.claude/skills/pr-docs/SKILL.md @@ -3,7 +3,7 @@ name: pr-docs description: Use while composing the body of a feature-mode PR with product-visible or testable behavior — its Post-merge verification and `## UAT` sections are in the body when the PR opens — and before calling that PR done. Bugfix-mode PRs do NOT inherit this pairing — their docs are conditional per tier — and a prototype-phase PR ships no UAT section — its Post-merge verification section carries only its version's `live` check, or "none needed". --- - + # Every production-phase feature PR ships post-merge verification + a UAT diff --git a/.claude/skills/pr-watch/SKILL.md b/.claude/skills/pr-watch/SKILL.md index 8499c47..f527818 100644 --- a/.claude/skills/pr-watch/SKILL.md +++ b/.claude/skills/pr-watch/SKILL.md @@ -3,7 +3,7 @@ name: pr-watch description: Use after opening or being re-engaged on any PR, and whenever a github-webhook-activity event arrives for a watched PR. Implementation PRs only — plan review runs in-session and opens no PR. --- - + # Watching the PRs I open @@ -127,7 +127,7 @@ requires it. `workstream-tracking.md`). **Such a PR is also assessed when its round comes back clean**, once before merge (David, 2026-10-12; `claude-core.md`, *Internal tooling: what is downstream*). **No script mode runs that - assessment yet** (AI-Handbook #206), and the documentation mode is not a + assessment yet** (KITT #206), and the documentation mode is not a substitute: it declares the Documentation class and applies its rubric to code. Until the mode exists, such a PR's clean round is a 👀 FYI to David saying the assessment it is owed cannot run, and I decide how it proceeds @@ -428,7 +428,7 @@ requires it. exists, that a class has no other member — is a load-bearing claim under `claude-core.md`'s *A load-bearing claim is quoted, or it is marked unverified*: it quotes what was read, or it carries `unable to verify:`. - The reply that motivated this is on file in AI-Handbook #113. + The reply that motivated this is on file in KITT #113. - **A decline is recorded, not just replied to**: a row in the PR body's **Recorded gaps** table naming what ships unfixed and why, so the final @@ -504,7 +504,7 @@ requires it. `get_reviews`: the pass has returned if a `chatgpt-codex-connector[bot]` review or PR comment carries `**Reviewed commit:**` for the head (a clean pass arrives as a comment, *"Didn't find any major issues"*, - measured on AI-Handbook #253), or the review-summary comment (``) has its 📝 **Code Review** row reading **Completed** against the head's short SHA — the hidden `codex-review-state:v1` block says the same as `"status":"completed"`. diff --git a/.claude/skills/prose-sweep/SKILL.md b/.claude/skills/prose-sweep/SKILL.md index 82f197a..ee9f681 100644 --- a/.claude/skills/prose-sweep/SKILL.md +++ b/.claude/skills/prose-sweep/SKILL.md @@ -3,7 +3,7 @@ name: prose-sweep description: Reconcile the payload's prose with a landed design change by sweeping, never patching. Use after any change that RETIRES OR RESHAPES a rule, a mechanism or an authority (a changed requirement retires its previous reading) — and again after every batch of fixes it produces, because each batch seeds fresh instances. Enumerates the retired rule's sub-shapes and exclusions as a spec, fixes the scope from git's tracked set including the role briefs and agent definitions a docs-shaped scope misses, fans the payload out to cold readers who declare what they read, and returns candidates with confidence plus every declined candidate with its exclusion. NOT a phrase checker; grep is a cross-check for a reader, never the method. --- - + # Prose sweep — the enactment @@ -12,7 +12,7 @@ and that file is its only statement.** This skill is the mechanics: what I type, what I dispatch, what I read back. Nothing here restates a rule; where a step below seems to, the doc wins. -Paths below are a consumer's. In the handbook the payload sits under +Paths below are a consumer's. In KITT the payload sits under `core/`, the script knows, and a spec written payload-relative works in both. ## 1. Write the spec, before opening a file @@ -49,10 +49,10 @@ node $P --spec --print-scope # look node $P --spec --workers 4 --out ``` -The script sits at `core/scripts/` in the handbook and `scripts/` in a +The script sits at `core/scripts/` in KITT and `scripts/` in a consumer, so the first line picks the one that exists — the same shape `plan-review-loop` and `pr-watch` already use. Spelling it `scripts/…` alone -fails in the handbook, where this skill is live by symlink. +fails in KITT, where this skill is live by symlink. It enumerates every tracked `.md` in the payload plus the root `CLAUDE.md`, `AGENTS.md` and `README.md` — `.agents/roles/`, `.claude/agents/` and diff --git a/.claude/skills/prototype/LOGIC.md b/.claude/skills/prototype/LOGIC.md index a5011bc..d1e4ae7 100644 --- a/.claude/skills/prototype/LOGIC.md +++ b/.claude/skills/prototype/LOGIC.md @@ -1,8 +1,8 @@ - + # Logic Prototype -> **Local note (AI-Handbook #168).** Read this file for its *technique*. Where it +> **Local note (KITT #168).** Read this file for its *technique*. Where it > says where a prototype lives, how it is handed over, captured or hidden — > the throwaway branch out of `main`, the throwaway route, the > `NODE_ENV` gate on the switcher, the double-clicked file — [SKILL.md](SKILL.md)'s diff --git a/.claude/skills/prototype/SKILL.md b/.claude/skills/prototype/SKILL.md index f947ba3..becf165 100644 --- a/.claude/skills/prototype/SKILL.md +++ b/.claude/skills/prototype/SKILL.md @@ -3,7 +3,7 @@ name: prototype description: Build a feature in prototype phase to answer a design question with the product owner's own feedback — a planning loop for its first version, no code review for any version. Use when David wants to sanity-check whether a state model or logic feels right, explore what a UI should look like, or starts a feature he has declared prototype phase. --- - + # Prototype diff --git a/.claude/skills/prototype/UI.md b/.claude/skills/prototype/UI.md index e333a9d..2d0a9c0 100644 --- a/.claude/skills/prototype/UI.md +++ b/.claude/skills/prototype/UI.md @@ -1,8 +1,8 @@ - + # UI Prototype -> **Local note (AI-Handbook #168).** Read this file for its *technique*. Where it +> **Local note (KITT #168).** Read this file for its *technique*. Where it > says where a prototype lives, how it is handed over, captured or hidden — > the throwaway branch out of `main`, the throwaway route, the > `NODE_ENV` gate on the switcher, the double-clicked file — [SKILL.md](SKILL.md)'s diff --git a/.claude/skills/receiving-code-review/SKILL.md b/.claude/skills/receiving-code-review/SKILL.md index b52a868..a94f6b4 100644 --- a/.claude/skills/receiving-code-review/SKILL.md +++ b/.claude/skills/receiving-code-review/SKILL.md @@ -3,7 +3,7 @@ name: receiving-code-review description: Use when receiving code review feedback, before implementing suggestions, especially if feedback seems unclear or technically questionable - requires technical rigor and verification, not performative agreement or blind implementation --- - + # Code Review Reception diff --git a/.claude/skills/requesting-code-review/SKILL.md b/.claude/skills/requesting-code-review/SKILL.md index 6ba3212..66e8de1 100644 --- a/.claude/skills/requesting-code-review/SKILL.md +++ b/.claude/skills/requesting-code-review/SKILL.md @@ -3,7 +3,7 @@ name: requesting-code-review description: Use when completing tasks, implementing major features, or before merging to verify work meets requirements --- - + # Requesting Code Review diff --git a/.claude/skills/requesting-code-review/code-reviewer.md b/.claude/skills/requesting-code-review/code-reviewer.md index 38c2ed0..f3986c5 100644 --- a/.claude/skills/requesting-code-review/code-reviewer.md +++ b/.claude/skills/requesting-code-review/code-reviewer.md @@ -1,4 +1,4 @@ - + # Code Reviewer Prompt Template diff --git a/.claude/skills/sarif-parsing/SKILL.md b/.claude/skills/sarif-parsing/SKILL.md index c226970..b2395c6 100644 --- a/.claude/skills/sarif-parsing/SKILL.md +++ b/.claude/skills/sarif-parsing/SKILL.md @@ -8,7 +8,7 @@ description: >- allowed-tools: Bash Read Glob Grep --- - + # SARIF Parsing Best Practices diff --git a/.claude/skills/sarif-parsing/resources/jq-queries.md b/.claude/skills/sarif-parsing/resources/jq-queries.md index abfac61..cf730ef 100644 --- a/.claude/skills/sarif-parsing/resources/jq-queries.md +++ b/.claude/skills/sarif-parsing/resources/jq-queries.md @@ -1,4 +1,4 @@ - + # SARIF jq Query Reference diff --git a/.claude/skills/sarif-parsing/resources/sarif_helpers.py b/.claude/skills/sarif-parsing/resources/sarif_helpers.py index 637cd50..61fcb87 100644 --- a/.claude/skills/sarif-parsing/resources/sarif_helpers.py +++ b/.claude/skills/sarif-parsing/resources/sarif_helpers.py @@ -1,4 +1,4 @@ -# SYNCED FROM AI-Handbook — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change the handbook instead. +# SYNCED FROM KITT — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change KITT instead. """ SARIF Parsing Helper Functions diff --git a/.claude/skills/semgrep/SKILL.md b/.claude/skills/semgrep/SKILL.md index 3db2d4f..2dadb14 100644 --- a/.claude/skills/semgrep/SKILL.md +++ b/.claude/skills/semgrep/SKILL.md @@ -11,7 +11,7 @@ description: >- allowed-tools: Bash Read Glob Task AskUserQuestion TaskCreate TaskList TaskUpdate --- - + # Semgrep Security Scan diff --git a/.claude/skills/semgrep/references/rulesets.md b/.claude/skills/semgrep/references/rulesets.md index 7f1581e..92e13ef 100644 --- a/.claude/skills/semgrep/references/rulesets.md +++ b/.claude/skills/semgrep/references/rulesets.md @@ -1,4 +1,4 @@ - + # Semgrep Rulesets Reference diff --git a/.claude/skills/semgrep/references/scan-modes.md b/.claude/skills/semgrep/references/scan-modes.md index 78fa720..359c472 100644 --- a/.claude/skills/semgrep/references/scan-modes.md +++ b/.claude/skills/semgrep/references/scan-modes.md @@ -1,4 +1,4 @@ - + # Scan Modes Reference diff --git a/.claude/skills/semgrep/references/scanner-task-prompt.md b/.claude/skills/semgrep/references/scanner-task-prompt.md index 627ebf5..eddcf60 100644 --- a/.claude/skills/semgrep/references/scanner-task-prompt.md +++ b/.claude/skills/semgrep/references/scanner-task-prompt.md @@ -1,4 +1,4 @@ - + # Scanner Subagent Task Prompt diff --git a/.claude/skills/semgrep/scripts/merge_sarif.py b/.claude/skills/semgrep/scripts/merge_sarif.py index d206fd3..2c91261 100644 --- a/.claude/skills/semgrep/scripts/merge_sarif.py +++ b/.claude/skills/semgrep/scripts/merge_sarif.py @@ -1,4 +1,4 @@ -# SYNCED FROM AI-Handbook — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change the handbook instead. +# SYNCED FROM KITT — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change KITT instead. # /// script # requires-python = ">=3.11" # dependencies = [] diff --git a/.claude/skills/semgrep/workflows/scan-workflow.md b/.claude/skills/semgrep/workflows/scan-workflow.md index e743df4..2cd1e5d 100644 --- a/.claude/skills/semgrep/workflows/scan-workflow.md +++ b/.claude/skills/semgrep/workflows/scan-workflow.md @@ -1,4 +1,4 @@ - + # Semgrep Scan Workflow diff --git a/.claude/skills/status-all/SKILL.md b/.claude/skills/status-all/SKILL.md index ebf6392..ad760a1 100644 --- a/.claude/skills/status-all/SKILL.md +++ b/.claude/skills/status-all/SKILL.md @@ -3,7 +3,7 @@ name: status-all description: Give David a cold-open summary of EVERY open workstream across all sessions in the active repository (never other repositories) — where each stands in the lifecycle, who's holding it, and which ones are stalled or need his input. Use when David says /status-all, "what's the state of everything", "what needs me across the board", or is picking work back up after time away and doesn't remember where he left off. This is the ALL-SESSIONS view of this repository; for "what is THIS session working on", use /status instead. Best run from a fresh, cheap session rather than an existing long thread. --- - + # /status-all — the workstream board, read cold @@ -39,7 +39,7 @@ sequence now.) **`/status-all` reports on one repository: the one this session is working in.** Every row comes from that repository's issues and PRs. Workstreams in -other repositories — the handbook, a sibling product, anything remembered +other repositories — KITT, a sibling product, anything remembered from another session — are out of scope: never listed, never counted, never mentioned as "also needs you." @@ -52,7 +52,7 @@ mentioned as "also needs you." placeholder, stop and ask** which repository David means. A board that guesses its repository reports confidently on the wrong product. - **David naming a repository overrides the default** ("status-all for - AI-Handbook"). If this session has several repositories attached and he + KITT"). If this session has several repositories attached and he didn't name one, the working tree's repository is the answer — never a merge of all of them. - **Every GitHub call passes that `owner`/`repo` explicitly.** Never diff --git a/.claude/skills/status/SKILL.md b/.claude/skills/status/SKILL.md index 105908a..27accd3 100644 --- a/.claude/skills/status/SKILL.md +++ b/.claude/skills/status/SKILL.md @@ -3,7 +3,7 @@ name: status description: Brief David on where this session's work stands, the way a direct report would update a manager — a headline, the plan and where we are in it, everything flagged for him since he last looked, any open question in full, and what happens next. Use when David says /status, "where are we", "what's the state of this", "catch me up", or picks a session back up and needs re-orienting. Written for David to read in seconds, never for an agent; collects from chat, the issue record and live GitHub, and silently repairs stale tracking on the way. For "what needs me across everything" use /status-all; for "what should we do next" use /next. --- - + # /status — the briefing David would get from a direct report diff --git a/.claude/skills/subagent-driven-development/SKILL.md b/.claude/skills/subagent-driven-development/SKILL.md index 454d696..eed214b 100644 --- a/.claude/skills/subagent-driven-development/SKILL.md +++ b/.claude/skills/subagent-driven-development/SKILL.md @@ -3,7 +3,7 @@ name: subagent-driven-development description: Use when executing implementation plans with independent tasks in the current session --- - + # Subagent-Driven Development diff --git a/.claude/skills/subagent-driven-development/implementer-prompt.md b/.claude/skills/subagent-driven-development/implementer-prompt.md index 356ff55..4eb4882 100644 --- a/.claude/skills/subagent-driven-development/implementer-prompt.md +++ b/.claude/skills/subagent-driven-development/implementer-prompt.md @@ -1,4 +1,4 @@ - + # Implementer Subagent Prompt Template diff --git a/.claude/skills/subagent-driven-development/scripts/review-package b/.claude/skills/subagent-driven-development/scripts/review-package index c29471c..dcf9ff2 100755 --- a/.claude/skills/subagent-driven-development/scripts/review-package +++ b/.claude/skills/subagent-driven-development/scripts/review-package @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# SYNCED FROM AI-Handbook — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change the handbook instead. +# SYNCED FROM KITT — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change KITT instead. # Generate a review package: commit list, stat summary, and the net # diff with extended context, written to a file the reviewer reads in one # call. Using the recorded per-task BASE (not HEAD~1) keeps multi-commit diff --git a/.claude/skills/subagent-driven-development/scripts/sdd-workspace b/.claude/skills/subagent-driven-development/scripts/sdd-workspace index 75e0a41..53476dd 100755 --- a/.claude/skills/subagent-driven-development/scripts/sdd-workspace +++ b/.claude/skills/subagent-driven-development/scripts/sdd-workspace @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# SYNCED FROM AI-Handbook — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change the handbook instead. +# SYNCED FROM KITT — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change KITT instead. # Resolve and ensure the working-tree directory SDD uses for its short-lived # artifacts: task briefs, implementer reports, review packages, and the # progress ledger. Print the directory's absolute path. diff --git a/.claude/skills/subagent-driven-development/scripts/task-brief b/.claude/skills/subagent-driven-development/scripts/task-brief index 12e1d87..f61e057 100755 --- a/.claude/skills/subagent-driven-development/scripts/task-brief +++ b/.claude/skills/subagent-driven-development/scripts/task-brief @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# SYNCED FROM AI-Handbook — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change the handbook instead. +# SYNCED FROM KITT — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change KITT instead. # Extract one task's full text from an implementation plan into a file the # implementer reads in one call, so the task text never has to be pasted # through the controller's context. diff --git a/.claude/skills/subagent-driven-development/task-reviewer-prompt.md b/.claude/skills/subagent-driven-development/task-reviewer-prompt.md index 3f2eca1..d4437b8 100644 --- a/.claude/skills/subagent-driven-development/task-reviewer-prompt.md +++ b/.claude/skills/subagent-driven-development/task-reviewer-prompt.md @@ -1,4 +1,4 @@ - + # Task Reviewer Prompt Template diff --git a/.claude/skills/supply-chain-risk-auditor/SKILL.md b/.claude/skills/supply-chain-risk-auditor/SKILL.md index 7b2b52c..ac58dbc 100644 --- a/.claude/skills/supply-chain-risk-auditor/SKILL.md +++ b/.claude/skills/supply-chain-risk-auditor/SKILL.md @@ -4,7 +4,7 @@ description: "Identifies dependencies at heightened risk of exploitation or take allowed-tools: Read Write Bash Glob Grep --- - + # Supply Chain Risk Auditor diff --git a/.claude/skills/supply-chain-risk-auditor/resources/results-template.md b/.claude/skills/supply-chain-risk-auditor/resources/results-template.md index 55b6e40..24cfbd6 100644 --- a/.claude/skills/supply-chain-risk-auditor/resources/results-template.md +++ b/.claude/skills/supply-chain-risk-auditor/resources/results-template.md @@ -1,4 +1,4 @@ - + # Supply Chain Risk Report diff --git a/.claude/skills/systematic-debugging/CREATION-LOG.md b/.claude/skills/systematic-debugging/CREATION-LOG.md index 3276b0e..3bcabe8 100644 --- a/.claude/skills/systematic-debugging/CREATION-LOG.md +++ b/.claude/skills/systematic-debugging/CREATION-LOG.md @@ -1,4 +1,4 @@ - + # Creation Log: Systematic Debugging Skill diff --git a/.claude/skills/systematic-debugging/SKILL.md b/.claude/skills/systematic-debugging/SKILL.md index cd7dff0..a0776f4 100644 --- a/.claude/skills/systematic-debugging/SKILL.md +++ b/.claude/skills/systematic-debugging/SKILL.md @@ -3,11 +3,11 @@ name: systematic-debugging description: Use when encountering any bug, test failure, or unexpected behavior, before proposing fixes --- - + # Systematic Debugging -> **Local note (AI-Handbook #168).** A defect on a feature David has declared +> **Local note (KITT #168).** A defect on a feature David has declared > prototype phase is not a bug to fix under this skill: it is the next > version through the `prototype` skill, with no failing test required (its > scaled machine-lane checks are kept and updated with the version) diff --git a/.claude/skills/systematic-debugging/condition-based-waiting-example.ts b/.claude/skills/systematic-debugging/condition-based-waiting-example.ts index 5e374bf..2ecf6de 100644 --- a/.claude/skills/systematic-debugging/condition-based-waiting-example.ts +++ b/.claude/skills/systematic-debugging/condition-based-waiting-example.ts @@ -1,4 +1,4 @@ -// SYNCED FROM AI-Handbook — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change the handbook instead. +// SYNCED FROM KITT — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change KITT instead. // Complete implementation of condition-based waiting utilities // From: Lace test infrastructure improvements (2025-10-03) // Context: Fixed 15 flaky tests by replacing arbitrary timeouts diff --git a/.claude/skills/systematic-debugging/condition-based-waiting.md b/.claude/skills/systematic-debugging/condition-based-waiting.md index 6aac141..11d9f99 100644 --- a/.claude/skills/systematic-debugging/condition-based-waiting.md +++ b/.claude/skills/systematic-debugging/condition-based-waiting.md @@ -1,4 +1,4 @@ - + # Condition-Based Waiting diff --git a/.claude/skills/systematic-debugging/defense-in-depth.md b/.claude/skills/systematic-debugging/defense-in-depth.md index 267c78a..1170e5e 100644 --- a/.claude/skills/systematic-debugging/defense-in-depth.md +++ b/.claude/skills/systematic-debugging/defense-in-depth.md @@ -1,4 +1,4 @@ - + # Defense-in-Depth Validation diff --git a/.claude/skills/systematic-debugging/find-polluter.sh b/.claude/skills/systematic-debugging/find-polluter.sh index 2e41181..74fefa9 100755 --- a/.claude/skills/systematic-debugging/find-polluter.sh +++ b/.claude/skills/systematic-debugging/find-polluter.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# SYNCED FROM AI-Handbook — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change the handbook instead. +# SYNCED FROM KITT — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change KITT instead. # Bisection script to find which test creates unwanted files/state # Usage: ./find-polluter.sh # Example: ./find-polluter.sh '.git' 'src/**/*.test.ts' diff --git a/.claude/skills/systematic-debugging/root-cause-tracing.md b/.claude/skills/systematic-debugging/root-cause-tracing.md index 5eca6c1..52b9755 100644 --- a/.claude/skills/systematic-debugging/root-cause-tracing.md +++ b/.claude/skills/systematic-debugging/root-cause-tracing.md @@ -1,4 +1,4 @@ - + # Root Cause Tracing diff --git a/.claude/skills/systematic-debugging/test-academic.md b/.claude/skills/systematic-debugging/test-academic.md index 4df4c9d..6d98647 100644 --- a/.claude/skills/systematic-debugging/test-academic.md +++ b/.claude/skills/systematic-debugging/test-academic.md @@ -1,4 +1,4 @@ - + # Academic Test: Systematic Debugging Skill diff --git a/.claude/skills/systematic-debugging/test-pressure-1.md b/.claude/skills/systematic-debugging/test-pressure-1.md index b4c4299..3c563b8 100644 --- a/.claude/skills/systematic-debugging/test-pressure-1.md +++ b/.claude/skills/systematic-debugging/test-pressure-1.md @@ -1,4 +1,4 @@ - + # Pressure Test 1: Emergency Production Fix diff --git a/.claude/skills/systematic-debugging/test-pressure-2.md b/.claude/skills/systematic-debugging/test-pressure-2.md index b10521a..fc96ec9 100644 --- a/.claude/skills/systematic-debugging/test-pressure-2.md +++ b/.claude/skills/systematic-debugging/test-pressure-2.md @@ -1,4 +1,4 @@ - + # Pressure Test 2: Sunk Cost + Exhaustion diff --git a/.claude/skills/systematic-debugging/test-pressure-3.md b/.claude/skills/systematic-debugging/test-pressure-3.md index 4eadab7..0112786 100644 --- a/.claude/skills/systematic-debugging/test-pressure-3.md +++ b/.claude/skills/systematic-debugging/test-pressure-3.md @@ -1,4 +1,4 @@ - + # Pressure Test 3: Authority + Social Pressure diff --git a/.claude/skills/test-driven-development/SKILL.md b/.claude/skills/test-driven-development/SKILL.md index 0617389..a44eb7b 100644 --- a/.claude/skills/test-driven-development/SKILL.md +++ b/.claude/skills/test-driven-development/SKILL.md @@ -3,11 +3,11 @@ name: test-driven-development description: Use when implementing any feature or bugfix, before writing implementation code --- - + # Test-Driven Development (TDD) -> **Local note (AI-Handbook #168).** The "ask your human partner" exception +> **Local note (KITT #168).** The "ask your human partner" exception > below for a throwaway prototype is already answered for a feature David has > declared prototype phase: the declaration removes tests as a bar — the > version still carries the machine lanes — `ci`, `scripted`, and `live` where @@ -32,7 +32,7 @@ description: Use when implementing any feature or bugfix, before writing impleme > A Tier A or B bugfix's tier oracle is that rule's plan (David, > 2026-10-11), and what proceeds inside it is the fix's *other* technical > choices; "I do not know how to test it" is a question to answer, not a -> choice to proceed on (Codex, DojoOS #8 and AI-Handbook #201; AI-Handbook +> choice to proceed on (Codex, DojoOS #8 and KITT #201; KITT > #197 item 3, #198). ## Overview diff --git a/.claude/skills/test-driven-development/testing-anti-patterns.md b/.claude/skills/test-driven-development/testing-anti-patterns.md index fdbb901..de33be4 100644 --- a/.claude/skills/test-driven-development/testing-anti-patterns.md +++ b/.claude/skills/test-driven-development/testing-anti-patterns.md @@ -1,4 +1,4 @@ - + # Testing Anti-Patterns diff --git a/.claude/skills/uat/SKILL.md b/.claude/skills/uat/SKILL.md index 39e6241..cf95727 100644 --- a/.claude/skills/uat/SKILL.md +++ b/.claude/skills/uat/SKILL.md @@ -3,7 +3,7 @@ name: uat description: Run a UAT session with David step by step, in chat, instead of handing him a markdown file to read alone. Use when he says /uat, "let's test PR N", "walk me through the UAT", "I'm ready to test this", or "resume the UAT". I do the setup, resolve every machine-lane step myself first (a screen fact whose action I can perform is mine to check in a browser, whatever the script labels it; one only his own account or device can perform stays his; what an AI-generated image shows, beyond what anyone would verify the same way, is always his), present only the judgement steps to him one at a time, record Pass/Fail/Blocked/Skipped per step, capture evidence on anything that isn't a clean pass, file the bug and the way back the moment something breaks, and leave a durable run record any session can resume from. NOT for writing a UAT script — that's `pr-docs`. --- - + # /uat — I run the test session, David does the judging @@ -610,7 +610,7 @@ continue-or-pause question right after a failure — gets **no banner and no `PushNotification` call**. He's at the keyboard; that's the premise of the session. The alert hook still rings once, quietly, on each of those turns, as it does on every hand-back (`claude-core.md`, interaction rule 6; David, -2026-10-30, AI-Handbook #264): the hook cannot tell a walkthrough turn from +2026-10-30, KITT #264): the hook cannot tell a walkthrough turn from any other, and David chose more alerts over fewer. What the carve-out withholds is the repeating 🛑 tier and the call, not the chime. diff --git a/.claude/skills/using-git-worktrees/SKILL.md b/.claude/skills/using-git-worktrees/SKILL.md index 39e294f..f5abb00 100644 --- a/.claude/skills/using-git-worktrees/SKILL.md +++ b/.claude/skills/using-git-worktrees/SKILL.md @@ -3,11 +3,11 @@ name: using-git-worktrees description: Use when starting feature work that needs isolation from current workspace or before executing implementation plans - ensures an isolated workspace exists via native tools or git worktree fallback --- - + # Using Git Worktrees -> **Local note (AI-Handbook, 2026-10-11).** Creating a worktree is setup +> **Local note (KITT, 2026-10-11).** Creating a worktree is setup > mechanics, not a decision: it is undone by removing the worktree, not by a > commit, so it is neither asked about nor reported as a reversible choice — > Step 0's consent prompt below does not run here, and nothing about it goes diff --git a/.claude/skills/using-superpowers/SKILL.md b/.claude/skills/using-superpowers/SKILL.md index 04bcbd6..a0e65b0 100644 --- a/.claude/skills/using-superpowers/SKILL.md +++ b/.claude/skills/using-superpowers/SKILL.md @@ -3,13 +3,13 @@ name: using-superpowers description: Use when starting any conversation - establishes how to find and use skills, requiring skill invocation before ANY response including clarifying questions --- - + If you were dispatched as a subagent to execute a specific task, ignore this skill. -> **Local note (AI-Handbook #168).** The routing below goes by the request's +> **Local note (KITT #168).** The routing below goes by the request's > phrasing. Before it, the consumer's *Feature phases* registry: a request > about a feature David has declared prototype phase — "build X" or "fix > this" alike — goes to the `prototype` skill, whose first version runs the diff --git a/.claude/skills/using-superpowers/references/antigravity-tools.md b/.claude/skills/using-superpowers/references/antigravity-tools.md index 40857d2..f54632f 100644 --- a/.claude/skills/using-superpowers/references/antigravity-tools.md +++ b/.claude/skills/using-superpowers/references/antigravity-tools.md @@ -1,4 +1,4 @@ - + # Antigravity CLI (`agy`) Tool Mapping diff --git a/.claude/skills/using-superpowers/references/codex-tools.md b/.claude/skills/using-superpowers/references/codex-tools.md index d7a78e7..625872c 100644 --- a/.claude/skills/using-superpowers/references/codex-tools.md +++ b/.claude/skills/using-superpowers/references/codex-tools.md @@ -1,4 +1,4 @@ - + ## Subagent dispatch requires multi-agent support diff --git a/.claude/skills/using-superpowers/references/pi-tools.md b/.claude/skills/using-superpowers/references/pi-tools.md index b0921f4..b1a0dbb 100644 --- a/.claude/skills/using-superpowers/references/pi-tools.md +++ b/.claude/skills/using-superpowers/references/pi-tools.md @@ -1,4 +1,4 @@ - + # Pi Tool Mapping diff --git a/.claude/skills/verification-before-completion/SKILL.md b/.claude/skills/verification-before-completion/SKILL.md index e97a82c..b9a2a21 100644 --- a/.claude/skills/verification-before-completion/SKILL.md +++ b/.claude/skills/verification-before-completion/SKILL.md @@ -3,7 +3,7 @@ name: verification-before-completion description: Use when about to claim work is complete, fixed, or passing, before committing or creating PRs - requires running verification commands and confirming output before making any success claims; evidence before assertions always --- - + # Verification Before Completion diff --git a/.claude/skills/writing-plans/SKILL.md b/.claude/skills/writing-plans/SKILL.md index 9c4e86d..efaed9a 100644 --- a/.claude/skills/writing-plans/SKILL.md +++ b/.claude/skills/writing-plans/SKILL.md @@ -3,11 +3,11 @@ name: writing-plans description: Use when you have a spec or requirements for a multi-step task, before touching code --- - + # Writing Plans -> **Local note (AI-Handbook #168, corrected #173).** A feature David has +> **Local note (KITT #168, corrected #173).** A feature David has > declared prototype phase has a short plan to write for its **first version** > — the design question, the hypothesis, the surface, what it leaves out — and > none for later versions unless David asks; the questions file is that plan's diff --git a/.claude/skills/writing-plans/plan-document-reviewer-prompt.md b/.claude/skills/writing-plans/plan-document-reviewer-prompt.md index 92f08fb..2787283 100644 --- a/.claude/skills/writing-plans/plan-document-reviewer-prompt.md +++ b/.claude/skills/writing-plans/plan-document-reviewer-prompt.md @@ -1,4 +1,4 @@ - + # Plan Document Reviewer Prompt Template diff --git a/.claude/skills/writing-skills/SKILL.md b/.claude/skills/writing-skills/SKILL.md index 2baa08c..dcd98ae 100644 --- a/.claude/skills/writing-skills/SKILL.md +++ b/.claude/skills/writing-skills/SKILL.md @@ -3,7 +3,7 @@ name: writing-skills description: Use when creating new skills, editing existing skills, or verifying skills work before deployment --- - + # Writing Skills diff --git a/.claude/skills/writing-skills/anthropic-best-practices.md b/.claude/skills/writing-skills/anthropic-best-practices.md index 4cd5684..012bff5 100644 --- a/.claude/skills/writing-skills/anthropic-best-practices.md +++ b/.claude/skills/writing-skills/anthropic-best-practices.md @@ -1,4 +1,4 @@ - + # Skill authoring best practices diff --git a/.claude/skills/writing-skills/examples/CLAUDE_MD_TESTING.md b/.claude/skills/writing-skills/examples/CLAUDE_MD_TESTING.md index 2029d70..93d2a6b 100644 --- a/.claude/skills/writing-skills/examples/CLAUDE_MD_TESTING.md +++ b/.claude/skills/writing-skills/examples/CLAUDE_MD_TESTING.md @@ -1,4 +1,4 @@ - + # Testing CLAUDE.md Skills Documentation diff --git a/.claude/skills/writing-skills/graphviz-conventions.dot b/.claude/skills/writing-skills/graphviz-conventions.dot index 01adfe1..8ce74e9 100644 --- a/.claude/skills/writing-skills/graphviz-conventions.dot +++ b/.claude/skills/writing-skills/graphviz-conventions.dot @@ -1,4 +1,4 @@ -// SYNCED FROM AI-Handbook — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change the handbook instead. +// SYNCED FROM KITT — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change KITT instead. digraph STYLE_GUIDE { // The style guide for our process DSL, written in the DSL itself diff --git a/.claude/skills/writing-skills/persuasion-principles.md b/.claude/skills/writing-skills/persuasion-principles.md index b8c241e..c5b2cf5 100644 --- a/.claude/skills/writing-skills/persuasion-principles.md +++ b/.claude/skills/writing-skills/persuasion-principles.md @@ -1,4 +1,4 @@ - + # Persuasion Principles for Skill Design diff --git a/.claude/skills/writing-skills/render-graphs.js b/.claude/skills/writing-skills/render-graphs.js index 167e394..e4ddfac 100755 --- a/.claude/skills/writing-skills/render-graphs.js +++ b/.claude/skills/writing-skills/render-graphs.js @@ -1,5 +1,5 @@ #!/usr/bin/env node -// SYNCED FROM AI-Handbook — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change the handbook instead. +// SYNCED FROM KITT — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change KITT instead. /** * Render graphviz diagrams from a skill's SKILL.md to SVG files. diff --git a/.claude/skills/writing-skills/testing-skills-with-subagents.md b/.claude/skills/writing-skills/testing-skills-with-subagents.md index 0547a0d..bd00c9a 100644 --- a/.claude/skills/writing-skills/testing-skills-with-subagents.md +++ b/.claude/skills/writing-skills/testing-skills-with-subagents.md @@ -1,4 +1,4 @@ - + # Testing Skills With Subagents diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 214a3f6..e6fe17c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -79,7 +79,7 @@ jobs: - run: pnpm -r --if-present run test # The step-0 journeys spawn the real web server against the migrated database. - run: pnpm -r --if-present run test:journeys - # check-docs-accuracy.mjs is left out until the handbook exempts synced files + # check-docs-accuracy.mjs is left out until KITT exempts synced files # from its path rule: every failure today is a vendored doc citing another # product's paths (docs/engineering/deferred-work.md). diff --git a/.github/workflows/project-sync.yml b/.github/workflows/project-sync.yml index b0c5fd1..08a99c1 100644 --- a/.github/workflows/project-sync.yml +++ b/.github/workflows/project-sync.yml @@ -3,7 +3,7 @@ name: Project sync # Mirrors each workstream issue's stage:/waiting:/mode: labels onto David's # GitHub Project board (docs/ai-context/workstream-tracking.md). Labels are the # source of truth; the board is a view of them. The script is synced from -# AI-Handbook (scripts/sync-project-fields.mjs) and fails loudly on anything it +# KITT (scripts/sync-project-fields.mjs) and fails loudly on anything it # cannot map. Inputs, set by David in the repository settings: # secret PROJECTS_TOKEN classic PAT, `project` scope only # variable PROJECT_OWNER the board's owner login @@ -33,7 +33,7 @@ jobs: name: Sync board # Only workstream labels move the board. Any other label (bug, gap, …) # changing on any issue would otherwise add that issue as a blank row, - # since the script adds before it updates (AI-Handbook #176). `mode:` is + # since the script adds before it updates (KITT #176). `mode:` is # shared with backlog items and gaps, which carry no `stage:`, so a # `mode:` change counts only on an issue that has one. `stage:` and # `waiting:` changes always count, so removing the last one still clears @@ -57,6 +57,6 @@ jobs: PROJECT_OWNER: ${{ vars.PROJECT_OWNER }} PROJECT_NUMBER: ${{ vars.PROJECT_NUMBER }} # Empty on a manual run, which reconciles every open issue; until - # AI-Handbook #176 lands that adds non-workstream issues too, so run + # KITT #176 lands that adds non-workstream issues too, so run # it only while every open issue is a workstream. ISSUE_NUMBER: ${{ github.event.issue.number }} diff --git a/CLAUDE.md b/CLAUDE.md index b0e7b00..45ec5a8 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -24,7 +24,7 @@ product manager. ## Product-specific skills -None yet. The handbook's skills cover everything so far. +None yet. KITT's skills cover everything so far. ## What the shared rules ask this repo diff --git a/docs/ai-context/agent-legible-codebase-eval.md b/docs/ai-context/agent-legible-codebase-eval.md index ad2d8dc..41a19ca 100644 --- a/docs/ai-context/agent-legible-codebase-eval.md +++ b/docs/ai-context/agent-legible-codebase-eval.md @@ -1,4 +1,4 @@ - + # The agent-legible codebase eval diff --git a/docs/ai-context/agent-legible-codebase.md b/docs/ai-context/agent-legible-codebase.md index e8e5691..2fa85cc 100644 --- a/docs/ai-context/agent-legible-codebase.md +++ b/docs/ai-context/agent-legible-codebase.md @@ -1,4 +1,4 @@ - + # The agent-legible codebase: direction, tool and contract @@ -19,7 +19,7 @@ behaviour whose name does not match its file, reading a four-thousand-line route file for one handler, and doing the class sweep [`working-modes.md`](working-modes.md) requires by text search. A swarm pays it in parallel and collides on the same large files. The research gathered -before this was built (recorded in the AI-Handbook repository's research +before this was built (recorded in the KITT repository's research notes) points one way: - **Context loaded up front buys rule-following, not navigation.** Repository @@ -109,7 +109,7 @@ and by which guard" is itself a query: and vendored components belong here: they contribute edges and consumers. - **Headered**: indexed, minus `sets.headered.exclude` (tests by default), minus codegen-owned paths, minus `.d.ts`, minus any file carrying the - `SYNCED FROM AI-Handbook` header (the sync owns those). + `SYNCED FROM KITT` header (the sync owns those). - **Sized**: headered, minus `sets.sized.exclude`. **Reconciliation.** The build compares the indexed set with the files the @@ -145,7 +145,7 @@ since its target could be the file asked about. The tool's contract with every consumer. Recognition is by the **resolved type from the repository's own dependencies**, never by variable name or product path. A form outside the matrix is reported as `unsupported-form` at its site; -adding a form is a handbook change with a fixture, never a consumer patch. +adding a form is a KITT change with a fixture, never a consumer patch. | Area | Recognised forms | |---|---| @@ -168,7 +168,7 @@ separate file the check never compares, and a rebuild on unchanged inputs leaves it untouched. So a commit, a documentation change, a merge or a fresh checkout never makes the index stale; changing code, a test, a generated barrel, a package's exports, a lockfile or the compiler does. So does a -handbook change to what the tool recognises: **any change to recognition +KITT change to what the tool recognises: **any change to recognition bumps `TOOL_VERSION`** in `scripts/map.mjs`, so every consumer's committed index goes stale at the next sync and is rebuilt, rather than answering from what the previous recogniser found. (#211 changed two recognisers @@ -271,7 +271,7 @@ rule does not apply. To adopt: configuration cannot skip it. 7. Run [the eval](agent-legible-codebase-eval.md); its result sets `enabled`. -The adoption steps for the handbook's consumers are also in the handbook's +The adoption steps for KITT's consumers are also in KITT's consuming-repos guide. ## Backing out @@ -288,7 +288,7 @@ corrective commit. Headers are inert comments and may stay. 3. **Remove from the fleet, in this order**: every consumer first removes its CI invocation, its configuration and its rules file (the sync has no - authority over consumer-owned files); then the handbook deletes the payload + authority over consumer-owned files); then KITT deletes the payload files, and the next sync takes back every synced copy by its header; then the forcing rule's paragraph goes. Done out of order, an always-on check would call a script the sync had already removed. diff --git a/docs/ai-context/agent-working-rules.md b/docs/ai-context/agent-working-rules.md index 480f93d..b865d36 100644 --- a/docs/ai-context/agent-working-rules.md +++ b/docs/ai-context/agent-working-rules.md @@ -1,4 +1,4 @@ - + # Agent Working Rules @@ -184,7 +184,7 @@ asked; the recommendation is taken and reported. spend above a per-turn cap once David sets one; **a paid AI run, or any cost beyond the session's own tokens, above $5 for one run, and any such spend once the week's total across every product — read from the fleet's - paid-run ledger in the handbook (`uat-doc-format.md`, *Lanes*) — would pass + paid-run ledger in KITT (`uat-doc-format.md`, *Lanes*) — would pass $25** (David, 2026-10-21: *"Include paid AI runs or anything that incurs cost above just the tokens in my plan. Limit it to $5/run and set a weekly budget of $25 just in case."*) — @@ -276,7 +276,7 @@ asked; the recommendation is taken and reported. workstreams*, referenced here and never restated): a decision that fails it is recorded sanitized in all of them, with its specifics on the private path, exactly as the prototype ledger rule already does (Codex, DojoOS #8 - and AI-Handbook #198). His reversal afterwards is a corrective commit, and the + and KITT #198). His reversal afterwards is a corrective commit, and the advice rule's override record applies. - **`/maintenance` counts them**: decisions taken this way in the window, and how many he reversed. A reversal rate is the signal that the default is set diff --git a/docs/ai-context/architecture.md b/docs/ai-context/architecture.md index a8d0b6b..d0cae04 100644 --- a/docs/ai-context/architecture.md +++ b/docs/ai-context/architecture.md @@ -7,8 +7,8 @@ by David on 2026-10-03 (sha256 one scope exchange and four assessment exchanges with Astra. The plan is committed at [`docs/plans/PLAN_DOJOOS_ARCHITECTURE.md`](../plans/PLAN_DOJOOS_ARCHITECTURE.md) as the approved snapshot, pinned by that digest and never edited: its own -status line ("presented for approval. Never pushed") predates the -handbook's 2026-10-12 rule that an approved plan is committed on its feature +status line ("presented for approval. Never pushed") predates +KITT's 2026-10-12 rule that an approved plan is committed on its feature branch, and stays as approved because the digest verifies the file byte-for-byte. This page carries its design sections and is where design changes are written; the reasons behind each choice are in diff --git a/docs/ai-context/async-ui-status.md b/docs/ai-context/async-ui-status.md index 8000191..89062da 100644 --- a/docs/ai-context/async-ui-status.md +++ b/docs/ai-context/async-ui-status.md @@ -1,4 +1,4 @@ - + # Async Work Must SHOW Its Status diff --git a/docs/ai-context/codex-environment.md b/docs/ai-context/codex-environment.md index 714f124..af3a3be 100644 --- a/docs/ai-context/codex-environment.md +++ b/docs/ai-context/codex-environment.md @@ -7,6 +7,6 @@ runs in a cloud sandbox from this repository. database is available there; anything needing Postgres is verified in the Repl instead. - **What runs there:** `pnpm install`, `pnpm run typecheck`, the web lint, - and the handbook's node test suites (`node --test scripts/__tests__/`). + and KITT's node test suites (`node --test scripts/__tests__/`). - **Setup script:** none yet. One is added when a Codex task first needs more than the list above. diff --git a/docs/ai-context/documentation-workflow.md b/docs/ai-context/documentation-workflow.md index adcee33..a6ea156 100644 --- a/docs/ai-context/documentation-workflow.md +++ b/docs/ai-context/documentation-workflow.md @@ -1,4 +1,4 @@ - + # Documentation workflow — the `/document` end-of-feature ceremony diff --git a/docs/ai-context/known-failure-patterns.md b/docs/ai-context/known-failure-patterns.md index a7d75ab..365d777 100644 --- a/docs/ai-context/known-failure-patterns.md +++ b/docs/ai-context/known-failure-patterns.md @@ -1,4 +1,4 @@ - + # Known Failure Patterns @@ -1008,7 +1008,7 @@ rule, name the durable location (a branch, a private tracking item) and the moment the artifact reaches it; when retiring a durable home, name its successor in the same change. A hand-off or resume pointer that names a location only one container holds is the same failure one step later, and is -refused rather than written (`handoff` skill, Step 2). **Example (handbook, +refused rather than written (`handoff` skill, Step 2). **Example (KITT, 2026-09-09 to 2026-10-12):** "a plan is never published … the plan file is still pushed nowhere" removed, one step at a time, every durable home an approved plan had — the plan-review PR, then the private page — until the @@ -1567,7 +1567,7 @@ restating it here. ### Sub-pattern: the author of the new rule cannot sweep for the old one The three sub-patterns above all assume the same reader can derive a better -method next round. AI-Handbook #96 is the case where that failed four times. +method next round. KITT #96 is the case where that failed four times. Its design change landed in the mechanism; the prose did not follow; and three successive reconciliations — grep for the retired phrases, then read the sections end to end by decision path, then both plus an acceptance check — each @@ -1598,7 +1598,7 @@ is not restated here. Every sweep above hunts **references to** what was removed. None can find what the removed thing **held** that something surviving still needs, because an -absence has no text to match. The #89 cut (AI-Handbook #102) hit it three times +absence has no text to match. The #89 cut (KITT #102) hit it three times in two rounds: a skill section deleted as duplicate also held the only definition of three procedures the always-loaded contract still named; a rule deleted for its arithmetic had a definition wrapped inside it that a surviving @@ -1913,9 +1913,9 @@ check whose two sides the same code owns guards nothing); or **change the operation**, which is the move that actually ends these. -### The stop rule written from this entry did not work (AI-Handbook #91) +### The stop rule written from this entry did not work (KITT #91) -AI-Handbook #91 turned the tell above into review-loop rule 7 in +KITT #91 turned the tell above into review-loop rule 7 in `claude-core.md`: a mandatory stop, keyed to that observable. **David removed it on 2026-09-15, after seven rounds.** The attempt is recorded here rather than deleted, because the next person to have this idea should meet the @@ -1945,7 +1945,7 @@ each refining a boundary and exposing the next: once fired on that loop, by its own observable, while that loop exhibited this exact pattern throughout.** Checked at rounds 4, 5 and 7; negative every time. -**The lesson is not "observables don't work."** AI-Handbook #85's finding +**The lesson is not "observables don't work."** KITT #85's finding stands — a condition you have to interpret is one you will reinterpret. The lesson is the question #85 did not ask and #91 paid seven rounds to learn: **an observable trigger also has to be REACHABLE on a real loop, and nothing @@ -1954,7 +1954,7 @@ read-off-the-record, and still never fire — because the state it names is narrower than the situation it was written for. Test a proposed trigger against loops that already happened before making it binding. -**AI-Handbook, four instances inside one workstream (#36), plus the one that +**KITT, four instances inside one workstream (#36), plus the one that shows the cure.** PR #28: two of round 2's findings were defects round 1's fixes introduced, and one slipped through a sweep whose exclusion pattern whitelisted its own target. PR #80: three rounds, each finding a defect on one @@ -2926,7 +2926,7 @@ that was in your head, and the shape that arrives is a sibling of it. The observable rule and the class rule both survive intact; what neither of them supplies is the step where you ask *what is the harm, and what else produces it?* -**The worked examples, all from AI-Handbook #124.** Three flip conditions in one +**The worked examples, all from KITT #124.** Three flip conditions in one pull request had their wording and their intent pull apart: - **Round 2.** *"Three or more findings landing on the corrections themselves"* — @@ -2990,13 +2990,13 @@ drafting failure; this is a category error about what the device is for. **It runs in both directions, and each has its own cost.** A stopping rule read as a triage rule **declines too much**: applied consistently it declines every finding in every round that does not happen to end the loop, which is a decline -quota rebuilt out of a stopping rule — the exact shape AI-Handbook #96 retired. +quota rebuilt out of a stopping rule — the exact shape KITT #96 retired. A triage rule read as a stopping rule **writes too much**: "this is worth fixing" authorises the *fix*, never the *round*, and treating it as though it settled the round's cost buys a full write-gate round for a change nobody needed. -**The worked examples, both from AI-Handbook #124.** +**The worked examples, both from KITT #124.** - **Round 7, declining too much.** A finding naming an incomplete oracle requirement — a fleet-wide instruction still cancelling the delegation the @@ -3087,7 +3087,7 @@ round; what makes it dangerous is that mis-scoping the consequence is indistinguishable, in the moment and in the written reply, from applying it correctly. -**The worked example (AI-Handbook #73).** Round 3 reported that +**The worked example (KITT #73).** Round 3 reported that `fable-dispatch.mjs` — since deleted, #95 — checked its `--out` path *lexically*, so a symlinked component could put the receipt outside the repository. The decline weighed diff --git a/docs/ai-context/overlay-declarations.md b/docs/ai-context/overlay-declarations.md index a91e1ce..50d6e26 100644 --- a/docs/ai-context/overlay-declarations.md +++ b/docs/ai-context/overlay-declarations.md @@ -1,6 +1,6 @@ # What the shared rules ask DojoOS -The handbook's rules dereference six answers from this file. Both +KITT's rules dereference six answers from this file. Both `CLAUDE.md` and `AGENTS.md` route here; nothing else holds these answers. ## Sensitive subsystems diff --git a/docs/ai-context/planning-contract.md b/docs/ai-context/planning-contract.md index 04629ac..5b4f624 100644 --- a/docs/ai-context/planning-contract.md +++ b/docs/ai-context/planning-contract.md @@ -1,4 +1,4 @@ - + # The planning contract diff --git a/docs/ai-context/product-brief.md b/docs/ai-context/product-brief.md index 0554f8a..2069fc3 100644 --- a/docs/ai-context/product-brief.md +++ b/docs/ai-context/product-brief.md @@ -23,7 +23,7 @@ makes ease of use the product requirement rather than a preference. It is single-tenant, bespoke, and never needs large-scale deployment. Business owner: Jared Cooper. Product manager: David. Engineer: Claude Code, -with Codex reviewing and Replit hosting, under the AI-Handbook contract. +with Codex reviewing and Replit hosting, under the KITT contract. ## Facts (looked up 2026-09-25; not decisions) @@ -135,7 +135,7 @@ stays live throughout. original at the worst case, about 6 GB per hour for today's files, ~2.7 GB per hour of 1080p proxy. - **Operator** (Q4). Jared, with David for testing; no roles beyond the - tester tier the handbook's prototype phase requires. + tester tier KITT's prototype phase requires. - **Publishing is David's** (Q30). Claude merges to `main` and stops; David tests in the development environment and publishes when he chooses. @@ -250,10 +250,10 @@ keep-span of a source with attributes. **Cut** — an assembled output **Library** — all bricks across shoots, including b-roll. "Project" is avoided because it would mean two things. -## Process decisions carried from the handbook +## Process decisions carried from KITT - The first product feature is a **prototype** of the logging viewer and - the live preview (Q17), in prototype phase under the handbook's + the live preview (Q17), in prototype phase under KITT's per-feature phase rule: its first version runs the short planning loop with Astra and David's approval; no code review, no UAT doc, the three machine lanes scaled to a prototype as the agent's proof (`ci` and diff --git a/docs/ai-context/prose-sweep.md b/docs/ai-context/prose-sweep.md index 1c2390a..80f2c7b 100644 --- a/docs/ai-context/prose-sweep.md +++ b/docs/ai-context/prose-sweep.md @@ -1,4 +1,4 @@ - + # Reconciling prose with a landed design change: sweep, never patch **This file is the only statement of the method.** `claude-core.md` and @@ -8,7 +8,7 @@ A second copy is a second thing to drift, which is this failure one level up. **When it runs.** A retirement or a reshaping: a rule replaced, a mechanism deleted, an authority moved, or a rule whose requirement changes — which -retires its previous reading (AI-Handbook #190: "either order" became +retires its previous reading (KITT #190: "either order" became "notification first"). The trigger's home is the core's *Standing rituals* line; this is what it means. Only a rule added beside the others, changing none, has nothing to sweep for. **And it runs again after every batch of fixes** — each patch @@ -20,7 +20,7 @@ sweep that is not cheap enough to re-run is always one batch behind. ## Why patching fails, measured -AI-Handbook #96 replaced the review loop's binding-disposition and +KITT #96 replaced the review loop's binding-disposition and critical-only model. The mechanism landed; the prose did not follow. Three author-side reconciliations each declared the class closed and each missed instances the next reader found — 4, then 3, then 3 — and a fourth pass by @@ -292,7 +292,7 @@ whether a guard is in scope at all. ## Worked instances -### The #96 / #134 review model (AI-Handbook #121, PR #141) +### The #96 / #134 review model (KITT #121, PR #141) Six propositions, of which (e) and (f) were added by cold readers mid-sweep and (e) was proposed independently by three of six: diff --git a/docs/ai-context/replit-platform.md b/docs/ai-context/replit-platform.md index e5fa0c6..2344bfd 100644 --- a/docs/ai-context/replit-platform.md +++ b/docs/ai-context/replit-platform.md @@ -1,4 +1,4 @@ - + # Replit — how the platform works, for every product hosted on it @@ -322,20 +322,46 @@ a value can still print it from the environment (docs, *secrets*). send the next message"* (docs, *agent-modes*, *model-selector*). - **The connector exposes no way to choose the mode.** Its `ask_question` and `update_app_using_prompt` both take a `policy` argument whose own schema - reads *"Ignored. Don't waste tokens sending this."* **How the server picks - the mode for a connector request is unknown**: neither the docs nor the - tool descriptions say it follows David's dropdown, and the Agent cannot see - which mode it ran in (Agent, 2026-10-29: *"I can't see which Free, Power, or - Max tier or exact model handled this request"*). What is measured is - the outcome: **a connector request runs Free whatever the dropdown says.** - Connector questions appear in the Repl's own Agent chat footed *"Free · No - credits used"*; with DojoOS's dropdown switched to **Power**, a connector - question still ran Free, while the same question typed by David ran Power - and cost **$0.27** (screen, 2026-10-29). Only `ask_question` was tested - under Power; `update_app_using_prompt` was not. - Replit documents none of this, so it is an observation that can change, not - a promise: a connector request's cost is read off its footer, never assumed. - And every question sent is visible to anyone who opens that Repl's Agent chat, which the tool's own description warns. + reads *"Ignored. Don't waste tokens sending this."*, and the Agent cannot + see which mode it ran in (Agent, 2026-10-29: *"I can't see which Free, + Power, or Max tier or exact model handled this request"*). +- **A connector request runs in the mode of the last message David typed in + that Repl's Agent chat** — not the dropdown's current value, and the same + for `ask_question` and `update_app_using_prompt` (DojoOS, 2026-11-01, read + off each message's footer on his screen, one variable at a time): + + | Last typed message | Dropdown | Connector question | Connector update | + |---|---|---|---| + | Free | Free | Free, no credits | Free, no credits | + | Free | **Power** | Free, no credits | Free, no credits | + | **Power** | Power | Power, $0.03 | Power, $0.03 | + | Free (typed after the Power row) | Free | Free, no credits | — | + + So the dropdown takes effect only with David's next typed message, and from + then on every connector request to that Repl bills at that mode until he + types again under another. Three earlier connector requests to DojoOS + billed Power at $0.11, $0.03 and $0.03 (screen, 2026-11-01); the rule + explains them if his last typed message there was under Power, which + nobody read at the time. **The way back to Free is one short + message he types with the dropdown on Free**; it costs nothing. Max was not + tested, and whether the inheritance is per Repl or per account was not + separated — each Repl was only ever observed after a message typed in it. + This replaces the 2026-10-29 reading that *"a connector request runs Free + whatever the dropdown says"*: that day's Power test switched the dropdown + without a typed message after it, which is exactly the row that stays Free. +- **A typed message can cost far more than a connector request at the same + mode.** David's five-second *"Switching to power mode"*, no actions, cost + **$0.30** in Power, against $0.03 for each connector request in the row + after it (screen, 2026-11-01). Why is unknown. +- **`list_app_files` and `read_app_file` reach no Agent**: nothing appears in + the Agent chat (DojoOS, 2026-11-01), so no mode applies. They are the read + path whenever a file's contents answer the question. Whether they bill + anything (they may wake the Repl's machine) is unable to verify: a Usage + page read for the day would settle it. +- Replit documents none of this, so it is an observation that can change, not + a promise: a connector request's cost is read off its footer, never + assumed. And every question sent is visible to anyone who opens that Repl's + Agent chat, which the tool's own description warns. - **Billing**: paid modes are effort-priced per request, one checkpoint per request, and Replit asks for confirmation before a paid action starts; Plan Mode bills reasoning even when nothing changes; usage takes up to 30 @@ -345,7 +371,8 @@ a value can still print it from the environment (docs, *secrets*). requests, **Free allowance read 0% used** and that day's *Agent* line held one entry — **DojoOS $0.27**, David's typed question, billed to the project it was asked in. Connector requests appear nowhere, not even at $0, - and neither does `get_publish_status`. Most of a month's spend need not be + and neither does `get_publish_status`. Whether a Power-billed connector + request reaches the page was not read. Most of a month's spend need not be AI at all: in that period production database compute was $25.08 of $42.75 (156.74 hours at $0.16/hour), against $13.37 of AI. - **Plans** that matter here: Starter allows one published app that expires @@ -438,7 +465,10 @@ Two things not yet seen, each settled only by David's screen: before every publish. Settled on 2026-10-29 by his screenshots: production secrets, the history -list and its reach, what a preview deploy is, that connector requests run -Free regardless of the dropdown and never reach the Usage page. Left +list and its reach, what a preview deploy is, and that Free connector +requests never reach the Usage page. Settled on 2026-11-01 by his +screenshots: a connector request runs in the mode of the last message he +typed in that Repl's chat (*Agent modes*), replacing the 2026-10-29 reading that +it ran Free regardless of the dropdown. Left unmeasured by decision: whether a publish includes uncommitted files (*Publishing*). diff --git a/docs/ai-context/review-judgment.md b/docs/ai-context/review-judgment.md index b5934c5..ad35074 100644 --- a/docs/ai-context/review-judgment.md +++ b/docs/ai-context/review-judgment.md @@ -1,4 +1,4 @@ - + # The Worth rule: is this intervention worthwhile? **This file is the only statement of the rule.** Astra's brief and the Fable diff --git a/docs/ai-context/token-pricing.md b/docs/ai-context/token-pricing.md index 2e19ade..faa3930 100644 --- a/docs/ai-context/token-pricing.md +++ b/docs/ai-context/token-pricing.md @@ -1,11 +1,11 @@ - + # Token pricing — the published list prices the spend line uses **What this is.** The per-million-token list prices that every spend line (`claude-core.md`, *A reversible choice proceeds, and every turn reports its spend*, item 2) converts tokens with. They are read from the vendors' published pricing pages, quoted here with the date they were read, and -**refreshed at the handbook's `/maintenance` pass** (the `maintenance` skill, +**refreshed at KITT's `/maintenance` pass** (the `maintenance` skill, step 6b) — the one source; a consumer's copy is vendored and read-only, and a consumer's pass reports its dates rather than editing it. A spend line cites a rate from this table; `unable to verify` is for a model @@ -83,7 +83,7 @@ Three readings behind that formula, each settled rather than assumed: the output tokens", and its example totals input plus output alone (328 + 52 = 380 with `reasoning_tokens: 0`); the CLI copies both counters straight from the turn total. So `reasoning_output_tokens` is diagnostic, not a - bucket (Codex, AI-Handbook #199 round 2). + bucket (Codex, KITT #199 round 2). - **The usage is the turn's cumulative total, but the 272K threshold is per request** — "Prompts with more than 272K input tokens are priced at 2x input and cache rates and 1.5x output for the full request" (the `gpt-6-astra` @@ -95,13 +95,13 @@ Three readings behind that formula, each settled rather than assumed: from the long-context row, and the spend line says so** (`≤ $X, long-context row as ceiling`), since which requests crossed is not in the reading. That overstates and never understates, the side the Haiku rule below takes for - the same reason (Codex, AI-Handbook #199 round 2). + the same reason (Codex, KITT #199 round 2). A run whose log says `usage not reported` is `unable to verify` in the spend line, as the rule at the top says. That covers a usage object lacking any of the five buckets, the CLI's all-zero default for a turn that reported no usage at all, and a stream in which the CLI rerouted the run to another -model — whose counts would be priced at the wrong rates (AI-Handbook #197 +model — whose counts would be priced at the wrong rates (KITT #197 items 4 and 5). (This replaces the single $15/M Astra proxy row and answers Overhype.me #639 `4243652049` and DojoOS #8 `4243765922`.) @@ -141,19 +141,19 @@ by a decision recorded here; the rates change at every refresh. ## Refreshing this table -At **AI-Handbook's** `/maintenance`, step 6b — and only there, since this +At **KITT's** `/maintenance`, step 6b — and only there, since this file is payload and a consumer's copy is overwritten by the next sync: fetch both pricing pages, re-quote the rows for every model this table names and -for any new model the handbook's own `.agents/machinery.json` pins, update +for any new model KITT's own `.agents/machinery.json` pins, update the two tables and each section's read date, and recompute the proxy column from the rule above. A consumer that pins a model this table does not carry -gets its row by a pull request to the handbook, never by a local edit — a -consumer's pins are its own, so the handbook's pass cannot see them, and +gets its row by a pull request to KITT, never by a local edit — a +consumer's pins are its own, so KITT's pass cannot see them, and until the row lands every spend line there reads `unable to verify`, which is the signal to open that pull request. A consumer's `/maintenance` reads this table and reports each section's read date and how old it is; it never -edits it, and it does not judge the copy stale against the handbook's pass, +edits it, and it does not judge the copy stale against KITT's pass, whose date it has no way to read — a newer table reaches a consumer only by -the next sync from the handbook. A page that cannot be fetched leaves its +the next sync from KITT. A page that cannot be fetched leaves its section as is with the old date, and the maintenance report says so — a stale rate with its date is a reading; a guessed one is not. diff --git a/docs/ai-context/web-research.md b/docs/ai-context/web-research.md index 6811858..4b684b7 100644 --- a/docs/ai-context/web-research.md +++ b/docs/ai-context/web-research.md @@ -1,4 +1,4 @@ - + # Web research — WebFetch and the Firecrawl connector diff --git a/docs/ai-context/working-modes.md b/docs/ai-context/working-modes.md index 0e033a5..2ecd802 100644 --- a/docs/ai-context/working-modes.md +++ b/docs/ai-context/working-modes.md @@ -1,4 +1,4 @@ - + # Working Modes: feature (default) vs. bugfix @@ -777,7 +777,7 @@ by the same agent in the same turn, on green CI. Codex's automatic pass on PR-op run or produce reasonable output, which is fixed at prototype depth as a further commit of the version — or, since the PR merges on green CI without waiting for the pass, as a same-day follow-up PR on `main` when the pass -lands after the merge (David, 2026-10-21: *"Yes skim."*; Codex, AI-Handbook +lands after the merge (David, 2026-10-21: *"Yes skim."*; Codex, KITT #221 round 2, named the timing gap). Every other thread is resolved with one line naming this phase and starts no fix. **The one fix a prototype owes regardless of who finds it** is a defect that @@ -864,7 +864,7 @@ every commit is under, whatever the phase: no secret and no customer data is ever committed (Codex, #168 round 6). **What it does not remove.** The phase is a property of product features. The -repository's machinery — CI, settings, permissions, the vendored handbook +repository's machinery — CI, settings, permissions, the vendored KITT payload, an agent role's definition — has no phase and stays in the standard loop or the two classes above. A PR that touches **any** production-phase feature is in the standard loop for the **whole** PR: the stricter rule wins, diff --git a/docs/ai-context/workstream-tracking.md b/docs/ai-context/workstream-tracking.md index 8808116..54693d8 100644 --- a/docs/ai-context/workstream-tracking.md +++ b/docs/ai-context/workstream-tracking.md @@ -1,4 +1,4 @@ - + # Workstream tracking — the board, the labels, and who updates what @@ -323,7 +323,7 @@ of the workstream issue's body, with these fields: the build report can state what the build cost (David, 2026-10-21; `claude-core.md`, *A reversible choice proceeds, and every turn reports its spend*). The one ledger line a workstream - keeps; the other is the fleet's `paid-ai-ledger` issue in the handbook's + keeps; the other is the fleet's `paid-ai-ledger` issue in KITT's repository, one comment per paid AI run in any product, which the weekly paid-run budget — one total across every product — is read from (`uat-doc-format.md`, *Lanes*). @@ -472,7 +472,7 @@ regime, at the flip, at abandonment — say `Refs #N` and own no lifecycle. Wher verify after the close-out sync, so the issue closes then. (David, 2026-09-25. Before this, the only step that closed an issue was an accepted `/uat` run. Every workstream with no UAT — every docs, devops and Tier A bugfix PR, and in -AI-Handbook nearly every PR — parked at `stage:close-out` with "David's to +KITT nearly every PR — parked at `stage:close-out` with "David's to set" `stage:done`, and nothing ever asked him to.) - **Close-out is a moment, not a resting state.** Whoever moves a diff --git a/docs/engineering/code-review.md b/docs/engineering/code-review.md index 969245c..d1e8453 100644 --- a/docs/engineering/code-review.md +++ b/docs/engineering/code-review.md @@ -1,4 +1,4 @@ - + # Code Review Guide diff --git a/docs/engineering/deferred-work.md b/docs/engineering/deferred-work.md index 0cc7299..afd5230 100644 --- a/docs/engineering/deferred-work.md +++ b/docs/engineering/deferred-work.md @@ -15,8 +15,8 @@ maintenance pass reads and updates this list. - **Transcription, speech-to-text and the command classifier** — providers chosen in the build (architecture, *Media pipeline* and *commands*). - **Docs-accuracy check out of CI** — its path rule fails on 31 citations - in synced handbook files (examples from another product), none in - DojoOS's own docs. Restored to CI once the handbook exempts synced files + in synced KITT files (examples from another product), none in + DojoOS's own docs. Restored to CI once KITT exempts synced files from the path rule. (Enrollment, 2026-10-03.) - **`lib/db` is an unused template package** whose `push` and `push-force` scripts point drizzle-kit at the live database with an empty schema. diff --git a/docs/plans/.gitignore b/docs/plans/.gitignore index e964b10..ce00c55 100644 --- a/docs/plans/.gitignore +++ b/docs/plans/.gitignore @@ -1,4 +1,4 @@ -# SYNCED FROM AI-Handbook — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change the handbook instead. +# SYNCED FROM KITT — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change KITT instead. # A draft plan is never committed by accident: `git add -A` during # implementation would otherwise stage it, and a plan is exactly the document # that might name an unpatched vulnerability, an auth-bypass specific, a diff --git a/docs/tests/TESTING.md b/docs/tests/TESTING.md index 2b222a0..1f6afaf 100644 --- a/docs/tests/TESTING.md +++ b/docs/tests/TESTING.md @@ -6,14 +6,14 @@ | Web lint, including the module-boundary rule | `pnpm --filter @workspace/web lint` | CI and locally | | Worker lease-expiry, renewal and reclaim tests, and the ingest media tests (proxy, sprite, peaks from generated clips) | `pnpm --filter @workspace/worker test` | CI and locally; needs `DATABASE_URL` pointing at a migrated database (CI's Postgres service, migrated by `pnpm --filter @workspace/shared run migrate`), and `ffmpeg` and `ffprobe` on PATH (CI installs them; the Repl has them from `replit.nix`); the media tests fail rather than skip without them | | Journeys: the real web server over HTTP, and Chromium walks of sign-in, the tester's feedback rail, the operator's feedback page and proxy playback through a signed URL | `pnpm --filter @workspace/web test:journeys` | CI and locally; needs a migrated `DATABASE_URL` whose database is named `test` or ends in `_test` (the journeys reseed the operator and tester accounts and refuse any other name), and `playwright install chromium` once | -| Handbook machinery tests | `node --test scripts/__tests__/*.test.mjs` | CI and locally | -| Docs accuracy | `node scripts/check-docs-accuracy.mjs` | not in CI yet: it fails on synced handbook files that cite other products' paths (see `docs/engineering/deferred-work.md`) | +| KITT machinery tests | `node --test scripts/__tests__/*.test.mjs` | CI and locally | +| Docs accuracy | `node scripts/check-docs-accuracy.mjs` | not in CI yet: it fails on synced KITT files that cite other products' paths (see `docs/engineering/deferred-work.md`) | | UAT document format | `node scripts/check-uat-format.mjs` | CI | Prototype-phase features carry no code-review loop and no hardening bar until David flips them to production, but they keep the machine lanes (`ci`, `scripted`, `live`) scaled to a prototype as the proof that a version -works before the owner is asked — the handbook's `working-modes.md`, *What +works before the owner is asked — KITT's `working-modes.md`, *What prototype phase keeps of verification*. The pure functions at the centre (`resolveCut`, `clipRevision`, `applyCommand`) get unit tests when they are first implemented, because every feature depends on them. diff --git a/docs/tests/uat-doc-format.md b/docs/tests/uat-doc-format.md index 238083e..fd2b68b 100644 --- a/docs/tests/uat-doc-format.md +++ b/docs/tests/uat-doc-format.md @@ -1,4 +1,4 @@ - + # The UAT format @@ -149,7 +149,7 @@ reports what it cost in the turn's spend line. **The week's total is read, never remembered** (2026-10-21, after the first build report found the $25 had no record any session could read). **The $25 is one total across every product** (David, 2026-10-22: *"$25/week is across all products."*), so there -is **one ledger for the fleet**: an open issue in the handbook's repository +is **one ledger for the fleet**: an open issue in KITT's repository (`PAID_RUN_LEDGER_REPO` in `machinery.mjs`) labelled `paid-ai-ledger`, opened at the fleet's first paid run, and every paid run in any product adds one comment to it — the date, the product, what ran, and what it cost, under the @@ -157,7 +157,7 @@ disclosure check, since that repository is public. Before a paid run, every comment from the trailing seven days is totalled, whichever product it names; that total plus the run's worst case is what is held against $25. A run whose cost was not recorded is counted at its worst case. A session -whose GitHub access does not reach the handbook attaches it (`add_repo`, +whose GitHub access does not reach KITT attaches it (`add_repo`, push access, since it writes the comment) before the run; one that still cannot read the ledger cannot know the week's total, so the run asks first, as one above the budget would. A spending cap the consumer diff --git a/scripts/__tests__/build-report.test.mjs b/scripts/__tests__/build-report.test.mjs index 766696c..bf72174 100644 --- a/scripts/__tests__/build-report.test.mjs +++ b/scripts/__tests__/build-report.test.mjs @@ -1,4 +1,4 @@ -// SYNCED FROM AI-Handbook — do not edit in a consumer repo. +// SYNCED FROM KITT — do not edit in a consumer repo. /** * The build report's tests. The deliverable is a chat message, so these assert * on text. The rule under test throughout: **"agrees" is never printed over an @@ -89,7 +89,7 @@ test("the brief carries the coordinates, the answer path and the whole schema in assert.ok(brief.includes(answerPath(root, "pr-7"))); assert.ok(brief.includes('"what_was_built"'), "the schema travels with the brief"); assert.match(brief, /no tool that can open a file/); - assert.match(brief, /`paid-ai-ledger` in `TheAnswerManIsHere\/AI-Handbook`/, "the ledger is the fleet's, not the unit's repository"); + assert.match(brief, /`paid-ai-ledger` in `TheAnswerManIsHere\/KITT`/, "the ledger is the fleet's, not the unit's repository"); }); test("a branch-regime prototype version is a unit with no pull request", () => { @@ -187,7 +187,7 @@ test("the report prints the fixed sections in order, in the role's words", () => } assert.ok(text.includes("Revert the pin and bump Playwright.")); assert.ok(text.includes("$4.10 over 6 turns")); - assert.match(text, /no paid-run ledger in the handbook yet/); + assert.match(text, /no paid-run ledger in KITT yet/); assert.doesNotMatch(text, /took_on_trust|did not read the logs/, "took_on_trust is collected, not shown"); assert.doesNotMatch(text, /Written by/, "a matching model prints nothing"); }); diff --git a/scripts/__tests__/check-docs-accuracy.test.mjs b/scripts/__tests__/check-docs-accuracy.test.mjs index 57040b2..c548088 100644 --- a/scripts/__tests__/check-docs-accuracy.test.mjs +++ b/scripts/__tests__/check-docs-accuracy.test.mjs @@ -1,4 +1,4 @@ -// SYNCED FROM AI-Handbook — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change the handbook instead. +// SYNCED FROM KITT — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change KITT instead. // // check-docs-accuracy.mjs runs its checks at import time against the repository // it is installed in -- ROOT comes from the script's own location, so it cannot diff --git a/scripts/__tests__/check-uat-format.test.mjs b/scripts/__tests__/check-uat-format.test.mjs index 26d4194..5ec396d 100644 --- a/scripts/__tests__/check-uat-format.test.mjs +++ b/scripts/__tests__/check-uat-format.test.mjs @@ -1,4 +1,4 @@ -// SYNCED FROM AI-Handbook — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change the handbook instead. +// SYNCED FROM KITT — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change KITT instead. import { test } from "node:test"; import assert from "node:assert/strict"; import { mkdtempSync, writeFileSync, rmSync } from "node:fs"; diff --git a/scripts/__tests__/entry-point-comparison.test.mjs b/scripts/__tests__/entry-point-comparison.test.mjs index a30636e..f743405 100644 --- a/scripts/__tests__/entry-point-comparison.test.mjs +++ b/scripts/__tests__/entry-point-comparison.test.mjs @@ -1,4 +1,4 @@ -// SYNCED FROM AI-Handbook — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change the handbook instead. +// SYNCED FROM KITT — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change KITT instead. import test from "node:test"; import assert from "node:assert/strict"; import { readdirSync, readFileSync } from "node:fs"; @@ -29,7 +29,7 @@ const SCRIPTS = resolve(dirname(fileURLToPath(import.meta.url)), ".."); // // This file exists because that check lived in `guard-decision.test.mjs`, // which went with the guard. `scripts/__tests__/entry-point-comparison.test.mjs` -// is the handbook's own copy; this is the payload's, and neither suite can see +// is KITT's own copy; this is the payload's, and neither suite can see // the other's directory. // --------------------------------------------------------------------------- diff --git a/scripts/__tests__/machinery.test.mjs b/scripts/__tests__/machinery.test.mjs index 29acbbb..e45cbb2 100644 --- a/scripts/__tests__/machinery.test.mjs +++ b/scripts/__tests__/machinery.test.mjs @@ -1,4 +1,4 @@ -// SYNCED FROM AI-Handbook — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change the handbook instead. +// SYNCED FROM KITT — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change KITT instead. // // The shared module's own suite. Every case here was already covered before // the #89 cut -- the configuration half by `review-budget.test.mjs` and the @@ -42,7 +42,7 @@ const repoWith = (config) => { }; test("findRepoRoot asks the filesystem rather than matching the path string", () => { - // The scripts live one level deeper in the handbook than in a consumer, and + // The scripts live one level deeper in KITT than in a consumer, and // deciding that by looking for "/core/" in a path is the compare-a-path-as-a // -string defect class this repository has paid for repeatedly. const root = repoWith({ repo: "o/r" }); diff --git a/scripts/__tests__/map.unit.test.mjs b/scripts/__tests__/map.unit.test.mjs index e467e96..e7177eb 100644 --- a/scripts/__tests__/map.unit.test.mjs +++ b/scripts/__tests__/map.unit.test.mjs @@ -1,9 +1,9 @@ -// SYNCED FROM AI-Handbook — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change the handbook instead. +// SYNCED FROM KITT — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change KITT instead. // // The map tool's pure functions, on bare Node: no compiler, no sync, no // fixture repository. This file ships with the payload, so it must run // wherever it lands; the compiler-backed behaviour is proven by the -// handbook's own integration suite, which never ships. +// KITT's own integration suite, which never ships. import test from "node:test"; import assert from "node:assert/strict"; import { @@ -123,8 +123,9 @@ test("sets: codegen, synced and test files leave the headered set but stay index const s = computeSets(files, cfg, (f) => f === "scripts/sync.mjs"); assert.deepEqual(s.indexed, files); assert.deepEqual(s.headered, ["src/a.ts"]); - assert.ok(carriesSyncBanner("#!/usr/bin/env node\n// SYNCED FROM AI-Handbook — x\n")); - assert.ok(!carriesSyncBanner('const s = "SYNCED FROM AI-Handbook";\n')); + assert.ok(carriesSyncBanner("#!/usr/bin/env node\n// SYNCED FROM KITT — x\n")); + assert.ok(!carriesSyncBanner('const s = "SYNCED FROM KITT";\n')); + assert.ok(carriesSyncBanner("// SYNCED FROM AI-Handbook — x\n"), "a copy synced before the rename still counts as synced"); }); test("not-found answers suggest the nearest real paths", () => { diff --git a/scripts/__tests__/needs-you-alert.test.mjs b/scripts/__tests__/needs-you-alert.test.mjs index efd658f..c424ef0 100644 --- a/scripts/__tests__/needs-you-alert.test.mjs +++ b/scripts/__tests__/needs-you-alert.test.mjs @@ -1,4 +1,4 @@ -// SYNCED FROM AI-Handbook — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change the handbook instead. +// SYNCED FROM KITT — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change KITT instead. import { test } from "node:test"; import assert from "node:assert/strict"; import { spawnSync } from "node:child_process"; diff --git a/scripts/__tests__/plan-review-recipes.test.mjs b/scripts/__tests__/plan-review-recipes.test.mjs index ebe6825..393b3c9 100644 --- a/scripts/__tests__/plan-review-recipes.test.mjs +++ b/scripts/__tests__/plan-review-recipes.test.mjs @@ -1,4 +1,4 @@ -// SYNCED FROM AI-Handbook — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change the handbook instead. +// SYNCED FROM KITT — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change KITT instead. /** * The skill's own recipe text, RUN. * @@ -35,8 +35,8 @@ * BOTH PAYLOAD LAYOUTS ARE RUN, and until #124 round 8 only one was. The sync * routes `core/X -> X`, so the payload sits at `core/scripts/...` here and at * `scripts/...` in every consumer -- and the consumer layout is the one every - * repository except this one actually runs. The fixture built only the - * handbook's, so two consumer-only mechanisms were documented and never + * repository except this one actually runs. The fixture built only + * KITT's, so two consumer-only mechanisms were documented and never * executed: the `P=` line's `[ -f "$P" ] || P=scripts/plan-review.mjs` fallback * (`SKILL.md:23`), and `readVerbatim`'s consumer-first candidate, which tries * `docs/ai-context/...` before retrying under `core/`. `LAYOUTS` below runs @@ -67,13 +67,13 @@ * concerns.json, and exchange(s) 0 already ran` * * THE LAYOUT SPLIT IS MEASURED THE SAME WAY, once per consumer-only mechanism, - * and the discriminating result is that the handbook half stays green -- a + * and the discriminating result is that the KITT half stays green -- a * check that went all-red would not have told us which half it was exercising: * * `readVerbatim`'s consumer candidate removed -> 5 consumer cases fail, - * 5 handbook cases pass + * 5 KITT cases pass * the `P=` fallback removed from SKILL.md:23 -> 5 consumer cases fail, - * 5 handbook cases pass + * 5 KITT cases pass * * The third is reached by changing the fixture rather than the document, which * is the honest shape of that one: the staging is authored here, so it holds @@ -89,7 +89,7 @@ import { fileURLToPath } from "node:url"; import { spawnSync } from "node:child_process"; const HERE = dirname(fileURLToPath(import.meta.url)); -// `../..` is `core/` in the handbook and the repository root in a consumer, so +// `../..` is `core/` in KITT and the repository root in a consumer, so // one relative path reaches the skill in both payload layouts. const PAYLOAD = resolve(HERE, "..", ".."); const SKILL = join(PAYLOAD, ".claude/skills/plan-review-loop/SKILL.md"); @@ -206,13 +206,13 @@ const neverSpawns = (cmd) => (/--prompt-only|--dry-run/.test(cmd) ? cmd : `${cmd * passing. */ const LAYOUTS = [ - { name: "handbook", prefix: "core" }, + { name: "KITT", prefix: "core" }, { name: "consumer", prefix: "" }, ]; function fixture({ stage, layout }) { const root = mkdtempSync(join(tmpdir(), "recipes-")); - // `core/` in the handbook, nothing in a consumer -- the one difference the + // `core/` in KITT, nothing in a consumer -- the one difference the // sync makes, and the whole point of running every recipe twice. const at = (rel) => join(root, layout.prefix, rel); mkdirSync(join(root, layout.prefix || "."), { recursive: true }); diff --git a/scripts/__tests__/plan-review.test.mjs b/scripts/__tests__/plan-review.test.mjs index 7c296c1..11a7692 100644 --- a/scripts/__tests__/plan-review.test.mjs +++ b/scripts/__tests__/plan-review.test.mjs @@ -1,4 +1,4 @@ -// SYNCED FROM AI-Handbook — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change the handbook instead. +// SYNCED FROM KITT — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change KITT instead. /** * The planning loop's suite. * @@ -192,7 +192,7 @@ test("a missing contract refuses and names both attempts", () => { test("the sync banner is stripped, so the package does not open with a do-not-edit notice", () => { const root = fixtureRoot(); const abs = join(root, `core/${CONTRACT_PATH}`); - writeFileSync(abs, "\n\n# The planning contract\n"); + writeFileSync(abs, "\n\n# The planning contract\n"); assert.equal(readVerbatim(CONTRACT_PATH, root).text.startsWith("# The planning contract"), true); drop(root); }); diff --git a/scripts/__tests__/review-proxy.test.mjs b/scripts/__tests__/review-proxy.test.mjs index 6652d8a..ae49f80 100644 --- a/scripts/__tests__/review-proxy.test.mjs +++ b/scripts/__tests__/review-proxy.test.mjs @@ -1,4 +1,4 @@ -// SYNCED FROM AI-Handbook — do not edit in a consumer repo. +// SYNCED FROM KITT — do not edit in a consumer repo. /** * The review proxy's tests, rewritten for the advisory model (#96, 2026-09-17). * diff --git a/scripts/__tests__/sweep-scope.test.mjs b/scripts/__tests__/sweep-scope.test.mjs index 7a4c3fe..007b54e 100644 --- a/scripts/__tests__/sweep-scope.test.mjs +++ b/scripts/__tests__/sweep-scope.test.mjs @@ -1,4 +1,4 @@ -// SYNCED FROM AI-Handbook — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change the handbook instead. +// SYNCED FROM KITT — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change KITT instead. import test from "node:test"; import assert from "node:assert/strict"; import { mkdtempSync, mkdirSync, writeFileSync, readdirSync } from "node:fs"; @@ -77,7 +77,7 @@ test("scope is git's tracked payload markdown plus the root files, and the direc for (const r of ROOT_FILES) assert.ok(files.includes(r), r); for (const d of ALWAYS_IN_SCOPE) assert.ok(files.some((f) => f.startsWith("core/" + d)), d); assert.ok(!files.includes("untracked.md"), "untracked files are not corpus"); - assert.ok(!files.includes("docs/not-payload.md"), "handbook-root docs outside the payload are not scope by default"); + assert.ok(!files.includes("docs/not-payload.md"), "KITT-root docs outside the payload are not scope by default"); assert.ok(files.includes("core/docs/tests/uat-doc-format.md"), "the shipped UAT format is payload"); assert.ok(!files.includes("docs/tests/TESTING.md") && !files.includes("docs/tests/UAT/PR1_X_UAT.md"), "the rest of docs/tests/ is not"); assert.ok(!files.some((f) => f.endsWith(".mjs")), "prose only"); diff --git a/scripts/__tests__/sync-project-fields.test.mjs b/scripts/__tests__/sync-project-fields.test.mjs index 84841c7..3644ee0 100644 --- a/scripts/__tests__/sync-project-fields.test.mjs +++ b/scripts/__tests__/sync-project-fields.test.mjs @@ -1,4 +1,4 @@ -// SYNCED FROM AI-Handbook — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change the handbook instead. +// SYNCED FROM KITT — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change KITT instead. import { test } from "node:test"; import assert from "node:assert/strict"; import { diff --git a/scripts/build-report.mjs b/scripts/build-report.mjs index ab7baf3..7a15a46 100644 --- a/scripts/build-report.mjs +++ b/scripts/build-report.mjs @@ -1,5 +1,5 @@ #!/usr/bin/env node -// SYNCED FROM AI-Handbook — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change the handbook instead. +// SYNCED FROM KITT — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change KITT instead. /** * The build report: one independent, plain-English account per unit of work * (David, 2026-10-21, replacing the per-round translation of #36). @@ -203,7 +203,7 @@ export function buildBrief({ // EVERY NUMBER CARRIES ITS TITLE, OR THE BRIEF REFUSES. The coordinates // recorded here are printed back to David as the report's *Evidence* line, // and a bare number tells him nothing (claude-core.md, interaction rule 14; - // AI-Handbook #241's build report named this line as the one bare-number + // KITT #241's build report named this line as the one bare-number // line nobody in the loop writes). The script fetches nothing from GitHub, // so the titles arrive from the builder, who holds them; a missing one is // refused rather than printed as a gap, since a report that reads @@ -520,7 +520,7 @@ export function chatReport(report, { askedModel = null, session = null, coords = "**Spend**", "", `- This build: ${a.spend.build_total ?? "*no Spend so far line on the issue*"}`, - `- Paid AI runs, last seven days: ${a.spend.paid_runs_this_week ?? "*no paid-run ledger in the handbook yet*"}`, + `- Paid AI runs, last seven days: ${a.spend.paid_runs_this_week ?? "*no paid-run ledger in KITT yet*"}`, ); out.push( diff --git a/scripts/check-docs-accuracy.mjs b/scripts/check-docs-accuracy.mjs index bf417b0..80d6dc1 100644 --- a/scripts/check-docs-accuracy.mjs +++ b/scripts/check-docs-accuracy.mjs @@ -1,5 +1,5 @@ #!/usr/bin/env node -// SYNCED FROM AI-Handbook — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change the handbook instead. +// SYNCED FROM KITT — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change KITT instead. // Docs-accuracy gate for the repo-native agent context system. // // Two checks, run over the shared context docs: @@ -43,7 +43,7 @@ const LINK_ONLY_DIRS = [".claude/skills"]; // and why, at the time, and is never edited afterwards. When a decision retires // a document, every older entry that linked to it becomes a dead link BY // DESIGN -- there is nothing to repair without rewriting history. It is also -// consumer-owned: it does not exist in this repository at all, so the handbook +// consumer-owned: it does not exist in this repository at all, so KITT // cannot fix its citations even in principle. Both passes are exempt for it. // // NOTHING ELSE IS EXEMPT, and one near-miss is worth recording. An earlier @@ -52,7 +52,7 @@ const LINK_ONLY_DIRS = [".claude/skills"]; // happened rather than where a file is. Measured on a rehearsal of the first // consumer cutover, that file names 41 checkable paths: 37 are LIVE paths in // the consumer, which entries actively send an agent to go and read, and 4 -// were retired handbook scripts. The exemption would have switched off 37 real +// were retired KITT scripts. The exemption would have switched off 37 real // checks to permit 4 -- in the consumer, which is the only repository where // this check runs against that file. The four are written without backticks // instead, per the convention now stated in that file's own header. diff --git a/scripts/check-uat-format.mjs b/scripts/check-uat-format.mjs index 57f111d..05d0fef 100644 --- a/scripts/check-uat-format.mjs +++ b/scripts/check-uat-format.mjs @@ -1,5 +1,5 @@ #!/usr/bin/env node -// SYNCED FROM AI-Handbook — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change the handbook instead. +// SYNCED FROM KITT — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change KITT instead. // UAT format guard. // // `/uat` drives a run by enumerating `#### ` headings inside `### Steps` and diff --git a/scripts/machinery.mjs b/scripts/machinery.mjs index 7125517..b1704ee 100644 --- a/scripts/machinery.mjs +++ b/scripts/machinery.mjs @@ -1,5 +1,5 @@ #!/usr/bin/env node -// SYNCED FROM AI-Handbook — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change the handbook instead. +// SYNCED FROM KITT — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change KITT instead. /** * The small shared module: this repository's machinery configuration, and the * dependency-free schema validator both dispatched roles answer through. @@ -33,8 +33,8 @@ export const MACHINERY_CONFIG_FILE = ".agents/machinery.json"; * * WHY NOT `dirname(script)/..`, WHICH THIS REPLACES. That form assumes the * scripts sit exactly one level below the root. True in a consumer, where the - * sync lands them at `/scripts/`; false in the handbook, where they are - * payload at `/core/scripts/` and `..` is `core/`. So the handbook read + * sync lands them at `/scripts/`; false in KITT, where they are + * payload at `/core/scripts/` and `..` is `core/`. So KITT read * a configuration that is not there -- `core/.agents/machinery.json` does not * exist -- and wrote its artifacts INSIDE its own payload, where a sync would * carry one repository's history to every other. @@ -226,7 +226,7 @@ export function repoSlug(io = nodeIo()) { } /** - * Where the fleet's paid-run ledger lives: the handbook's own repository. + * Where the fleet's paid-run ledger lives: KITT's own repository. * * A FLEET FACT, NOT THIS CHECKOUT'S IDENTITY, which is why it is a constant * here rather than a field in `.agents/machinery.json`: that file is seeded @@ -235,7 +235,7 @@ export function repoSlug(io = nodeIo()) { * products."), so every product must read and write the same issue. * (`uat-doc-format.md`, *Lanes*.) */ -export const PAID_RUN_LEDGER_REPO = "TheAnswerManIsHere/AI-Handbook"; +export const PAID_RUN_LEDGER_REPO = "TheAnswerManIsHere/KITT"; // --------------------------------------------------------------------------- // Agent-definition frontmatter @@ -249,7 +249,7 @@ export const PAID_RUN_LEDGER_REPO = "TheAnswerManIsHere/AI-Handbook"; * equal to the pin; `review-proxy.mjs` reads the declared effort to say, in an * assessment's header, what the role actually runs at. Those are the two ends * of one fact, and a second copy of the reader is a second thing to drift -- - * the failure this whole area is about. The handbook-only checker can import + * the failure this whole area is about. KITT-only checker can import * payload code; payload code cannot import the checker, so the shared copy * lives here. (Both assessors, #131 round 1.) * @@ -332,7 +332,7 @@ export function claudeAlias(id) { * One key from an agent definition, or null if anything at all is in the way. * * THE PATH IS THE SAME IN BOTH LAYOUTS. `.claude/agents/.md` is a real - * file in a consumer and a per-file symlink into `core/` in the handbook, so + * file in a consumer and a per-file symlink into `core/` in KITT, so * one relative path resolves in both -- which is why this does not need the * `core/scripts` vs `scripts` dance `INVOCATION` does. * @@ -643,7 +643,7 @@ export function runCodex({ prompt, outFile, model, effort, sandbox, cwd, timeout // review emitting verbose events would die before its answer and its // turn.completed event were written. Inherited stdout had no ceiling; // this one is set well above any event stream a round has produced. - // (Codex, AI-Handbook #199 round 1.) + // (Codex, KITT #199 round 1.) maxBuffer: CODEX_EVENTS_MAX_BUFFER, }); const events = typeof result.stdout === "string" ? result.stdout : ""; @@ -685,7 +685,7 @@ export function codexUsage(jsonl) { // rerouted: -> ()", not as an event of its own, and // the later turn.completed carries counters only. Priced at Astra's rates // they would be the wrong model's spend, so the reading is withheld. - // (Codex, AI-Handbook #199 round 3, `4243932759`; #197 item 5.) + // (Codex, KITT #199 round 3, `4243932759`; #197 item 5.) if (ev?.type === "item.completed" && typeof ev.item?.message === "string" && /^model rerouted:/i.test(ev.item.message)) rerouted = true; } if (!usage || rerouted) return null; @@ -693,14 +693,14 @@ export function codexUsage(jsonl) { // non-negative number makes the whole reading null -- `unable to verify` in // the spend line -- never a zero that prices the run confidently low. The // CLI is installed unpinned, so a schema change is a real path, not a - // hypothetical. (Codex, AI-Handbook #199 round 2.) + // hypothetical. (Codex, KITT #199 round 2.) const keys = ["input_tokens", "cached_input_tokens", "cache_write_input_tokens", "output_tokens", "reasoning_output_tokens"]; if (!keys.every((k) => Number.isFinite(usage[k]) && usage[k] >= 0)) return null; // ALL ZERO IS NO READING. The CLI emits `Usage::default()` -- every bucket // 0 -- on a turn that completed without any token-usage notification, and a // run that read a prompt cannot have consumed zero input tokens. So the // all-zero object is the CLI saying "none", never a $0 run. (Codex, - // AI-Handbook #199 round 3, `4243932761`; #197 item 4.) + // KITT #199 round 3, `4243932761`; #197 item 4.) if (keys.every((k) => usage[k] === 0)) return null; return { input: usage.input_tokens, diff --git a/scripts/map-eval.mjs b/scripts/map-eval.mjs index a47535f..efe7782 100644 --- a/scripts/map-eval.mjs +++ b/scripts/map-eval.mjs @@ -1,5 +1,5 @@ #!/usr/bin/env node -// SYNCED FROM AI-Handbook — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change the handbook instead. +// SYNCED FROM KITT — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change KITT instead. // map-eval.mjs — the eval that decides whether the map earns its keep. // // Protocol: docs/ai-context/agent-legible-codebase-eval.md. This script does @@ -358,7 +358,7 @@ function relationKey(ts, root, svcs, name) { function readJson(root, rel) { const p = join(root, rel); - if (!existsSync(p)) fail(`${rel} is missing`, "run the handbook sync to seed it, then complete it"); + if (!existsSync(p)) fail(`${rel} is missing`, "run the KITT sync to seed it, then complete it"); return JSON.parse(readFileSync(p, "utf8")); } diff --git a/scripts/map.mjs b/scripts/map.mjs index 1d41a40..ced9352 100644 --- a/scripts/map.mjs +++ b/scripts/map.mjs @@ -1,5 +1,5 @@ #!/usr/bin/env node -// SYNCED FROM AI-Handbook — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change the handbook instead. +// SYNCED FROM KITT — do not edit in a consumer repo. Local edits are overwritten by the next sync and their reasoning is lost; change KITT instead. // map.mjs — the agent-legible codebase tool. // // Builds a structural index of this repository from its own TypeScript @@ -319,8 +319,10 @@ export function formatAnswer({ banners = [], title, resolved = [], unresolved = return out.join("\n"); } -/** The same header line the sync recognises, within the same window. */ -const BANNER_LINE = /^[ \t]*(?: