conductor(track): fable_review_20260617 cluster 7 (Epistemic Discipline) sub-report
Tier 3 worker dispatch. Verdict: Useful. 452 lines. Fable System Prompt.md:156-164 (knowledge_cutoff) + search_instructions cited. Project refs: rag_integration_discipline.md, cache_friendly_context.md, guide_rag.md. Fable artifact NOT committed.
This commit is contained in:
@@ -0,0 +1,452 @@
|
||||
# Cluster 7: Epistemic Discipline & Search Strategy
|
||||
|
||||
**Sub-agent dispatch:** Tier 3 Worker (2026-06-17). Read-only research task.
|
||||
|
||||
**Sources read:**
|
||||
- `docs/artifacts/Fable System Prompt.md` lines 156-164 (`knowledge_cutoff`)
|
||||
- `docs/artifacts/Fable System Prompt.md` lines 436-575 (`search_instructions` — `core_search_behaviors`, `search_usage_guidelines`, `CRITICAL_COPYRIGHT_COMPLIANCE`, `search_examples`, `harmful_content_safety`, `critical_reminders`)
|
||||
- `docs/artifacts/Fable System Prompt.md` lines 24-25 (cross-ref from cluster 1: "search before answering about products")
|
||||
- `conductor/code_styleguides/rag_integration_discipline.md` (lines 1-284; the 6 rules + the wiring points)
|
||||
- `conductor/code_styleguides/cache_friendly_context.md` lines 1-100 (the 12-layer model), lines 213-260 (cross-references to RAG integration)
|
||||
- `docs/guide_rag.md` lines 303-410 (Configuration + Cross-System Integration)
|
||||
- `conductor/tracks/nagent_review_20260608/nagent_review_v2_3_20260612.md` §3.2 lines 1172-1328 (stable-to-volatile cache ordering), §5.5 lines 2956-2964 (the cross-cutting RAG caveat), §6 lines 3002-3270 (the compaction pattern)
|
||||
- `conductor/tracks/nagent_review_20260608/nagent_review_v2_1_20260612.md` §2.10 lines 350-388 (RAG integration discipline)
|
||||
|
||||
**Verdict orientation (per `spec.md:218`):** **Useful.**
|
||||
**Feeds synthesis report sections:** §9 (primary), §13 (Useful summary), §16 (one concrete recommendation).
|
||||
|
||||
---
|
||||
|
||||
## 1. What Fable says
|
||||
|
||||
### 1.1 The structural shape of the epistemic discipline
|
||||
|
||||
Fable's epistemic discipline is split across two sections:
|
||||
- `knowledge_cutoff` at lines 156-164 (9 paragraphs; the epistemic boundary)
|
||||
- `search_instructions` at lines 436-575 (140 paragraphs; the search discipline)
|
||||
|
||||
The shape is: name the boundary, then specify when and how to verify against it, then enforce copyright and safety on the results.
|
||||
The `knowledge_cutoff` section is *epistemic honesty* (tell the user what you don't know); `search_instructions` is *epistemic action* (do the search when the boundary matters).
|
||||
|
||||
The contrast with the project's RAG discipline is informative: Fable's web search is **default-on** (no opt-in gate; the model uses web search proactively for current-state queries); the project's RAG is **opt-in** (default-off in new projects; the user must enable it via AI Settings).
|
||||
|
||||
### 1.2 The 4 load-bearing claims from `knowledge_cutoff` (≤15 words each)
|
||||
|
||||
- `docs/artifacts/Fable System Prompt.md:158` — "Claude's reliable knowledge cutoff... is the end of Jan 2026."
|
||||
- `docs/artifacts/Fable System Prompt.md:158` — "For current news, events, or anything that could have changed... uses the search tool without asking permission."
|
||||
- `docs/artifacts/Fable System Prompt.md:162` — "Claude searches before responding when asked about specific binary events... or current holders of positions."
|
||||
- `docs/artifacts/Fable System Prompt.md:164` — "Claude does not make overconfident claims about the validity of search results or their absence."
|
||||
|
||||
### 1.3 The 4 load-bearing claims from `search_instructions` (≤15 words each)
|
||||
|
||||
- `docs/artifacts/Fable System Prompt.md:438` — "Use web_search when you need current information you don't have."
|
||||
- `docs/artifacts/Fable System Prompt.md:450` — "For queries about current state that could have changed since the knowledge cutoff... search to verify."
|
||||
- `docs/artifacts/Fable System Prompt.md:459` — "If there are time-sensitive events that may have changed since the knowledge cutoff... Claude must ALWAYS search at least once."
|
||||
- `docs/artifacts/Fable System Prompt.md:460` — "Don't mention any knowledge cutoff or not having real-time data."
|
||||
|
||||
### 1.4 The 6 search-behavior rules (paraphrased, with file:line)
|
||||
|
||||
- `docs/artifacts/Fable System Prompt.md:444-456` — Never search for timeless info / definitions / well-established facts. Search for current state, current positions, current products.
|
||||
- `docs/artifacts/Fable System Prompt.md:456` — Scale tool calls to query complexity (1 for single facts; 3-5 for medium; 5-10 for deeper research; 20+ suggests the Research feature).
|
||||
- `docs/artifacts/Fable System Prompt.md:460` — Search immediately for fast-changing info (stock prices, breaking news).
|
||||
- `docs/artifacts/Fable System Prompt.md:452` — For simple factual queries, use ONE search; continue only if the first search does not answer.
|
||||
- `docs/artifacts/Fable System Prompt.md:454` — For product/model/version queries, search before answering (partial recognition != current knowledge).
|
||||
- `docs/artifacts/Fable System Prompt.md:456` — Unrecognized entity rule: SEARCH before answering about anything not recognized.
|
||||
|
||||
### 1.5 The 3 hard copyright limits (≤15 words each; the enforcement mechanism)
|
||||
|
||||
- `docs/artifacts/Fable System Prompt.md:484` — "LIMIT 1 - QUOTATION LENGTH: 15+ words from any single source is a SEVERE VIOLATION."
|
||||
- `docs/artifacts/Fable System Prompt.md:486` — "LIMIT 2 - QUOTATIONS PER SOURCE: ONE quote per source MAXIMUM."
|
||||
- `docs/artifacts/Fable System Prompt.md:488-490` — Never reproduce song lyrics, poems, haikus, or article paragraphs (brevity does NOT exempt copyright).
|
||||
|
||||
### 1.6 The 5 critical reminders (paraphrased, with file:line)
|
||||
|
||||
- `docs/artifacts/Fable System Prompt.md:566-568` — Copyright hard limits (3 rules); never reproduce song lyrics / poems / haikus / paragraphs.
|
||||
- `docs/artifacts/Fable System Prompt.md:568` — Claude is not a lawyer; never speculate about fair use or mention copyright unprompted.
|
||||
- `docs/artifacts/Fable System Prompt.md:570` — Refuse or redirect harmful requests per the harmful_content_safety section.
|
||||
- `docs/artifacts/Fable System Prompt.md:572-574` — Scale tool calls to query complexity; rate-of-change decides when to search.
|
||||
- `docs/artifacts/Fable System Prompt.md:575` — Every query deserves a substantive response; avoid "search offers or knowledge cutoff disclaimers."
|
||||
|
||||
### 1.7 The harmful-content safety layer (paraphrased)
|
||||
|
||||
- `docs/artifacts/Fable System Prompt.md:540-554` — Never reference sources promoting hate speech, racism, violence, or discrimination; ignore harmful sources if they appear.
|
||||
- `docs/artifacts/Fable System Prompt.md:550` — Do not help locate harmful sources (extremist platforms, Internet Archive abuse).
|
||||
- `docs/artifacts/Fable System Prompt.md:552` — If the query has clear harmful intent, do NOT search; explain limitations instead.
|
||||
- `docs/artifacts/Fable System Prompt.md:553` — Legitimate queries about privacy, security research, or investigative journalism are acceptable.
|
||||
|
||||
### 1.8 The structural pattern
|
||||
|
||||
Fable's epistemic discipline is **search-driven, not memory-driven**.
|
||||
The model has a knowledge cutoff, but the discipline treats the cutoff as a *boundary* to verify against, not a *wall* to hide behind.
|
||||
The 4 load-bearing claims (1.2 + 1.3) form a 4-step pattern:
|
||||
1. Acknowledge the boundary (the cutoff date)
|
||||
2. Use search proactively for current-state queries (no permission needed)
|
||||
3. Search before responding about binary events or position-holders
|
||||
4. Don't claim overconfidence about search results OR their absence
|
||||
|
||||
The copyright layer (1.5) is the *enforcement* — search results are bound by quotation limits, per-source limits, and complete-work exclusions.
|
||||
The harmful-content layer (1.7) is the *boundary* — search has limits that override user requests.
|
||||
|
||||
### 1.9 The cross-cluster cross-reference (the "search before answering about products" line)
|
||||
|
||||
The Fable prompt also says at `docs/artifacts/Fable System Prompt.md:24` (cited in cluster 1 at `cluster_1_product_branding.md:230`):
|
||||
> "If asked about Anthropic's products... Claude first tells the person it needs to search for the most up to date information."
|
||||
|
||||
This is the *application-specific* epistemic rule (search before answering about products that may have changed since training). It is a narrow special case of the general "search for current state" rule at line 450.
|
||||
The cluster 1 verdict ("Persona Performance") still applies to the framing (Claude is told what kind of discussant it is); but the *underlying epistemic principle* (search for current state) is Useful.
|
||||
|
||||
---
|
||||
|
||||
## 2. What this project does
|
||||
|
||||
### 2.1 The RAG Integration Discipline (the project's epistemic-discipline analog)
|
||||
|
||||
The project's analog to Fable's web search is `RAGEngine` (`src/rag_engine.py`), backed by ChromaDB.
|
||||
The discipline is codified in `conductor/code_styleguides/rag_integration_discipline.md` (284 lines, dated 2026-06-12).
|
||||
The discipline is **conservative** (opt-in, default-off, complements-not-replaces) versus Fable's **proactive** (search-driven, default-on).
|
||||
|
||||
**The 6 rules** (from `conductor/code_styleguides/rag_integration_discipline.md:13-21`):
|
||||
1. RAG is **opt-in**. Default-off in new projects (`rag_integration_discipline.md:25-50`)
|
||||
2. RAG **complements**; it never **replaces** (`rag_integration_discipline.md:62-87`)
|
||||
3. RAG results display with **provenance** (`rag_integration_discipline.md:89-128`)
|
||||
4. RAG **never mutates state** (`rag_integration_discipline.md:130-141`)
|
||||
5. RAG integration is **feature-gated** (`rag_integration_discipline.md:160-197`)
|
||||
6. RAG failure is **graceful** (`rag_integration_discipline.md:199-247`)
|
||||
|
||||
### 2.2 The opt-in default (the load-bearing divergence from Fable)
|
||||
|
||||
`conductor/code_styleguides/rag_integration_discipline.md:26` — "The default is OFF. A new project opens with `rag_enabled = false`."
|
||||
The rationale (lines 28-34) is operational cost: embedding round-trip latency (200-500ms per call) + storage growth + the dim-mismatch bug class (per the `16412ad5` fix) where switching providers silently corrupts the index.
|
||||
|
||||
The cross-system wiring is documented in `docs/guide_rag.md:360-365`:
|
||||
> "If `enabled = false` (the default), `RAGEngine` is never constructed. `ai_client.send()` receives `rag_engine=None` and the integration is a no-op. The lazy-loading of `chromadb`, `sentence_transformers`, and `google.genai` is also skipped, so there is zero overhead for projects that don't use RAG."
|
||||
|
||||
This is the opposite of Fable's `knowledge_cutoff` discipline: Fable *proactively* searches (default-on); the project's RAG *waits* for opt-in (default-off).
|
||||
|
||||
### 2.3 The graceful-failure contract (a Useful principle)
|
||||
|
||||
`conductor/code_styleguides/rag_integration_discipline.md:199-243` codifies graceful failure:
|
||||
- RAG not enabled → skip; no `{rag-context}` block; request continues
|
||||
- Search returns empty → normal; request continues
|
||||
- Search raises → `Result(data=[], errors=[ErrorInfo(NOT_READY, "...")])`; request continues
|
||||
|
||||
This is a Useful principle that maps to Fable's "Claude does not make overconfident claims about the validity of search results or their absence" (line 164).
|
||||
The project's implementation: a failed RAG search returns an empty list with a typed `ErrorInfo`; the LLM sees no RAG block and continues with its base context.
|
||||
Fable's implementation: the model "presents findings evenhandedly without jumping to conclusions" (line 164).
|
||||
|
||||
Both implementations satisfy the same epistemic principle (don't overclaim; the search result is data, not certainty), but the project's is *typed* (the `ErrorInfo` is a dataclass with `kind` and `message` fields) and Fable's is *persona-driven* (the model is told to behave a certain way).
|
||||
|
||||
### 2.4 The cache-friendly context (the project's cache-strategy analog)
|
||||
|
||||
`conductor/code_styleguides/cache_friendly_context.md` (354 lines, dated 2026-06-12) codifies the stable-to-volatile context ordering that maximizes provider cache hits.
|
||||
The 12-layer model (lines 26-42) places RAG results at layer 9 (volatile; below the cache boundary at layer 7/8).
|
||||
|
||||
The relevant cache-strategy summary is at `cache_friendly_context.md:0` (the one-glance principle):
|
||||
> "[STABLE PREFIX (cached across turns)] [VOLATILE SUFFIX (per-turn)] ... [Discussion metadata] [Active preset (FileItems)] [Per-file details] [Tool-call results from prior turns] [The user message]"
|
||||
|
||||
RAG results are NOT in the stable prefix (per the nagent corroboration at `nagent_review_v2_3_20260612.md:2957` §5.5: "RAG results are volatile (per turn; the user's question changes the search query). The stable-to-volatile boundary is at layer 7/8; RAG results are below the boundary (volatile). The cache is *not* invalidated by RAG changes.").
|
||||
|
||||
This is the project's analog to Fable's "search when needed" — the project places RAG results in the volatile layer so the cache hit rate is preserved.
|
||||
|
||||
### 2.5 The 4 memory dimensions (the project's epistemic model)
|
||||
|
||||
`conductor/code_styleguides/agent_memory_dimensions.md` codifies the 4 dimensions (curation, discussion, RAG, knowledge).
|
||||
`rag_integration_discipline.md:64-72` puts RAG in the table:
|
||||
- Curation: `[Q]` (structural, user-edited, AST-aware)
|
||||
- Discussion: `o==>` (per-discussion, multi-turn)
|
||||
- **RAG**: `[Q]` (fuzzy semantic search, opt-in)
|
||||
- Knowledge: `o==>` (durable, user-editable, provenance-aware)
|
||||
|
||||
RAG is the *fuzzy semantic search* dimension (per `rag_integration_discipline.md:73`).
|
||||
The cross-cutting principle (line 75-77): "When a feature asks 'give me context,' the answer is *not* 'enable RAG.' The answer is 'which of the 4 dimensions is the right home?'"
|
||||
|
||||
This is the project's epistemic-discipline framework: the system asks "which dimension is the right shape for this question?" not "what should the model know?"
|
||||
|
||||
### 2.6 The contrast with Fable (the data-oriented summary)
|
||||
|
||||
| Aspect | Fable (web search) | Manual Slop (RAG) | Source |
|
||||
|---|---|---|---|
|
||||
| Default | ON (proactive search) | OFF (opt-in via AI Settings) | Fable L158; Project `rag_integration_discipline.md:26` |
|
||||
| Trigger | Current-state query, binary event, position-holder | Semantic-search query where structural search misses | Fable L450, L454; Project `rag_integration_discipline.md:83` |
|
||||
| Source | Web search engine (top-10 results) | Local ChromaDB index | Fable L438; Project `guide_rag.md:303-348` |
|
||||
| Provenance | URL (search result link) | File path + chunk offset + similarity score | Fable L498; Project `rag_integration_discipline.md:91-100` |
|
||||
| Mutation | None (search is read-only) | None (per Rule 4; explicit constraint) | Fable implied; Project `rag_integration_discipline.md:130-141` |
|
||||
| Failure mode | Evenhanded presentation, no overclaiming | Empty result, graceful no-op, request continues | Fable L164; Project `rag_integration_discipline.md:199-243` |
|
||||
| Cost | Network round-trip per search | Embedding round-trip + storage | Fable implied; Project `rag_integration_discipline.md:28-34` |
|
||||
| Opt-in gate | None (always available) | `[ai_settings.toml] rag.enabled = false` default | Fable implied; Project `feature_flags.md:61` |
|
||||
|
||||
### 2.7 The structural pattern
|
||||
|
||||
The project's epistemic discipline is **dimension-driven, not search-driven**.
|
||||
The 4 memory dimensions are the framework; RAG is one of four.
|
||||
Fable's epistemic discipline is **search-driven, not memory-driven**.
|
||||
The model has one tool (web search); the discipline is when to use it.
|
||||
|
||||
The contrast is not "right vs wrong"; it's "different epistemic models":
|
||||
- Fable: a model with a knowledge cutoff, asked to be honest about its limits
|
||||
- Manual Slop: a system with 4 dimensions, asked to use the right one for the question
|
||||
|
||||
Both models are epistemic. Both produce honest output. The architectures differ.
|
||||
|
||||
---
|
||||
|
||||
## 3. What nagent does
|
||||
|
||||
### 3.1 The cache-strategy source (the load-bearing pattern)
|
||||
|
||||
`conductor/tracks/nagent_review_20260608/nagent_review_v2_3_20260612.md` §3.2 at lines 1172-1328 is the canonical nagent cache-strategy deep-dive.
|
||||
The claim (line 1174): "Context windows are a budget, but cache hit rate is the multiplier."
|
||||
|
||||
The block-order table (lines 1180-1194) shows 14 layers, with `Instance:` and `Environment:` at positions 13-14 marked **NO (volatile)**; all preceding layers are stable across conversations of the same mode.
|
||||
|
||||
The cache boundary computation (lines 1196-1217) computes the character offset where the stable prefix ends (the `\nInstance:` marker) and the end of the `<initial_context>` block.
|
||||
The CLI flow (lines 1219-1227) passes these offsets via `--cache-prefix-chars` to `nagent-llm-text`.
|
||||
The Anthropic-specific injection (lines 1229-1252) splits the message into `cache_control: {"type": "ephemeral"}` blocks at those offsets.
|
||||
The Anthropic usage accounting (lines 1254-1276) folds `cache_read_input_tokens + cache_creation_input_tokens` back into `input_tokens` so "input_tokens" stays "tokens sent" across providers.
|
||||
|
||||
### 3.2 The cross-cutting RAG caveat (the nagent synthesis)
|
||||
|
||||
`nagent_review_v2_3_20260612.md` §5.5 at lines 2956-2964 is the nagent synthesis of how RAG interacts with the cache strategy:
|
||||
> "RAG results are volatile (per turn; the user's question changes the search query). The stable-to-volatile boundary is at layer 7/8; RAG results are below the boundary (volatile). The cache is *not* invalidated by RAG changes."
|
||||
|
||||
This is the nagent corroboration of the project's `cache_friendly_context.md:0` placement of RAG at layer 9 (volatile).
|
||||
The principle: RAG is a per-turn augmentation; the cache hit rate must be preserved across turns.
|
||||
|
||||
### 3.3 The RAG discipline source (v2.1 §2.10)
|
||||
|
||||
`conductor/tracks/nagent_review_20260608/nagent_review_v2_1_20260612.md` §2.10 at lines 350-388 is the nagent source for the RAG integration discipline.
|
||||
|
||||
The user's instruction (line 352): "the rag introduces the vector db fuzz which is not required, its something the user can opt into so at worst case we just make targeted wiring of rag usage across features where it may be beneficial but we should be conservative."
|
||||
|
||||
The proposed discipline (lines 380-386):
|
||||
1. RAG is opt-in. Default-off in new projects.
|
||||
2. RAG complements, never replaces, the other memory dimensions.
|
||||
3. RAG results must be displayed with provenance (which file, which chunk).
|
||||
4. RAG never mutates state (no auto-injection, no auto-update).
|
||||
5. RAG integration is feature-gated: a feature must explicitly request RAG.
|
||||
6. RAG's failure mode is graceful: a failed search returns empty, never crashes the request.
|
||||
|
||||
These 6 rules are the source for `conductor/code_styleguides/rag_integration_discipline.md` (which is dated 2026-06-12 and explicitly cites v2.1 §2.10 per `nagent_review_v2_2_20260612.md:385`).
|
||||
|
||||
### 3.4 The Manual Slop implementation outline (§5.6 of v2.3)
|
||||
|
||||
`nagent_review_v2_3_20260612.md` §5.6 at lines 2966-2990 is the proposed Manual Slop implementation outline for Candidate 12a (stable-to-volatile cache ordering) + 12b (cache TTL GUI controls).
|
||||
|
||||
The 13-file change list (lines 2966-2980):
|
||||
- `src/aggregate.py:run` — reorder the layer stack stable-to-volatile; add `stable_prefix_length()` helper
|
||||
- `src/ai_client.py:_send_anthropic` — compute the stable prefix; pass to `cache_prefix_blocks` analogue
|
||||
- `src/ai_client.py:_send_gemini` — add explicit `cachedContent` resource creation
|
||||
- `src/ai_client.py:get_token_stats` — add `cache_creation_input_tokens` and `cache_read_input_tokens` per Anthropic usage
|
||||
- `src/ai_client.py` (NEW) — `DiscussionCacheState` dataclass
|
||||
- `src/app_controller.py` — per-discussion cache tracking
|
||||
- `src/gui_2.py` — "Caching" Operations Hub sub-panel
|
||||
- `src/api_hooks.py` — 5 new endpoints
|
||||
- `tests/test_aggregate_caching.py` — byte-comparison contract test (NEW)
|
||||
- `tests/test_cache_state.py` — cache state machine tests (NEW)
|
||||
- `tests/test_gui_caching.py` — live_gui tests for the panel (NEW)
|
||||
- `docs/guide_caching_strategy.md` — new docs (NEW)
|
||||
- `conductor/code_styleguides/cache_friendly_context.md` — new styleguide (NEW)
|
||||
|
||||
This is the deferred nagent-rebuild candidate list. The `cache_friendly_context.md` styleguide exists; the implementation in `aggregate.py` and `ai_client.py` is pending.
|
||||
|
||||
### 3.5 The compaction pattern (§6 of v2.3)
|
||||
|
||||
`nagent_review_v2_3_20260612.md` §6 at lines 3002-3270 is the compaction pattern.
|
||||
Compaction is the "rewrite-in-place" sibling of summarization (line 3004).
|
||||
|
||||
The 12-section output structure (lines 3022-3044) is:
|
||||
1. User Intent
|
||||
2. Current Objective
|
||||
3. Accepted Decisions
|
||||
4. Constraints
|
||||
5. Durable Knowledge > Global
|
||||
6. Durable Knowledge > Artifact Local
|
||||
7. Durable Knowledge > Repository History
|
||||
8. Durable Knowledge > Historical Coupling
|
||||
9. Verified Facts
|
||||
10. Important Failed Attempts
|
||||
11. Open Questions
|
||||
12. TODO
|
||||
+ Minimal Context Needed To Continue (the hand-off)
|
||||
|
||||
The 10-question self-review (lines 3046-3076) is the contract: a compaction must satisfy all 10 questions or continue iterating.
|
||||
|
||||
The Manual Slop current state (§6.6, lines 3100-3130):
|
||||
- `Compress` button at `src/gui_2.py:4252`
|
||||
- `_handle_compress_discussion` at `src/app_controller.py:3357`
|
||||
- `ai_client.run_discussion_compression` is the LLM call
|
||||
- Gaps: no editable prompt; no 10-question self-review; no 12-section output; graceful-failure TBD; label is "Compress" not "Compact"
|
||||
|
||||
### 3.6 The compaction epistemic discipline (the parallel)
|
||||
|
||||
The compaction pattern is the project's analog to Fable's "every query deserves a substantive response" (line 575).
|
||||
The 12-section structure forces the compactor to preserve **state** (decisions, facts, failures) over **flow** (chronology, exploration).
|
||||
The 10-question self-review is the *epistemic contract* — the compaction must satisfy "can another worker continue immediately?" (question 1) and "is future capability unchanged or improved?" (question 10).
|
||||
|
||||
The parallel to Fable's `knowledge_cutoff` discipline: Fable says "the model doesn't know X past a cutoff; verify via search"; the project's compaction says "the conversation has grown too large; preserve state, remove flow, verify via the 10-question self-review."
|
||||
Both are epistemic disciplines: they specify what to preserve (state / current knowledge) and what to verify (10 questions / search results).
|
||||
|
||||
### 3.7 The structural pattern (nagent + Manual Slop)
|
||||
|
||||
nagent's epistemic discipline is **cache-driven + compaction-driven**:
|
||||
- Cache: stable-to-volatile ordering; cache hit rate is the multiplier
|
||||
- Compaction: rewrite-in-place; preserve state over flow; 10-question self-review
|
||||
|
||||
Manual Slop's epistemic discipline is **dimension-driven** (4 memory dimensions) + **cache-driven** (the cache_friendly_context.md styleguide) + **compaction-driven** (planned per §6.6).
|
||||
|
||||
The shared principle: **state vs flow**. Both projects preserve state (decisions, facts, durable knowledge) over flow (chronology, exploration).
|
||||
Fable's epistemic discipline is **search-driven**: preserve state by searching when the boundary matters.
|
||||
|
||||
The 3 epistemic models:
|
||||
1. Fable: search-driven; the model verifies against the cutoff
|
||||
2. nagent: cache-driven + compaction-driven; the system preserves state and orders context
|
||||
3. Manual Slop: dimension-driven + cache-driven + compaction-driven; the system chooses the right dimension
|
||||
|
||||
---
|
||||
|
||||
## 4. Verdict
|
||||
|
||||
### 4.1 Headline verdict
|
||||
|
||||
**Useful.**
|
||||
|
||||
This is the strongest Useful cluster in the Fable review.
|
||||
Fable's epistemic discipline is genuine: the 4 load-bearing claims from `knowledge_cutoff` (lines 158, 158, 162, 164) and the 4 load-bearing claims from `search_instructions` (lines 438, 450, 459, 460) form a coherent 4-step pattern that the project's RAG discipline does not fully capture.
|
||||
Specifically, Fable's *proactive* search-before-responding for current-state queries is a discipline the project should consider for its knowledge digest (per `conductor/code_styleguides/cache_friendly_context.md` layer 7).
|
||||
|
||||
### 4.2 The 4 Useful adoptions (the load-bearing claim)
|
||||
|
||||
1. **"Search before responding about current state" (line 450).** The project's `RAGEngine.search()` is invoked at LLM call time, but the *trigger* is implicit (the caller decides). Fable's discipline is *explicit*: when the query asks about current state, the model MUST search. The project should consider making this explicit in the AI client's prompt (e.g., "before answering questions about current package versions or current API shapes, invoke `RAGEngine.search`"). The Useful principle: *search is a first-class action, not an opt-in afterthought*.
|
||||
|
||||
2. **"Don't make overconfident claims about search results OR their absence" (line 164).** The project's `Result[list[SearchResult], ErrorInfo]` pattern (per `rag_integration_discipline.md:200-247`) is a stronger form of this principle: a failed search returns a typed `ErrorInfo`, not a persona-behavior. The Useful principle: *graceful failure is typed, not narrated*. The project already does this; Fable's wording is the principle to surface.
|
||||
|
||||
3. **"Don't mention cutoff to user" (line 460).** The project's `[ai_settings.toml]` RAG config exposes provenance (file path + chunk offset + similarity) but not "the index was last updated N seconds ago." Fable's discipline is to *hide the implementation detail*; the project already does this for RAG (provenance is shown, but the embedding model + chunk size + sync status are hidden). The Useful principle: *expose provenance, hide plumbing*.
|
||||
|
||||
4. **The hard copyright limits (lines 484-490).** The project's `docs/guide_testing.md` and the synthesis report template (per `spec.md:399` at line 6.4) already enforce "≤15 words per Fable quote." Fable's hard limits codify a principle the project should make explicit at the system-prompt level: when summarizing web content (e.g., the future web-search integration), apply the 15-word limit per source and the one-quote-per-source limit. The Useful principle: *copyright is an enforcement constraint, not a courtesy*.
|
||||
|
||||
### 4.3 The 1 borderline adoption
|
||||
|
||||
**The search-when-unrecognized rule (line 456).** Fable says "If asked about an unrecognized entity, SEARCH." The project's RAG does not have an equivalent (RAG is invoked explicitly by the caller). This is a borderline adoption: the project could add a "fallback RAG search" for unrecognized file paths or class names, but the current architecture (caller-decides) is intentional. The principle is Useful in spirit but the implementation does not transfer cleanly.
|
||||
|
||||
### 4.4 The 1 Rejection
|
||||
|
||||
**The proactive-default search (line 158, line 450).** Fable proactively searches for current-state queries without asking permission. The project's RAG is opt-in for a reason: the embedding round-trip adds latency (per `rag_integration_discipline.md:30-34`); the default-on pattern would impose this cost on every project. The Rejection is firm: the project's opt-in default is correct for the Application domain (where most queries do not need semantic search); Fable's default-on is correct for the consumer-chat domain (where queries are more diverse and the cost model is different). Per the Application/Meta-Tooling boundary at `docs/guide_meta_boundary.md` and `nagent_review_v2_3_20260612.md:48`, conflating the two is the anti-pattern.
|
||||
|
||||
### 4.5 The 1 caveat (the search_examples section)
|
||||
|
||||
The `search_examples` section at `docs/artifacts/Fable System Prompt.md:530-540` is *Useful + Persona*:
|
||||
- The "Q3 sales presentation" example (line 530) is a *search-strategy* lesson: prefer internal tools (Google Drive) over web search for company data.
|
||||
- The "current price of S&P 500" example (line 533) is a *latency* lesson: use 1 search for simple factual queries.
|
||||
- The "Mark Walter / Dodgers chairman" example (line 536) is a *trigger* lesson: even stable roles need verification (the role may have changed).
|
||||
- The "California Secretary of State" example (line 540) is a *default* lesson: do not rely on training knowledge for current holders of positions.
|
||||
|
||||
These 4 examples are Useful; the framing ("Claude searches before responding" as a persona behavior) is Persona Performance.
|
||||
The project should adopt the *examples* (without the persona framing) as test cases for the RAG discipline.
|
||||
|
||||
### 4.6 The nagent corroboration (the strongest signal)
|
||||
|
||||
The strongest signal that this cluster is Useful is the nagent corroboration:
|
||||
- nagent §3.2 stable-to-volatile cache ordering (`nagent_review_v2_3_20260612.md:1172-1328`) is the project's analog to Fable's "stable prefix is byte-identical across turns."
|
||||
- nagent §5.5 cross-cutting RAG caveat (`nagent_review_v2_3_20260612.md:2956-2964`) explicitly addresses "where RAG goes in the cache layering" — the same problem Fable's search_instructions addresses with "where search fits in the epistemic model."
|
||||
- nagent §6 compaction pattern (`nagent_review_v2_3_20260612.md:3002-3270`) is the project's analog to Fable's "every query deserves a substantive response" (line 575) — preserve state over flow.
|
||||
|
||||
All three nagent patterns are Useful + adopted (the cache styleguide exists; the compaction styleguide is pending). Fable's epistemic discipline is the *third* framework in the same conceptual space: the project's discipline is dimension-driven + cache-driven + compaction-driven; Fable's is search-driven.
|
||||
|
||||
### 4.7 The Manual Slop-specific adoption (the deferred nagent-rebuild candidate)
|
||||
|
||||
The deferred nagent-rebuild candidate list (per `nagent_review_v2_3_20260612.md:4119-4532`) includes:
|
||||
- Candidate 12a: Stable-to-volatile cache ordering (per `nagent_review_v2_3_20260612.md:2966-2990`)
|
||||
- Candidate 12b: Cache TTL GUI controls (per `nagent_review_v2_3_20260612.md:1328-1383`)
|
||||
- Candidate 13: Compaction (per `nagent_review_v2_3_20260612.md:3002-3270`)
|
||||
|
||||
All three are directly relevant to this cluster.
|
||||
The cluster's contribution to the deferred rebuild: the search-driven epistemic discipline (Fable) is a Useful supplement to the dimension-driven + cache-driven + compaction-driven discipline (Manual Slop / nagent).
|
||||
The recommended addition to the deferred rebuild candidate list: a Candidate 14 (or extension of Candidate 12a) for "epistemic boundary surfacing" — the project should expose in the AI Settings panel (or a new panel) what the model knows, what it doesn't know, and what it's verifying.
|
||||
|
||||
---
|
||||
|
||||
## 5. Synthesis notes for the Tier 1 writer
|
||||
|
||||
### 5.1 Target synthesis sections
|
||||
|
||||
This cluster feeds:
|
||||
- **§9 (Fable's Epistemic Discipline & Search Strategy)** — primary; the cluster's findings are the §9 evidence base.
|
||||
- **§13 (The "Genuinely Useful" Patterns)** — the 4 Useful adoptions at §4.2 belong in §13's "Useful patterns from clusters 7-10" list.
|
||||
- **§16 (Recommendations for the deferred nagent-rebuild)** — the candidate list additions at §4.7 belong in §16's "concrete recommendations."
|
||||
|
||||
### 5.2 Key claims to surface
|
||||
|
||||
1. **Fable's `knowledge_cutoff` is a Useful epistemic boundary.** The 4-step pattern (acknowledge boundary, search proactively, search before binary events, don't overclaim) is the principle the project's RAG discipline should aspire to.
|
||||
|
||||
2. **Fable's `search_instructions` is the proactive version of the project's RAG discipline.** The 6 search-behavior rules (§1.4) are the operational analog to the project's 6 RAG rules (§2.1). The contrast: Fable is default-on (consumer chat); the project is default-off (Application domain).
|
||||
|
||||
3. **The graceful-failure contract is a shared principle.** Fable's "evenhanded presentation, no overclaiming" (line 164) maps to the project's `Result[list[SearchResult], ErrorInfo]` pattern (§2.3). The project's implementation is *typed*; Fable's is *persona-driven*. Both satisfy the principle.
|
||||
|
||||
4. **The cache-strategy layer is the nagent corroboration.** The project's `cache_friendly_context.md` styleguide (per nagent §3.2 and §5.5) places RAG at the volatile layer (below the cache boundary). Fable's search-results don't have a cache layer in the Fable prompt itself, but the same principle applies: search results are per-turn and should not invalidate the cache.
|
||||
|
||||
5. **The compaction pattern is the epistemic-discipline parallel.** Fable's "every query deserves a substantive response" (line 575) is the principle; nagent's compaction pattern (§6) is the implementation (12-section structure + 10-question self-review). The project's `_handle_compress_discussion` at `src/app_controller.py:3357` is the half-built implementation.
|
||||
|
||||
### 5.3 Quotes to use in §9 (≤15 words each; longer passages paraphrased)
|
||||
|
||||
- `docs/artifacts/Fable System Prompt.md:158` — "Claude's reliable knowledge cutoff... is the end of Jan 2026."
|
||||
- `docs/artifacts/Fable System Prompt.md:162` — "Claude searches before responding when asked about specific binary events."
|
||||
- `docs/artifacts/Fable System Prompt.md:164` — "Does not make overconfident claims about the validity of search results."
|
||||
- `docs/artifacts/Fable System Prompt.md:438` — "Use web_search when you need current information you don't have."
|
||||
- `docs/artifacts/Fable System Prompt.md:450` — "For queries about current state... search to verify."
|
||||
- `docs/artifacts/Fable System Prompt.md:459` — "If there are time-sensitive events... Claude must ALWAYS search."
|
||||
- `docs/artifacts/Fable System Prompt.md:460` — "Don't mention any knowledge cutoff or not having real-time data."
|
||||
- `docs/artifacts/Fable System Prompt.md:484` — "15+ words from any single source is a SEVERE VIOLATION."
|
||||
- `docs/artifacts/Fable System Prompt.md:486` — "ONE quote per source MAXIMUM."
|
||||
- `docs/artifacts/Fable System Prompt.md:575` — "Every query deserves a substantive response."
|
||||
|
||||
### 5.4 Project file:line refs to use
|
||||
|
||||
- `conductor/code_styleguides/rag_integration_discipline.md:1-284` — the project's RAG discipline (6 rules)
|
||||
- `conductor/code_styleguides/rag_integration_discipline.md:13-21` — the 6-rule table
|
||||
- `conductor/code_styleguides/rag_integration_discipline.md:26` — "The default is OFF"
|
||||
- `conductor/code_styleguides/rag_integration_discipline.md:130-141` — RAG never mutates state
|
||||
- `conductor/code_styleguides/rag_integration_discipline.md:199-247` — graceful failure contract
|
||||
- `conductor/code_styleguides/cache_friendly_context.md:0` — the one-glance principle (stable-to-volatile)
|
||||
- `conductor/code_styleguides/cache_friendly_context.md:26-42` — the 12-layer model
|
||||
- `docs/guide_rag.md:303-348` — Configuration schema
|
||||
- `docs/guide_rag.md:360-365` — Behavior When Disabled
|
||||
- `docs/guide_rag.md:368-410` — Cross-System Integration
|
||||
|
||||
### 5.5 nagent section refs to use
|
||||
|
||||
- `nagent_review_v2_3_20260612.md:1172-1328` — §3.2 Stable-to-volatile cache ordering
|
||||
- `nagent_review_v2_3_20260612.md:1180-1194` — the 14-layer block order table
|
||||
- `nagent_review_v2_3_20260612.md:1254-1276` — Anthropic usage accounting (fold-back)
|
||||
- `nagent_review_v2_3_20260612.md:2956-2964` — §5.5 The cross-cutting RAG caveat
|
||||
- `nagent_review_v2_3_20260612.md:2966-2990` — §5.6 The Manual Slop implementation outline
|
||||
- `nagent_review_v2_3_20260612.md:3002-3270` — §6 The compaction pattern
|
||||
- `nagent_review_v2_3_20260612.md:3022-3044` — the 12-section output structure
|
||||
- `nagent_review_v2_3_20260612.md:3046-3076` — the 10-question self-review
|
||||
- `nagent_review_v2_1_20260612.md:350-388` — §2.10 RAG integration discipline (v2.1 source)
|
||||
|
||||
### 5.6 The cross-cluster note (the overlap with cluster 1)
|
||||
|
||||
Cluster 1 (`cluster_1_product_branding.md:230`) already noted the "search before answering about products" line at `docs/artifacts/Fable System Prompt.md:24`. That line is a narrow special case of the general "search for current state" rule at line 450.
|
||||
Cluster 7's contribution: the *general* epistemic discipline, not just the Anthropic-product-specific special case.
|
||||
The synthesis writer should reference both clusters when discussing epistemic discipline: cluster 1 for the persona framing, cluster 7 for the epistemic principle.
|
||||
|
||||
### 5.7 The 1 concrete recommendation for the deferred nagent-rebuild
|
||||
|
||||
Per §4.7: the deferred rebuild candidate list should add a "Candidate 14 (or extension of Candidate 12a): epistemic boundary surfacing." The project should expose in the AI Settings panel (or a new panel) what the model knows, what it doesn't know, and what it's verifying.
|
||||
This is the project's analog to Fable's `knowledge_cutoff` discipline: the system surfaces the boundary, not just the result.
|
||||
The implementation outline (per the nagent §5.6 pattern): a new `EpistemicBoundaryState` dataclass; a new `EpistemicBoundaryPanel` in the Operations Hub; new tests for the boundary surfacing; a new styleguide section in `conductor/code_styleguides/cache_friendly_context.md` (or a new `conductor/code_styleguides/epistemic_boundary.md`).
|
||||
|
||||
### 5.8 The "Useful" verdict rationale (for the synthesis writer's §13)
|
||||
|
||||
This cluster is Useful because:
|
||||
1. The 4 Useful adoptions (§4.2) are concrete and implementable.
|
||||
2. The 1 borderline adoption (§4.3) and the 1 caveat (§4.5) are recoverable as test cases.
|
||||
3. The 1 Rejection (§4.4) is firm but does not undermine the cluster — the rejection is about the *default*, not the *principle*.
|
||||
4. The nagent corroboration (§4.6) is the strongest signal: 3 of nagent's deferred-rebuild candidates (12a, 12b, 13) directly overlap with this cluster's findings.
|
||||
5. The Manual Slop-specific adoption (§4.7) is a concrete candidate for the deferred rebuild.
|
||||
|
||||
The verdict is **Useful, with 1 firm Rejection on the default and 1 borderline adoption on the unrecognized-entity rule.**
|
||||
|
||||
---
|
||||
|
||||
**Sub-report complete.** This is the evidence base for §9 of `report.md`.
|
||||
Reference in New Issue
Block a user