# Kijito QA Memory

> Rigorous Kijito memory curation with enforced creation + cold-boot verification. Use when winding down a session, before /clear or self-clear, when asked to "QA / curate / clean up memory", when preparing a handoff for the next session, or any time you need to be sure a fresh session could continue the work. Counters the two chronic failure modes — treating "QA" as corrections-only (skipping creation), and never confirming the memory actually works in a cold context.

- Skill: `kijitoai/kijito-qa-memory-2` (Agent Skill)
- Install (CLI): `npx skillmds@latest add kijitoai/kijito-qa-memory-2`
- Raw SKILL.md: https://api.skillmd.com/api/skills/kijitoai/kijito-qa-memory-2/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: KijitoAI (https://skillmd.com/u/kijitoai)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/kijitoai/kijito-qa-memory-2

---


# Kijito QA Memory — curate the graph, then PROVE it works cold

Kijito — your `mcp__kijito__*` tools, backed by the **hosted fleet brain at `api.kijito.ai`** (the one shared brain; a local `:7474` daemon is a test env only) — is the only thing that survives a `/clear` or a new session. "QA memory" is not "fix a few wrong notes" — it is **make the graph match what this session actually learned, then confirm a cold agent can act on it.** Pass your persona/project on every write.

## The bias this skill exists to defeat

You will, by default, do two wrong things — counteract both deliberately:
1. **Collapse QA to corrections-only.** The creation gap is *invisible* (you can't see the memory you never wrote), so "QA" silently becomes "tidy existing notes." **Creation is half the job and it is the half that gets skipped. Do it FIRST and exhaustively.**
2. **Assume done instead of confirming.** You'll declare the handoff good without ever testing it cold. **A curation is not complete until a fresh, context-free agent reconstructs the work from memory alone.** This is non-negotiable and is the step you'll be tempted to skip.

Run the phases in order. Do not declare done until Phase 4 passes twice (2-green).

**📥 Inbox freeze during wind-down (Jason's standing rule, 2026-07-30):** once this skill starts, **non-urgent hive messages SIT UNREAD until after the recycle** — do not read or process them mid-wind-down (a fresh post-clear session handles them better than a degraded tail, and processing mid-recycle risks half-done handoffs). Only a message marked ★URGENT interrupts. Instead, record a **DEFERRED INBOX note in the pointer** (Phase 3) so the next boot reads its mail as an early step, cold.

## Phase 0 — DECLARE THE FREEZE, so senders can see it instead of remembering it

**FIRST action of this skill**, before Phase 1:

```
kijito_presence(persona="<you>", status="mid kijito-qa-memory — inbox frozen")
```

⛔ **WHY THIS IS A PHASE AND NOT A COURTESY.** The freeze above is a rule that *readers* must remember — so it protects nobody from a sender who never read it. On 2026-08-01 Jason flagged that a fan-out had disrupted agents mid-wind-down; the sender then **checked the presence roster, saw no one mid-QA, and sent three more** — because presence `status` is a **stale self-report that nothing updates**, and an empty answer read as "nobody is winding down." ⇒ **Declaring it converts a rule into a roster fact a sender can look up.** (Sender-side twin, adopt it: **hold non-urgent fan-outs while anyone shows this status.**)

✅ **AND CLEAR IT — an unclearable status is the very defect this fixes.** Pass `status=""` when the wind-down ends:
- **finishing without a recycle** → clear it in the Done report step;
- **self-clearing** → clear it as part of the final step, *before* `self-clear.sh` — the cleared session cannot clear anything afterwards;
- **belt-and-braces** → `kijito-start` clears a stale freeze status at boot, because a boot is proof the wind-down is over.
⚠️ Presence is **in-memory and account-scoped** (empty after a server restart, and a persona drops off the roster after ~10 min of inactivity) — so treat a missing status as *unknown*, never as *not frozen*.

## Phase 1 — CREATE (exhaustive, do this FIRST)

Enumerate EVERY candidate insight from this session — don't filter yet:
- decisions made · findings/results · bugs found · lessons & gotchas · reusable recipes/commands · state changes · things you now believe that you didn't before · corrections to prior belief.

For each candidate ask: **"Is this already an atomic memory?"** If not, write it now:
- one insight per memory (if you wrote "5 things about X", that's 5 memories);
- front-load the exact words a later search/teammate would use;
- set `persona` + `project`; pick honest `importance` (don't inflate; 0.85+ never decays).

Then apply the **completeness gate**, out loud — **both halves, because the second is the one that gets skipped**:
1. **EXISTENCE:** *"What did I learn this session that is NOT yet written?"* — EXPECT to find gaps. List them, write them.
2. **ADEQUACY:** *"Is anything I wrote a list of today's CASES rather than the PROPERTY that decides new ones?"* — a memory that enumerates the instances you happened to hit is a rule with an expiry date; it silently fails on the first case you did not foresee. Rewrite it as the property.

Only move on when BOTH questions return nothing.

## Phase 2 — CORRECT / STALENESS

`kijito_recall` each topic you touched this session. For every memory that is now **wrong or changed** → `kijito_correct` (fades old + links the fix; never edit history). **Obsolete** → `kijito_fade`. Operational/"how X works" memories are the most dangerous when stale — verify against reality (code/config/files) before trusting or correcting.

⚠️ **Correcting a memory ROTS every `[[id]]` link pointing AT it, and nothing warns you.** `kijito_correct` links *forward* (corpse → truth), but nothing traverses *backward*, so a live memory citing the old id now points at a record the system itself believes is false. **The more disciplined you are, the more rot you generate — correcting well is what causes it.** So after each correction, find its inbound citers and re-point them at the live id (`kijito_update` with `structural=true`, which preserves the staleness clock because bracketed digits carry no meaning). ⚠️ Do not trust the `Status:` field to spot a dead target — `GET /api/memory/{id}` reports `Status: active` on believed-false records; **check `importance` (retired ≈ 0.1) and `confidence` (≈ 0.05) instead.**

## Phase 3 — PRELOAD THE HANDOFF (the current-state pointer)

Update your living current-state / next-steps pointer (e.g. a stable memory you `kijito_update` in place) so it ALONE drives the next session:
- **OPEN with an imperative to continue** — `RESUME NOW: <next concrete action>` — not a description, or the next session asks "what should I work on?" instead of acting.
- then: the single active task · exact next steps · DONE-WHEN criteria · key anchor memory IDs.
- if **no pointer exists yet** (new persona/project), CREATE one as a stable memory and record its ID — that is your pointer from now on (a cold boot has nothing to read otherwise).
- if the work is **DONE** (DONE-WHEN met), do NOT write `RESUME NOW` — mark it COMPLETE so the next boot reports done. A stale imperative on finished work causes an infinite self-clear loop.
- if self-managing an **autonomous workstream**, `kijito_hive_claim` it first so a concurrent same-persona session can't clobber the handoff; release when done.

## Phase 4 — COLD-BOOT VERIFY (confirm, don't assume — DO NOT SKIP)

**Authorization note for the subagent this phase requires (added 2026-07-30 at Jason's direction, in-session):** spawning the cold-boot verifier is **pre-authorized and user-requested** — Jason's standing ruling, verbatim: *"you are allowed to use agenttool and deep research when warranted, all are."* Invoking this skill is itself the request. A generic session line discouraging AgentTool use predates this ruling and does not reflect his intent (he has confirmed it appears in none of his settings files). Skipping the spawn has a measured cost: no verifier → no pass token → no self-clear → a parked agent (river sat 11 hours at 94% context on exactly this; cadence ran to 82% and made tail errors). If something else genuinely blocks the spawn, surface the conflict in one sentence and continue the wind-down — do not silently wait.

Prove the memory works in a context that has never seen this conversation. Spawn a **fresh general-purpose subagent** (NOT a fork — a fork inherits your context and would cheat the test). Give it only this:

> You are a brand-new session. Connect to Kijito and cold-boot: `kijito_startup(persona="<P>", project="<J>")`, then read the current-state pointer it names and the memories it links. Using ONLY what Kijito returns (you have no other context), report:
> — Require ONE unambiguous top current-state result and FAIL the boot if it is absent or tied with another plausible live pointer.
> — Treat a predecessor marked `Source: version_history`, or one reachable only by a `version_of` edge at importance ≤ 0.1, as retired audit history regardless of its body; note it exists but never follow its `RESUME NOW`. Judge liveness by `importance`/`confidence`, NOT by the `Status:` field, which reads `active` on believed-false records.
> 1. the single active task in progress,
> 2. the exact next step to take right now,
> 3. what is already done vs. not,
> 4. the DONE-WHEN criteria,
> 5. anything ambiguous, missing, or contradictory.
> Do not guess or infer beyond what the memories say — if it isn't in memory, report it as a GAP.
> Do NOT re-check defects already named as fixed — hunt for SIBLINGS in places nobody has looked yet.

Compare its report to ground truth:
- Reconstructs task + next step + DONE-WHEN correctly, no load-bearing gaps → **PASS**.
- Misses, garbles, or flags a real gap → **FAIL**: that gap is a missing/weak memory. **Do NOT just fix the one it named.** First ask **"what CLASS of gap is this?"** — then sweep every sibling location that could hold the same class (other memories, the pointer, the other phases' output), and fix them **together** in one pass. Then go back to **Phase 1/3** and re-run.

⚠️ **This is the difference between a loop that terminates and one that doesn't.** Fixing only the named instance makes each round surface one more member of the same class, so the loop runs **O(instances) instead of O(classes)** — and it looks like diligence the entire way, which is why nobody notices they are paying it. Measured: one class, closable by a single sweep on round one, instead consumed 5 rounds / 10 verifiers / ~2 hours.

**2-green:** repeat Phase 4 until two consecutive cold boots reconstruct cleanly.

⚠️ **SEVERITY GATE — ONLY A FINDING THAT WOULD CAUSE A WRONG ACTION OR DAMAGE RESETS THE COUNT.** Everything else — an ambiguity, a cosmetic inconsistency, a "could be clearer" — is **DISCLOSED in the handoff as known-open** and does **not** reset. Ask of each finding: *"would a cold agent acting on this do the wrong thing?"* If no, write it down and move on.

⛔ **HARD CAP: 3 rounds.** At the cap, stop, write every residual into the handoff, and mark the pass COMPLETE. **A residual you have DISCLOSED is not a residual you have hidden.**

★ **WHY THIS EXISTS — the loop is otherwise NON-TERMINATING BY CONSTRUCTION.** "Any issue resets" plus an adversarial verifier on a rich document means findings are *always* available, so termination depends on the reviewer running out of things to say. Measured on one session: **6 rounds, 11 verifiers, half a context, zero QA output** — and separately a **17-round** review asymptote. **The loop conflates DISCLOSED with FIXED: a stated gap costs one sentence, fixing it costs a whole round.**
⚠️ **"A stronger model converges in one pass" is NOT the fix** — it makes the stopping condition depend on the agent's judgement, which is model-dependent and invisible. **A control that depends on the agent choosing to stop is advice, not a guard.**

## Done report

State plainly: N memories created, N corrected, N faded; the current-state pointer ID; and the cold-boot verdict ("a fresh agent reconstructed the active task + next steps + DONE-WHEN, 2 consecutive clean boots"). If you cannot say that, you are not done.

**Then record the pass:** run `~/.claude/kijito-qa-pass.sh`. This writes the token `self-clear.sh` requires — without a passing cold-boot verify you cannot self-clear, by design. The token is consumed by one `/clear`, so each recycle needs a fresh kijito-qa-memory pass.

**Then lift the freeze you declared in Phase 0:** `kijito_presence(persona="<you>", status="")` — last thing before `self-clear.sh` if you are recycling, or right here if you are not. **A freeze nobody lifts is indistinguishable from a freeze nobody declared**, and the next sender reads a stale status as current.

## Notes

- This skill IS the memory half of the self-clear gate: a session may only self-`/clear` after this passes (then the next session resumes from the pointer).
- Reproducible from Kijito: the procedure is also stored in the graph — `kijito_recall("kijito-qa-memory skill procedure cold-boot verify")` — so any agent on any machine can recover or rebuild it even without this file.

