Compare commits

..
Author SHA1 Message Date
Frank a550db6027 Merge remote-tracking branch 'origin/main'
# Conflicts:
#	AGENTS.md
#	agent/config.yml
#	omp-docs/log.md
2026-10-18 16:47:37 -07:00
Frank 3713339ffc chore: adopt pre-existing working-tree state before trunk merge
Uncommitted machine/session edits (live config, models, docs drift) were
blocking the merge of origin/main. Committed as-is to preserve them; the
merge that follows resolves overlapping prose files toward upstream
canonical, with local variants recoverable from this commit. Pre-merge
copies also in .AGENTTRASH/pre-merge-2026-10-18/.
2026-10-18 16:46:57 -07:00
dank 5a3d563a22 Merge pull request 'docs: attribution footer for machine-opened issues and PRs' (#14) from docs/session-trailer-rule into main 2026-10-18 16:46:00 -07:00
Frank 942787f0f2 docs: pin cwd meaning in attribution footer
First dogfooding round stamped the build worktree instead of the session's
own working directory (the value the paired session id resolves to). Rule
now says so explicitly. Refs #11
2026-10-18 16:40:14 -07:00
Frank 8fb357b483 docs: attribution footer for machine-opened issues and PRs
Every agent-opened issue/PR body ends with cwd + omp session id so machine
filed artifacts trace back to the box and session that produced them - the
live-sync daemon and filing agents make 'who/what wrote this' a real
question now. Mirrored in dank/serverAppConfigs by its own PR.

Refs #11
2026-10-18 16:32:48 -07:00
dank 72bcbd989e Merge pull request 'chore: re-sync agent skills to upstream mattpocock/skills' (#13) from chore/skills-upstream-sync into main 2026-10-18 16:30:02 -07:00
dank 964bd06073 Merge pull request 'feat: live-sync heartbeat for machine-written paths' (#12) from feat/11-live-sync into main 2026-10-18 16:28:57 -07:00
Frank 0edae3323d chore: re-sync agent skills to upstream mattpocock/skills
Local snapshots dated 2026-09-16; upstream has moved on since. Refreshes
7 SKILL.md files (code-review, diagnosing-bugs, implement, tdd, grilling,
handoff, teach): tracker-doc references generalized, CONTEXT.md renamed
GLOSSARY.md, implement gains ticket-fetch step + Skill-tool invocation,
grilling question wording rule, handoff names the OS temp dir, teach
workspace-path resolution + quiz answer-position rules, tdd seam notes.
find-skills (vercel-labs) and prototype already current. Skill updates
take effect next session (discovery runs at startup).
2026-10-18 16:14:29 -07:00
Frank 8702f3058d chore: re-sync agent skills to upstream mattpocock/skills
Local snapshots dated 2026-09-16; upstream has moved on since. Refreshes
7 SKILL.md files (code-review, diagnosing-bugs, implement, tdd, grilling,
handoff, teach): tracker-doc references generalized, CONTEXT.md renamed
GLOSSARY.md, implement gains ticket-fetch step + Skill-tool invocation,
grilling question wording rule, handoff names the OS temp dir, teach
workspace-path resolution + quiz answer-position rules, tdd seam notes.
find-skills (vercel-labs) and prototype already current. Skill updates
take effect next session (discovery runs at startup).
2026-10-18 14:57:20 -07:00
11 changed files with 181 additions and 93 deletions

No files matched your search

+5
View File
@@ -36,6 +36,11 @@ with YAML frontmatter, spec at `omp-docs/references/okf-spec.md`).
stay visible in history. **Never merge a PR without an explicit OK from Frank.**
- **The moment a PR is open, open it in Frank's browser** — `xdg-open <PR-URL>`
lands a tab in his Firefox; never make him hunt for it in Gitea.
- **Attribution footer (issues and PRs)** — every issue or PR body you open ends
with a `---` line, then `cwd: <working directory> · session: <omp session id>`
(session id from `/status`; `cwd` is that session's own working directory —
not the build checkout, when they differ). Machine-made artifacts stay attributable to the
box and session that spawned them.
- Releases: tag `vX.Y.Z` straight on `main` after verifying; tags are the deploy
markers every other machine pulls to. Hotfixes are ordinary branches off the
tag you are fixing forward from.
+68 -19
View File
@@ -1,5 +1,6 @@
providers:
openrouterVariant: floor
openrouterVariant: online
fetch: auto
modelRoles:
slow: llamacpp (dankclaw)/frank-dragoon:medium
vision: llamacpp (dankclaw-3090)/frank-zealot:xhigh
@@ -19,8 +20,9 @@ modelRoles:
symbolPreset: nerd
composer:
shape: band
tokenRate: true
theme:
dark: dark-terminal
dark: dark-gruvbox
light: light
setupVersion: 2
browser:
@@ -57,8 +59,7 @@ retry:
- openai-codex/gpt-5.5
- xai-oauth/grok-4.5
- web/ollama
speech:
[]
speech: []
llamacpp (dankserver)/frank-archon:
- llamacpp (dankclaw)/frank-dragoon
maxRetries: 10
@@ -67,7 +68,7 @@ searxng:
exa:
enabled: false
memory:
backend: local
backend: sharpshooter
autolearn:
enabled: true
autoContinue: true
@@ -75,12 +76,12 @@ compaction:
remoteEndpoint: http://192.168.0.143:7771/v1/chat/completions
methodOrder:
- shake
- snapcompact
- soft
- handoff
- snapcompact
- remote
idleThresholdTokens: 100000
thresholdPercent: 85
thresholdPercent: 95
idleEnabled: true
thresholdTokens: -1
dropUseless: false
@@ -90,13 +91,12 @@ compaction:
enabled: true
experimentalContextManagement: false
interruptMode: immediate
defaultThinkingLevel: medium
defaultThinkingLevel: xhigh
hideThinkingBlock: false
proseOnlyThinking: true
proseOnlyThinking: false
terminal:
showProgress: true
disabledExtensions:
[]
disabledExtensions: []
statusLine:
separator: powerline
preset: custom
@@ -135,24 +135,31 @@ tui:
codexResetFireworks: false
hyperlinks: auto
tight: true
resizeScrollback: rebuild
titleSpinner: pulse
display:
shimmer: kitt
smoothStreaming: true
showTokenUsage: true
pinnedAgents: collapsed
subagentLivePreview: true
task:
showResolvedModelBadge: true
maxConcurrency: 3
agentModelOverrides:
designer: llamacpp (dankclaw-3090)/frank-zealot
librarian: llamacpp (dankclaw-3090)/frank-zealot
reviewer: llamacpp (dankclaw-3090)/frank-zealot
scout: llamacpp (dankclaw-3090)/frank-zealot
security-reviewer: llamacpp (dankclaw-3090)/frank-zealot
reviewer: llamacpp (dankserver)/frank-archon
scout: llamacpp (dankserver)/frank-archon
security-reviewer: llamacpp (dankclaw)/frank-dragoon
sonic: llamacpp (dankclaw-3090)/frank-zealot
task: llamacpp (dankclaw-3090)/frank-zealot
task: llamacpp (dankserver)/frank-archon
eager: default
enableLsp: true
snapcompact:
systemPrompt: none
toolResults: false
shape: auto
extendedContext: false
ttsr:
contextMode: discard
@@ -162,12 +169,12 @@ checkpoint:
enabled: true
readLineNumbers: true
startup:
showSplash: false
showSplash: true
changelogMode: summary
update:
channel: stable
features:
unexpectedStopDetection: smart
unexpectedStopDetection: mechanical
stt:
submitTrigger: say-submit
enabled: true
@@ -186,6 +193,7 @@ images:
- litterbox
edit:
mode: hashline
fuzzyThreshold: 0.9
dev:
autoqaConsent: granted
astGrep:
@@ -195,7 +203,7 @@ vault:
tts:
localVoice: bm_george
speech:
enabled: false
enabled: true
mode: yield
enhanced: true
voice: am_fenrir
@@ -204,6 +212,9 @@ secrets:
read:
renderMarkdown: true
toolResultPreview: true
defaultLimit: 1000
summarize:
prose: false
lsp:
formatOnWrite: true
diagnosticsOnEdit: true
@@ -213,4 +224,42 @@ speechgen:
live:
voice: vale
contextPromotion:
enabled: true
enabled: true
title:
icons: emoji
generator: tiny
followUpMode: one-at-a-time
tools:
approvalMode: yolo
format: auto
marketplace:
autoUpdate: notify
bash:
allowCompoundCommands: true
gitGuard: true
bashInterceptor:
enabled: false
shellMinimizer:
sourceOutlineLevel: default
generate_image:
enabled: false
computer:
enabled: true
display: active
ratchet:
enabled: true
github:
enabled: true
security:
enabled: true
todo:
reminders: true
mcp:
notifications: false
plan:
defaultOnStartup: false
isolation:
backend: auto
worktree:
onStart: create
onExit: keep
+86 -62
View File
@@ -16,9 +16,9 @@ providers:
auth: none
models:
- id: frank-archon
# Model id renamed from frank-primary on 2026-10-08 (official
# Model id renamed from frank-archon on 2026-10-08 (official
# unit-name scheme; the systemd service, scripts and runbooks keep
# the frank-primary name — service names are unchanged).
# the frank-archon name — service names are unchanged).
# Server-side compaction routes to compaction.remoteEndpoint in
# config.yml (192.168.0.143:7771 — frank-zealot's 3090); the
# compactionModel candidate keeps the wire model id valid there.
@@ -29,12 +29,12 @@ providers:
# radiance (StillDeadcode, Apache-2.0) from the digest-pinned
# stilldeadcode/radiance image (index digest sha256:4c3f4845..., 287
# MiB, kernels prebuilt for gfx1201), plain `podman run` through
# scripts/serve-frank-primary.sh, root unit (User=dank, dank's
# scripts/serve-frank-archon.sh, root unit (User=dank, dank's
# rootless podman storage). Serving the OFFICIAL
# Qwen/Qwen3.8-Flash-Next-FP8 at NATIVE modelopt block-FP8
# precision — a rad-convert no-recipe pure copy into
# qwen4exp-fp8-native.rad (172.76 GiB measured by plan-only), built by
# scripts/build-frank-primary-rad.sh against a staging dir whose
# scripts/build-frank-archon-rad.sh against a staging dir whose
# config.json drops quantization_config so the shipped qwen4exp
# plugin's (qwen4exp, "") selection key matches; per-weight
# encodings are untouched. Experts stream from a 40 GiB/rank
@@ -44,7 +44,7 @@ providers:
# froggeric's fixed qwen3.8 v22.5
# (scripts/qwen38-froggeric-v22.5.jinja) via
# --override-chat-template. Rollback: git tag
# frank-primary-freetoken-pr587-20261005 (FreeToken, one card).
# frank-archon-freetoken-pr587-20261005 (FreeToken, one card).
contextWindow: 200000
# maxTokens must survive the harness compaction gap AND the chars/4
# token-estimate under-run on code-heavy prompts. The clamp is
@@ -96,8 +96,8 @@ providers:
auth: none
models:
- id: frank-dragoon
# Model id renamed from frank-large on 2026-10-08 (official
# unit-name scheme; the service/unit/scripts keep the frank-large
# Model id renamed from frank-dragoon on 2026-10-08 (official
# unit-name scheme; the service/unit/scripts keep the frank-dragoon
# name — service names are unchanged).
name: "frank-dragoon (dankclaw-gpu)"
# Server-side compaction runs on the compaction.remoteEndpoint in
@@ -107,37 +107,45 @@ providers:
compactionModel: llamacpp (dankclaw-3090)/frank-zealot
# halogen-flash-server 0.16.2 (ghcr.io/peonist-ai/
# halogen-flash-server@sha256:0c61bf84, digest-pinned) serving the
# Quat3rnion ABLITERATED Swift1.5 finetune of peonist's
# Qwen3.8-Flash-Next v2 checkpoint (qwen38-flash-next-v2-swift15-
# abliterated.hgn, ~62 GiB resident, + REQUIRED n-gram table +
# vision tower) on the Strix Halo iGPU: TWO slots at
# HALOGEN_CTX=262144 each with the MTP head ALWAYS ON
# Quat3rnion NATIVE v2 ABLITERATED conversion of orcarouter's pinned
# BF16 Qwen3.8-Flash-Next (qwen38-flash-next-v2-abliterated.hgn,
# ~62 GiB resident, + REQUIRED n-gram table + vision tower, both
# hardlinked from the swift15 dir) on the Strix Halo iGPU: TWO slots
# over ONE 401,408-position KV pool (= 2 x ctx, raised 2026-10-18) at
# HALOGEN_CTX=200704 (the ceiling lowered from the card's 262,144 on
# 2026-10-17; ~10.8 GiB reserved where 200,704 cost 5.5, 262,144 cost
# 7.2 and 524,288 measured 14.6), with the MTP head ALWAYS ON
# (HALOGEN_SPEC_ADAPT=0 — the default adaptive policy halves
# decode). Card: 53-57 t/s greedy, ~1,640 t/s prefill at 34k, ~72%
# fewer thinking tokens than the censored 27B. ABLITERATED base
# (refusals should not return) and VISION ON (OpenAI image_url
# decode). Measured 2026-10-17: 50 t/s greedy decode, 1,604 t/s
# cold prefill at 59k, NIAH 18/18. ABLITERATED base (no refusals:
# 0/5 on the hostile census) and VISION ON (OpenAI image_url
# parts; >=256 px images or it answers "video"). Runbook:
# serverAppConfigs-docs/LLM/frank-large-flash-server-v2-swift15.md.
# Per-SLOT window the harness may fill — deliberately BELOW the
# engine ceiling (HALOGEN_CTX=262144): the clamp below leaves a
# 45k gap that absorbs the estimate error.
contextWindow: 217088
# serverAppConfigs-docs/LLM/frank-dragoon-flash-server-v2-native.md.
# Window the harness may fill — deliberately BELOW the engine
# ceiling (HALOGEN_CTX=200704, lowered from 262,144 on 2026-10-17):
# the clamp below leaves the 45k gap that absorbs the estimate error.
# Both slots SHARE one 401,408-position KV pool — exactly two full
# windows — so TWO maximum-length conversations can be resident at the
# same time (at the old pool == ctx 200,704 only two of <=100k could).
# The per-request ceiling is unchanged, so this window is unchanged.
contextWindow: 155648
# The clamp is max_tokens = min(maxTokens, contextWindow − est −
# 4096); the chars/4 est UNDER-counts the rendered prompt by ~3 %
# on code/agent traffic (measured 2026-10-07: est 152,938 ->
# server 157,388). Worst-case request = ctx − 4096 + 3 % est
# error ≈ 219k, inside the 262,144 engine ceiling with ~43k
# margin (robust to a 10 % under-count). Compaction fires at 85 %
# of the window = 184,524 est ≈ 190k measured (Frank's 180k
# target) and rides on frank-zealot: input ≈ threshold −
# keepRecent(20k) ≈ 170k, inside its 200,704 slot.
# HALOGEN_MAX_TOKENS_CAP in frank-large.env must stay >= this.
# server 157,388). Worst-case request = window − 4096 + 3 % est
# error ≈ 156.2k, inside the 200,704 engine ceiling with ~44k
# margin (robust to a ~25 % under-count). Compaction fires at 85 %
# of the window = 132,300 est ≈ 136k measured — the 180k target of
# the 262,144 era is unreachable now (the window itself is 155,648)
# — and rides on frank-zealot: input ≈ threshold − keepRecent(20k)
# ≈ 112k, inside its 200,704 slot.
# HALOGEN_MAX_TOKENS_CAP in frank-dragoon.env must stay >= this.
maxTokens: 45056
reasoning: true
# VISION ON as of 2026-10-06: the v2 vision tower loads beside the
# checkpoint (HALOGEN_VISION_TOWER; red-PNG probe verified on the
# card). image_url content parts only — the legacy top-level
# images field is the frank-secondary trap, do not repeat it here.
# images field is the frank-zealot trap, do not repeat it here.
input: [text, image]
compat:
# flash-server emits thinking as `reasoning_content` — same
@@ -155,7 +163,7 @@ providers:
max: xhigh
# The card's thinking recipe, on the wire. The flash-server
# engine HAS a server-side sampler (HALOGEN_TEMPERATURE/TOP_P/
# TOP_K = 1.0 / 0.95 / 20 in frank-large.env) — these match it,
# TOP_K = 1.0 / 0.95 / 20 in frank-dragoon.env) — these match it,
# so per-request values are consistent, not load-bearing.
extraBody:
temperature: 1.0
@@ -167,35 +175,47 @@ providers:
auth: none
models:
- id: frank-zealot
# Model id renamed from frank-secondary on 2026-10-08 (official
# Model id renamed from frank-zealot on 2026-10-08 (official
# unit-name scheme; the service/unit/scripts keep the
# frank-secondary name — service names are unchanged).
# frank-zealot name — service names are unchanged).
name: "frank-zealot (dankclaw-3090)"
# Server-side compaction routes to compaction.remoteEndpoint in
# config.yml (192.168.0.143:7771 — this endpoint); the
# compactionModel candidate keeps the wire model id valid there.
compactionModel: llamacpp (dankclaw-3090)/frank-zealot
# Dankclaw's RTX 3090: llama.cpp (master, CUDA sm_86 build) serving
# HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive at Q6_K
# (7,359,259,008 B) — qwen35 dense hybrid (32 layers: 8 full-attention
# + 24 Gated DeltaNet, 4 KV heads x 256 dim, native 262,144), TWO
# conversations (--ctx-size 401408 / --parallel 2) at Frank's 200k cap
# each. Exact KV: f16 K + f16 V. Vision via the publisher's OWN
# BF16 mmproj (921,704,448 B) — the model is natively multimodal.
# **MTP IS OFF** because the file carries no nextn/mtp tensors —
# SPEC_TYPE=none strips both spec flags. Priced from the MiMo Q6_K
# boots at this geometry (21,276/2,849 at ubatch 1024; 21,846/2,279 at
# 2048). 2026-10-07 (late) swap from Gemma4-26B-A4B Q4_K_M (1x200,704).
# Runbook:
# serverAppConfigs-docs/LLM/frank-secondary-llama-qwen35-9b-q6k-2x200704.md.
# contextWindow is the PER-SLOT window (Frank's cap): a longer
# prompt needs compaction.
contextWindow: 200704
# Dankclaw's RTX 3090: llama.cpp PrismML fork build (vendor 10777,
# commit e3de71522 — the ONLY loader for this payload's custom tensor
# type 142 + prism.hadamard.* metadata, and the minimum build that
# pairs MTP with a quantized V cache) serving
# prism-ml/Ternary-Bonsai-2-9B-gguf at PQ2_0 (2,675,410,720 B) WITH the
# MTP head in the file — qwen35 hybrid, 32 layers (8 full-attention +
# 24 Gated DeltaNet), 4 KV heads x 256 dim, native 262,144 — in THREE
# conversations (--ctx-size 786432 / --parallel 3), each slot at the
# model's TRAINED window.
# KV is q8_0 K + q8_0 V (17 KiB/token over the 8 full layers =
# 13,056 MiB pool, ledger-exact); f16 KV would bill 26,112 MiB and
# cannot boot this card. Boot ledger 17,876 used / 6,249 free. Vision
# through the publisher's Q8_0 mmproj (624,229,664 B — Q8_0 is the
# publisher's requirement for concurrent image requests), whose
# worst-case lands outside the engine's fit projection. **MTP OFF —
# measured, not assumed**: the draft context bills its own f16 KV over
# the WHOLE pool (3,072 MiB) and at ubatch 2048 that squeeze halves
# decode (167.2 → 109.2 t/s); SPEC_TYPE=draft-mtp + UBATCH_SIZE=1024 is
# the 213.5 t/s arm if the card ever has room. 2026-10-18 swap from
# Ternary-Bonsai-2-27B PQ2_0 at 2 × 200,704. Measured: 167.2 t/s
# single-stream greedy decode, 280.2 t/s across three concurrent
# streams, 2,877 t/s prefill at 106,418. Base-alignment: censored base
# lineage; unlike the 27B there is NO CRACK re-export matching this
# file. Runbook:
# serverAppConfigs-docs/LLM/frank-zealot-llama-prism-bonsai9-mtp.md.
# contextWindow is the PER-SLOT window (= the native 262,144): a longer
# prompt needs compaction — llama.cpp answers a 400, never truncates.
contextWindow: 262144
# Prompt + budget must fit inside the slot window; thinking counts
# against the budget. Compaction fires at 85 % of the window =
# 170,598 est; worst-case prompt + budget ≈ 170,598 × 1.03 +
# 16,384 ≈ 192,100 ≤ 200,704 — a longer prompt is a 400 naming
# the limit, never a truncation.
# 222,822 est; worst-case prompt + budget ≈ 222,822 × 1.03 +
# 16,384 ≈ 245,891 ≤ 262,144. This endpoint is the fleet's
# compaction hub: the widest window in the fleet.
maxTokens: 16384
reasoning: true
input: [text, image]
@@ -204,29 +224,33 @@ providers:
# `reasoning_content` — the same field the MiMo/Ornith eras used;
# harness reads unchanged.
reasoningContentField: "reasoning_content"
# The Qwen3.5 chat template has NO reasoning_effort variable (unlike
# the Qwen3.8-template endpoints, where an unmapped level is a hard
# Jinja raise). llama.cpp passes chat_template_kwargs through to
# Jinja, and Jinja ignores variables a template never reads — so the
# map is inert here, kept so role-level overrides resolve identically
# across the fleet.
# Bonsai-2's template DOES read reasoning_effort (the Qwen3.5-9B
# template did not — the map used to be inert here): it accepts ONLY
# xhigh (default), medium, low and calls raise_exception on anything
# else, so an unmapped harness level is a hard HTTP 500 on the role's
# first request, naming Jinja and not the model. The fold below is
# therefore load-bearing, identical to the frank-archon/dragoon law.
# llama.cpp passes chat_template_kwargs through to Jinja.
reasoningEffortMap:
minimal: low
low: low
medium: medium
high: xhigh
max: xhigh
# The Qwen3.5 publisher recipe (model card, thinking mode):
# temperature 0.6 / top_p 0.95 / top_k 20 / min_p 0. Non-thinking
# mode is 0.7/0.8/20/0 — the harness runs thinking mode.
# The payload's OWN sampling metadata (general.sampling.* in the
# GGUF): temperature 1.0 / top_p 0.95 / top_k 20 — thinking-mode
# recipe, the same trio the other Qwen3.8-family endpoints carry.
# (The old 0.6 was the Qwen3.5-9B publisher's card, not this file.)
# extraBody is merged last and wins over the harness default.
extraBody:
temperature: 0.6
temperature: 1.0
top_p: 0.95
top_k: 20
min_p: 0.0
presence_penalty: 0.0
chat_template_kwargs:
enable_thinking: true
# (no preserve_thinking: that kwarg belongs to the Qwen3.8
# templates; nothing in this template reads it)
# The template DOES read preserve_thinking: when false it drops
# prior assistants' <think> blocks from history. Keep them —
# multi-turn tool traffic on this endpoint is the majority.
preserve_thinking: true
+5 -3
View File
@@ -10,7 +10,7 @@ Two-axis review of the diff between `HEAD` and a fixed point the user supplies:
Both axes run as **parallel sub-agents** so they don't pollute each other's context, then this skill aggregates their findings.
The issue tracker should have been provided to you. If `docs/agents/issue-tracker.md` is missing, tell the user to run `/setup-matt-pocock-skills`.
The issue tracker should have been provided to you. If not, tell the user to run `/setup-matt-pocock-skills`.
## Process
@@ -26,14 +26,14 @@ Before going further, confirm the fixed point resolves (`git rev-parse <fixed-po
Look for the originating spec, in this order:
1. Issue references in the commit messages (`#123`, `Closes #45`, GitLab `!67`, etc.), fetched via the workflow in `docs/agents/issue-tracker.md`.
1. Issue references in the commit messages (`#123`, `Closes #45`, GitLab `!67`, etc.), fetched via the workflow in the tracker doc.
2. A path the user passed as an argument.
3. A spec file under `docs/`, `specs/`, or `.scratch/` matching the branch name or feature.
4. If nothing is found, ask the user where the spec is. If they say there isn't one, the **Spec** sub-agent will skip and report "no spec available".
### 3. Identify the standards sources
Anything in the repo that documents how code should be written, such as `CODING_STANDARDS.md` or `CONTRIBUTING.md`.
Search the repo for every file that documents how code should be written. When `CODING_STANDARDS.md` or `CONTRIBUTING.md` exists, it must be on the list.
On top of whatever the repo documents, the Standards axis always carries the **smell baseline** below: a fixed set of Fowler code smells (_Refactoring_, ch.3) that applies even when a repo documents nothing. Two rules bind it:
@@ -57,6 +57,8 @@ Each smell reads *what it is* → *how to fix*; match it against the diff:
### 4. Spawn both sub-agents in parallel
Issue both sub-agent calls together, in the foreground, and aggregate the reports they return.
**Standards sub-agent prompt** should include:
- The full diff command and commit list.
+2 -2
View File
@@ -7,7 +7,7 @@ description: Diagnosis loop for hard bugs and performance regressions. Use when
A discipline for hard bugs. Skip phases only when explicitly justified.
When exploring the codebase, read `CONTEXT.md` (if it exists) to get a clear mental model of the relevant modules, and check ADRs in the area you're touching.
When exploring the codebase, read `GLOSSARY.md` (if it exists) to get a clear mental model of the relevant modules, and check ADRs in the area you're touching.
## Redact
@@ -122,7 +122,7 @@ A correct seam is one where the test exercises the **real bug pattern** as it oc
If a correct seam exists:
1. Turn the minimised repro into a failing test at that seam.
2. Watch it fail.
2. Watch it fail. If you forced the red by mutating code or a fixture, `diff` against a pristine copy to prove the mutation landed before you trust it.
3. Apply the fix.
4. Watch it pass.
5. Re-run the Phase 1 feedback loop against the original (un-minimised) scenario.
+2
View File
@@ -21,6 +21,8 @@ Format a round like so:
➡️ <your recommended answer>
```
Word each question so "yes" accepts your recommended answer.
Each round the user answers reshapes the tree: settled decisions push the frontier outward and unblock questions that depended on them. Recompute the frontier and ask the next round. A question whose answer depends on another question still open in this round belongs to a _later_ round, not this one.
Finding _facts_ is your job, never the user's. When a frontier question needs a fact from the environment (filesystem, tools, etc.), dispatch a sub-agent to find it; don't ask the user for anything you could look up yourself. Don't block on it: a running exploration is an unsettled prerequisite, so only the questions downstream of it wait for the sub-agent to report; ask the rest of the frontier now. The _decisions_ are the user's: put each to them and wait.
+1 -1
View File
@@ -5,7 +5,7 @@ argument-hint: "What will the next session be used for?"
disable-model-invocation: true
---
Write a handoff document summarising the current conversation so a fresh agent can continue the work. Save to the temporary directory of the user's OS - not the current workspace.
Write a handoff document summarising the current conversation so a fresh agent can continue the work. Save to the temporary directory of the user's OS (`$TMPDIR`, else `/tmp`; `%TEMP%` on Windows) - not the current workspace.
Include a "suggested skills" section in the document, naming which skills the next agent should call the Skill tool for.
+4 -2
View File
@@ -6,10 +6,12 @@ disable-model-invocation: true
Implement the work described by the user in the spec or tickets.
Use /tdd where possible, at pre-agreed seams.
If the user passes a ticket reference, fetch it from the issue tracker and state its title before starting. If the reference is ambiguous, ask.
Call the Skill tool with "tdd" where possible, at pre-agreed seams.
Run typechecking regularly, single test files regularly, and the full test suite once at the end.
Once done, use /code-review to review the work.
Once done, call the Skill tool with "code-review" to review the work.
Commit your work to the current branch.
+2 -2
View File
@@ -7,7 +7,7 @@ description: Test-driven development. Use when the user wants to build features
TDD is the red → green loop. This skill is the reference that makes that loop produce tests worth keeping: what a good test is, where tests go, the anti-patterns, and the rules of the loop. Every section applies on every cycle: consult them before and during the loop, not after.
When exploring the codebase, read `CONTEXT.md` (if it exists) so test names and interface vocabulary match the project's domain language, and respect ADRs in the area you're touching.
When exploring the codebase, read `GLOSSARY.md` (if it exists) so test names and interface vocabulary match the project's domain language, and respect ADRs in the area you're touching.
## What a good test is
@@ -21,7 +21,7 @@ A **seam** is the public boundary you test at: the interface where you observe b
**Test only at pre-agreed seams.** Before writing any test, write down the seams under test and confirm them with the user. No test is written at an unconfirmed seam. You can't test everything, so agreeing the seams up front is how testing effort lands on the critical paths and complex logic instead of every edge case.
Ask: "What's the public interface, and which seams should we test?"
Ask: "What's the public interface, and which seams should we test?" Give each proposed seam a one-line note on what it catches and what it misses.
When the shape of that interface is itself in question (how deep the module is, where the seam belongs, what the interface should expose), call the Skill tool with "codebase-design" for the vocabulary. It is the shared source of the module, interface, depth, seam, adapter, leverage and locality terms, and it is a reference to consult, not a session to run.
+2 -2
View File
@@ -9,7 +9,7 @@ The user has asked you to teach them something. This is a stateful request - the
## Teaching Workspace
Treat the current directory as a teaching workspace. The state of their learning is captured in this directory in several files:
Treat the current directory as a teaching workspace. Workspace paths (`./lessons/` and the rest) resolve from the directory `/teach` was run in; only the `*-FORMAT.md` links resolve from this skill's folder. The state of their learning is captured in this directory in several files:
- `MISSION.md`: A document capturing the _reason_ the user is interested in the topic. This should be used to ground all teaching. Use the format in [MISSION-FORMAT.md](./MISSION-FORMAT.md).
- `./reference/*.html`: A directory of reference materials. These are the compressed learnings from the lessons - cheat sheets, reference algorithms, syntax, yoga poses, glossaries. They are the raw units of learning. They should be beautiful documents which print out well, and are designed for quick reference.
@@ -107,7 +107,7 @@ For skill acquisition, difficulty is the tool. Effortful retrieval is what build
Each of these should be based on a **feedback loop**, where the user receives feedback on their performance. This feedback loop should be as tight as possible, giving feedback immediately - and ideally automatically.
For quizzes, each answer should be exactly the same number of words (and characters, if possible). Don't give the user any clues about the answer through formatting.
For quizzes, each answer should be exactly the same number of words (and characters, if possible). Vary which position holds the correct answer across questions. Don't give the user any clues about the answer through formatting or order.
## Acquiring Wisdom
+4
View File
@@ -11,6 +11,10 @@ timestamp: 2026-08-28
# Bundle Change Log
## 2026-10-18 — Fleet law: issue/PR attribution footers
Every agent-opened issue and PR body now ends with a `cwd:` + `session:` footer (session id from `/status`), in AGENTS.md of both `dank/command-center` and `dank/serverAppConfigs` (mirrored PRs). Born from the live-sync review: once the machine starts filing and committing on its own, its artifacts must trace back to the box and session that produced them.
## 2026-10-18 — live-sync heartbeat for machine-written paths (Refs #11)
Root-caused the month of silent divergence in the live checkout (~61 auto-learned skills on one disk only, a stranded `unexpectedStopDetection` fix, merge-refusals from dirty trees): the checkout IS the deployment, symlinks make machine writes dirty tracked files by design, and no commit law covered that churn. Added `scripts/live-sync.sh` + systemd user timer — allowlist tiers (memories, managed-skills, live config, dotfiles) auto-commit with hooks armed, merge `origin/main`, push, and reap stale `wt/*` worktrees; everything outside the allowlist is never staged, conflicts abort-and-alert. Black-box suite `tests/live-sync.bats` (9 tests). Tier law in AGENTS.md § Live-sync tiers; reference page `tools/live-sync.md` registered in the tools index.