Stand up knowledge-base freshness program: classify eager context by decay-class/half-life, build freshness-probe CI #262

Closed
opened 2026-06-19 08:42:56 +00:00 by coilyco-ops · 3 comments
Member

Recovered from a local session transcript (2026-06-19). The design lived only in an uncommitted scratch doc (docs/knowledge-base-meta-improvement.md, ?? in git status) - the most at-risk artifact found in the lost-work sweep. Full content preserved below so it survives even if the file is wiped. Anchor: "start a scratch doc for action items" - agentic-os session 457a19cc L91.

Operating frame

Grade every fact by decay class and push it down-gradient: asserted (hand-written, highest decay, no test) -> pointer (states where to get it fresh, decay near zero) -> derived (rendered from a ground-truth source like describe/schema/--help, cannot drift past source, diffable). Second orthogonal axis: half-life (how fast the world rewrites the fact) decides how much machinery a fact is worth. Aim heavy machinery only at the fast-decay quadrant (verbs, SDK APIs, model ids, pricing, ToS); slow-decay (voice rules, doctrine, taste) stays hand-asserted.

Action items

  1. Detection layer - freshness CI for knowledge (highest leverage). Code drift is caught loud; knowledge rot is silent. Build the trigger: scheduled cold-agent probe (claude -p assert-then-verify, diff answer vs ground truth, flag drift) + source-diff (when a self-describing surface changes, flag every doc asserting the old shape).
  2. Classification - audit the eager context (the keystone). Walk AGENTS.md, global CLAUDE.md, skill descriptions; grade each fact by decay-class + half-life; produce the bake-unsafe / fetch-instead list. Add provenance as a first-class field (as-of: <date>, source: <where>) so an agent can self-discount stale claims. Unblocks the other three.
  3. Merge point - self-describing surface -> rendered generator. Surface describes itself -> code renders into agent context every rollout -> fact cannot go stale. Concrete instance: ward ops ... describe -> committed reference -> one-line eager pointer, regenerated at converge time.
  4. qwen fine-tune as context-budget buyback (GATED on item 2). Fine-tune on the slow-decay subset only - an always-on you-shaped pair freeing working-context for fast/task knowledge. Training on the whole base would bake fast-decay facts into weights (parametric staleness = silent, ungreppable, confidently wrong). Cannot start until item 2 grades by half-life.

Constraints

  • Derive-vs-point is an optimization under a metered token budget (ward exec context-budget), not a blanket rule.
  • Discipline already latent: SSM cache-on-first-lookup, no-auto-memory, catalog knowledge-validators (dead-cross-links, repo-pointer-skills). The gap is the positive program, not the instinct.

Storage tiers (keyed to half-life)

  • Parametric (fine-tune) - slow, high-value, context-expensive: taste, voice, doctrine, tool shape. Safe ONLY for genuinely slow knowledge.
  • Eager (asserted) - slow, small, exact, auditable: AGENTS.md doctrine.
  • Runtime (pointer/derived via MCP/RAG) - fast-decay: Context7 for public libs, describe for private tools, SSM for ids. Never baked.

Source scratch doc on disk: docs/knowledge-base-meta-improvement.md (uncommitted as of filing).

**Recovered from a local session transcript (2026-06-19).** The design lived only in an **uncommitted** scratch doc (`docs/knowledge-base-meta-improvement.md`, `??` in git status) - the most at-risk artifact found in the lost-work sweep. Full content preserved below so it survives even if the file is wiped. Anchor: "start a scratch doc for action items" - agentic-os session `457a19cc` L91. ## Operating frame Grade every fact by **decay class** and push it down-gradient: **asserted** (hand-written, highest decay, no test) -> **pointer** (states where to get it fresh, decay near zero) -> **derived** (rendered from a ground-truth source like `describe`/schema/`--help`, cannot drift past source, diffable). Second orthogonal axis: **half-life** (how fast the world rewrites the fact) decides how much machinery a fact is worth. Aim heavy machinery only at the fast-decay quadrant (verbs, SDK APIs, model ids, pricing, ToS); slow-decay (voice rules, doctrine, taste) stays hand-asserted. ## Action items 1. **Detection layer - freshness CI for knowledge (highest leverage).** Code drift is caught loud; knowledge rot is silent. Build the trigger: scheduled cold-agent probe (`claude -p` assert-then-verify, diff answer vs ground truth, flag drift) + source-diff (when a self-describing surface changes, flag every doc asserting the old shape). 2. **Classification - audit the eager context (the keystone).** Walk AGENTS.md, global CLAUDE.md, skill descriptions; grade each fact by decay-class + half-life; produce the bake-unsafe / fetch-instead list. Add provenance as a first-class field (`as-of: <date>, source: <where>`) so an agent can self-discount stale claims. Unblocks the other three. 3. **Merge point - self-describing surface -> rendered generator.** Surface describes itself -> code renders into agent context every rollout -> fact cannot go stale. Concrete instance: `ward ops ... describe` -> committed reference -> one-line eager pointer, regenerated at converge time. 4. **qwen fine-tune as context-budget buyback (GATED on item 2).** Fine-tune on the *slow-decay subset* only - an always-on you-shaped pair freeing working-context for fast/task knowledge. Training on the whole base would bake fast-decay facts into weights (parametric staleness = silent, ungreppable, confidently wrong). Cannot start until item 2 grades by half-life. ## Constraints - Derive-vs-point is an optimization under a metered token budget (`ward exec context-budget`), not a blanket rule. - Discipline already latent: SSM cache-on-first-lookup, no-auto-memory, catalog knowledge-validators (dead-cross-links, repo-pointer-skills). The gap is the positive program, not the instinct. ## Storage tiers (keyed to half-life) - **Parametric (fine-tune)** - slow, high-value, context-expensive: taste, voice, doctrine, tool *shape*. Safe ONLY for genuinely slow knowledge. - **Eager (asserted)** - slow, small, exact, auditable: AGENTS.md doctrine. - **Runtime (pointer/derived via MCP/RAG)** - fast-decay: Context7 for public libs, `describe` for private tools, SSM for ids. Never baked. Source scratch doc on disk: `docs/knowledge-base-meta-improvement.md` (uncommitted as of filing).
Author
Member

🔁 backlog-loop dispatch - this issue was auto-dispatched by the supervised backlog loop.

When you finish, your final issue comment must start with exactly one of:

  • WARD-OUTCOME: done - landed/merged, nothing more needed.
  • WARD-OUTCOME: blocked - <the specific decision or information you need from a human>
  • WARD-OUTCOME: failed - <why, briefly>

Put your candid retrospective on the line(s) below it. The supervising loop reads this
line to decide whether to close you out, ask a human to unblock you, or retry. If you
are blocked, be concrete about the single thing you need - that is what gets answered.

<!-- backlog-loop:dispatch --> 🔁 **backlog-loop dispatch** - this issue was auto-dispatched by the supervised backlog loop. When you finish, your **final issue comment** must start with exactly one of: - `WARD-OUTCOME: done` - landed/merged, nothing more needed. - `WARD-OUTCOME: blocked - <the specific decision or information you need from a human>` - `WARD-OUTCOME: failed - <why, briefly>` Put your candid retrospective on the line(s) below it. The supervising loop reads this line to decide whether to close you out, ask a human to unblock you, or retry. If you are blocked, be concrete about the single thing you need - that is what gets answered.
Author
Member

🔒 Reserved by ward agent --driver claude — container ward-agentic-os-issue-262-claude-f096f564 on host kais-macbook-pro-2.local is carrying this issue (reserved 2026-06-25T09:32:01Z). Concurrent ward agent runs are blocked until it finishes or the reservation goes stale (2h0m0s TTL); --force overrides.

— Claude (she/her), via ward agent

<!-- ward-agent-reservation --> 🔒 Reserved by `ward agent --driver claude` — container `ward-agentic-os-issue-262-claude-f096f564` on host `kais-macbook-pro-2.local` is carrying this issue (reserved 2026-06-25T09:32:01Z). Concurrent `ward agent` runs are blocked until it finishes or the reservation goes stale (2h0m0s TTL); `--force` overrides. <!-- ward-agent-signature --> — Claude (she/her), via `ward agent`
Owner

WARD-OUTCOME: done

Honest retro: the hardest part was scoping, not coding. The issue is a four-item design plus a whole ecosystem survey, and most of it is research, not a landable feature. So I cut a deterministic v1 that delivers the two highest-leverage items - the freshness probe (detection) and the eager-context classification (the keystone) - and named the heavy/gated pieces (cold-agent assert-then-verify, qwen fine-tune) as follow-ups rather than half-building them.

What fought back: the general-doc size cap (80 lines / 4000 chars) squeezed the program doc hard - several rounds of char-shaving to land the classification under it, ending right on the boundary. And a nice self-referential surprise: the probe flagged itself. The provenance marker shown as an example in FEATURES.md and the program doc got parsed as a live (malformed) marker, so I had to teach it to ignore markers inside code fences and inline code. That bug only surfaced after I merged main and re-ran, which I take as a good sign the probe actually works on a real tree.

Confidence is high on the hermetic core: 23 tests, runs with plain python3 on PYTHONPATH, no network or binary, so the scheduled CI is trustworthy. Rough edges worth filing: the scheduled run only fails loudly (no auto-issue yet); the non-hermetic cold-agent probe - arguably the highest-leverage half of item 1 - is deferred; and only one real marker is seeded so far (the ward-ops render), so rolling provenance markers across the rest of the eager context is genuine follow-up work the program now enables but does not finish.

WARD-OUTCOME: done Honest retro: the hardest part was scoping, not coding. The issue is a four-item design plus a whole ecosystem survey, and most of it is research, not a landable feature. So I cut a deterministic v1 that delivers the two highest-leverage items - the freshness probe (detection) and the eager-context classification (the keystone) - and named the heavy/gated pieces (cold-agent assert-then-verify, qwen fine-tune) as follow-ups rather than half-building them. What fought back: the general-doc size cap (80 lines / 4000 chars) squeezed the program doc hard - several rounds of char-shaving to land the classification under it, ending right on the boundary. And a nice self-referential surprise: the probe flagged itself. The provenance marker shown as an *example* in FEATURES.md and the program doc got parsed as a live (malformed) marker, so I had to teach it to ignore markers inside code fences and inline code. That bug only surfaced after I merged main and re-ran, which I take as a good sign the probe actually works on a real tree. Confidence is high on the hermetic core: 23 tests, runs with plain python3 on PYTHONPATH, no network or binary, so the scheduled CI is trustworthy. Rough edges worth filing: the scheduled run only fails loudly (no auto-issue yet); the non-hermetic cold-agent probe - arguably the highest-leverage half of item 1 - is deferred; and only one real marker is seeded so far (the ward-ops render), so rolling provenance markers across the rest of the eager context is genuine follow-up work the program now enables but does not finish.
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
coilyco-flight-deck/agentic-os#262
No description provided.