--- created: '2026-04-15T04:57:47+00:00' id: 8d69359c-ee2e-4913-bab5-f3b0068b7afd keywords: - fiction - saga - ingestion - pipeline - optimization - character-trait - plot-event - theme - symbol - relationship - setting - significance-filter - section-aware - decision-tree - calibration - dungeon-crawler-carl - gitea-37 links: [] modified: '2026-04-15T04:57:47+00:00' summary: Standalone optimization spec for the Saga fiction extraction pipeline. Covers significance filtering, enhanced type specifications with real examples from Dungeon Crawler Carl, section-aware extraction, character tracking metadata, decision tree, and fiction-specific calibration measurement. tags: - spec - saga - ingestion - fiction - optimization - gitea-37 title: Saga Fiction Pipeline — Optimization Spec --- # Saga Fiction Pipeline — Optimization Spec **Author:** Atlas (Librarian & Historian) **Date:** 2025-07-14 **Status:** Proposed — awaiting developer review **Tracks:** Gitea #37 (taxonomy refinement), parent plan `muninn-taxonomy-redesign-plan.md` **Data basis:** 55 chapters of *Dungeon Crawler Carl* (job `b59c147c`), the only completed fiction ingestion --- ## 1. Purpose & Scope This spec optimizes the fiction extraction pipeline for retrieval quality. It is a standalone companion to the parent redesign plan (`docs/specs/muninn-taxonomy-redesign-plan.md`) and can be implemented independently or in parallel. **Why fiction needs its own spec:** Fiction is structurally different from non-fiction. The same extraction principles apply — MECE types, prototypical examples, binary decision trees — but the *content* being extracted is narrative, not argumentative. Fiction concepts are context-dependent in ways that non-fiction concepts are not: a character trait in chapter 1 means something different than the same trait in chapter 50. Fiction also has unique problems (over-extraction, thematic drift, implicit symbolism) that don't appear in other schemas. **What this covers:** - Significance filtering — reducing over-extraction - Type description sharpening — grounded in real extracted examples - Section-aware extraction — using chapter/position context for fiction - New metadata fields — `characters`, `is_significant` - Decision tree for the fiction schema - Baseline measurement for fiction specifically **What this does NOT cover:** - The 6 fiction types themselves — they are correct and should not be changed - Pipeline architecture changes — same parse → structure → summarize → classify → extract → index → coherence - Coherence relationship redesign — covered in the parent plan, Phase 4 - Other schemas — covered in the parent plan --- ## 2. Current State — What We Have ### 2.1 The Fiction Schema | Type | Description | Default | |---|---|---| | `character_trait` | A defining quality, motivation, or behaviour pattern of a character | — | | `plot_event` | A significant event that advances or changes the narrative | — | | `theme` | A recurring idea, moral, or philosophical thread in the work | **yes** | | `symbol` | An object, place, or event that carries deeper meaning | — | | `relationship` | A dynamic or tension between two or more characters | — | | `setting` | A described place, time period, or atmosphere | — | **Assessment:** These 6 types are the right types at the right granularity. The MECE audit in the parent plan found only one minor overlap (`relationship` vs. `character_trait`) and rated it acceptable as-is. **No type additions, removals, or renames are recommended.** ### 2.2 What the Extractor Actually Produces Based on review of 8 representative chapters from the *Dungeon Crawler Carl* ingestion (chapters 1, 3, 11, 16, 21, 30, 35, Epilogue): | Metric | Observation | |---|---| | **Concepts per chapter** | 30–50 (5–12 per type) | | **Total for the novel** | ~2,200 estimated (55 chapters × ~40) | | **Type distribution** | `character_trait` and `plot_event` dominate (~60-70% of all concepts); `symbol` consistently thinnest (~2-5%) | | **Overall quality** | Good — type assignments are defensible, verbatim quotes are accurate, descriptions capture the meaning | ### 2.3 The Problems Despite the schema being sound, there are 5 concrete problems that hurt retrieval quality: 1. **Over-extraction** — The extractor extracts everything, not just the important things. Trivial moments, one-line dialogue, and atmospheric details get the same weight as defining character traits and major plot turns. 2. **Theme drift** — Single-chapter observations about what characters do are being labeled `theme` instead of `character_trait` or `plot_event`. True themes (ideas that recur across the work) are diluted by chapter-level observations. 3. **Symbol under-extraction** — The extractor only labels explicit metaphors as symbols, missing cases where objects accumulate symbolic weight through repetition or structural positioning. 4. **No character tracking** — Concepts mention characters in the text but aren't tagged with a structured `characters` field. This prevents per-character filtering and arc analysis. 5. **No concept of narrative importance** — Every extracted concept is treated as equally significant. The first appearance of Carl's defiance and the 40th mention of Donut wanting food carry the same weight in the index. --- ## 3. Research Basis The following principles from the parent plan apply directly to fiction optimization: ### 3.1 Prototypicality (Rosch 1978) > *"Effects of prototypicality on processing speed, learning, item output, and natural language use are documented."* **Application to fiction:** The extractor should extract *prototypical* instances of each type, not every instance. A prototypical `character_trait` is a defining quality revealed through repeated behavior — Carl's pragmatic survivalism, Donut's narcissism masking insecurity, the Maestro's sadistic showmanship. A momentary reaction ("Donut twisted in my arms") is an atypical instance that adds retrieval noise without value. ### 3.2 Mirror Document Structure (LandingAI 2025) > *"Organize schema to reflect how data appears in parsed Markdown and how it will be used; match document flow order."* **Application to fiction:** Fiction has a *narrative arc* — early chapters establish characters and world, middle chapters complicate, late chapters resolve. The extractor should know where it is in this arc. A trait introduced in chapter 1 is probably a *defining* trait. The same trait mentioned in chapter 40 is probably *continuity*, not new information. Section-aware extraction (parent plan §4.6) is critical for fiction. ### 3.3 Descriptive Field Names (LandingAI 2025) > *"Field names should clearly indicate what data to extract; descriptions provide additional context."* **Application to fiction:** The current type descriptions are adequate but don't distinguish *defining* from *incidental*. The enhanced type specs should include explicit significance criteria. ### 3.4 Binary Decision Trees (Visser et al. 2021) > *"A decision tree heuristic helps annotators classify arguments through binary questions."* **Application to fiction:** The fiction schema has 6 types with moderate adjacency (especially `character_trait` vs. `relationship`, `theme` vs. `character_trait`). A binary decision tree will reduce classification hesitation. --- ## 4. Changes — What to Build ### 4.1 Significance Filter The highest-ROI change. Add a significance criterion to the extraction prompt that instructs the extractor to skip trivial content. **Implementation:** Add a preamble instruction to the fiction extraction prompt: ``` SIGNIFICANCE CRITERIA: Only extract concepts that meet at least ONE of the following: (a) The concept is RECURRING — it appears or is referenced across multiple sections (b) The concept is DEFINING — it establishes or reveals a core quality, dynamic, or element (c) The concept is STRUCTURALLY IMPORTANT — it advances the plot, introduces a key setting, establishes a relationship, or signals a thematic shift Do NOT extract: - Momentary physical actions or brief emotional reactions that are not revealing - Dialogue snippets that convey only information exchange, not character - Atmospheric or sensory details that do not establish meaningful world-building - Redundant restatements of concepts already extracted in the same chapter Target: 5–10 concepts per chapter section, not 30–50. ``` **Expected impact:** Reduces concept count from ~40/chapter to ~8–12/chapter. For a 55-chapter novel, this means ~440–660 concepts instead of ~2,200 — a ~70% reduction that dramatically improves retrieval precision. **Type-by-type significance criteria (additional guidance):** | Type | Extract this | Skip this | |---|---|---| | `character_trait` | Motivations, behavioral patterns, personality qualities that define who the character is and explain their choices | Momentary physical actions ("she scratched her nose"), brief emotional reactions, transient states | | `plot_event` | Events that change the situation, introduce new stakes, or advance the timeline significantly | Minor actions, routine travel, casual dialogue exchanges | | `theme` | Philosophical ideas or moral questions that the work returns to across multiple chapters | Single-chapter observations about what happened ("Carl chooses to abandon the goblins") | | `symbol` | Objects, places, or events that carry metaphorical weight through repetition, contrast, or structural positioning | Explicit one-line metaphors that don't recur | | `relationship` | Dynamics that reveal how characters relate to each other in a meaningful, ongoing way | Brief interactions, one-line dialogue exchanges | | `setting` | World-building details that establish the rules, atmosphere, or geography of a significant location | Sensory descriptions of places the characters pass through briefly | ### 4.2 Enhanced Type Specifications Upgrade each of the 6 fiction types from a single-sentence description to a structured specification following the format in the parent plan (§4.1). All examples below are drawn from the *Dungeon Crawler Carl* extraction. #### `character_trait` ```yaml character_trait: label: "Character Trait" short_description: "A defining quality, motivation, or behaviour pattern of a character" long_description: | A personality trait, motivation, behavioral pattern, or psychological quality that DEFINES a character and explains their choices across the narrative. This is not a momentary action or fleeting emotion — it is something the character consistently demonstrates or that is revealed through multiple instances over time. linguistic_cues: - "He always..." / "She never failed to..." - "It was in his nature to..." / "That was just like her." - First-person narrator reflecting on their own patterns: "I found myself..." - Character repeatedly making the same type of choice disambiguation: - "NOT a momentary physical action (that's narrative color, not a trait)" - "NOT a brief emotional reaction — must be consistent or defining" - "NOT a relationship dynamic (use 'relationship' for how characters interact)" - "NOT a plot event (even if it reveals character — if it's primarily an event, use 'plot_event')" significance_criteria: - "The trait explains WHY the character makes certain choices" - "The trait is demonstrated across multiple scenes or chapters" - "The trait contrasts with another character's approach, revealing both" prototypical_examples: - | Carl possesses a calculating and opportunistic nature, immediately recognizing game-breaking bugs as exploitable advantages rather than mere glitches. "This was a bug. A bug I could exploit." - | Donut maintains an unwavering self-obsession and desire for spectacle even in mortal danger, treating the dungeon as her stage. "I promise all of you. You guys are going to want to follow me and Carl." - | The Maestro combines sadistic enjoyment with professional showmanship, framing cruelty as entertainment. non_examples: - "Donut twisted in my arms, scratching at me, trying to get free" # momentary physical action, not a defining trait - "I didn't dare take off my shirt or cloak" # brief reaction, context-dependent — not a personality quality priority: 1 ``` #### `plot_event` ```yaml plot_event: label: "Plot Event" short_description: "A significant event that advances or changes the narrative" long_description: | An event that meaningfully changes the situation for the characters — introducing new stakes, revealing critical information, defeating a boss, entering a new floor, meeting a significant character, or making a choice that has lasting consequences. The test: does the narrative after this event look different from the narrative before it? linguistic_cues: - "And then..." / "Suddenly..." / "That was when..." - Scene transitions that mark a significant shift - Revelation or discovery moments - Confrontation or battle outcomes disambiguation: - "NOT routine travel or minor encounters that don't change the situation" - "NOT dialogue exchanges that only convey information already known" - "NOT character actions that reveal personality but don't advance the plot" significance_criteria: - "The characters' circumstances change meaningfully after this event" - "New information is revealed that affects future choices" - "A relationship is formed, broken, or fundamentally altered" prototypical_examples: - | Carl and Donut are approached by Lexis, who congratulates them on defeating their boss and reaching the second floor, introducing the reality show broadcast element that will define the novel's stakes. - | The revelation of two surprise guests watching from empty chairs confirms that Carl's survival has made him a target for other elite crawlers within the dungeon system. - | Carl experiences intense moral guilt after realizing he killed goblin infants during the boss fight, a turning point in his relationship with violence in the dungeon. non_examples: - | "I stood, bewildered as all around me, the goblins burst into a screeching frenzy of activity." # atmospheric narration, not a structurally significant event - "I counted, and I had nine cigarettes left after this one." # minor resource tracking, not a plot turn priority: 2 ``` #### `theme` ```yaml theme: label: "Theme" short_description: "A recurring idea, moral, or philosophical thread in the work" long_description: | A philosophical idea, moral question, or recurring tension that the work explores across MULTIPLE chapters or the entire narrative arc. Themes are not single-chapter observations — they are ideas that the author returns to, complicates, and develops over time. A true theme can be stated as a question or proposition that the work asks the reader to consider. linguistic_cues: - Recurring patterns that the narrator reflects on explicitly - Moments of moral conflict or ethical questioning - Authorial commentary (explicit or through character reflection) - Structural parallels across different parts of the narrative disambiguation: - "NOT a plot observation framed as a theme ('Carl chooses survival over morality')" - "NOT a character observation ('Carl prioritizes survival') — use 'character_trait'" - "NOT a single-chapter insight — must recur across multiple sections" - "NOT a setting description, even one with thematic weight" significance_criteria: - "The idea is explored from multiple angles across the narrative" - "Characters struggle with this idea in different contexts" - "The narrative's resolution (or deliberate lack of resolution) speaks to this idea" prototypical_examples: - | The narrative explores the tension between survival pragmatism and moral conscience — whether the dungeon's rules justify abandoning one's humanity. This recurs across multiple chapters as Carl repeatedly faces choices between efficiency and empathy. - | The absurdity and trivialization of life-and-death struggles through entertainment framing: the dungeon is a reality show where death is content, forcing characters to perform their suffering for an audience that treats it as spectacle. - | The dehumanizing effect of treating sentient beings as content — the dungeon's viewers see crawlers as characters in a show, reducing real suffering to entertainment value. non_examples: - | "The narrative highlights the unpredictable nature of the dungeon" # this is a plot observation, not a philosophical thread - "Carl prioritizes survival over moral consideration" # this is a character observation, not a recurring thematic question priority: 3 ``` #### `symbol` ```yaml symbol: label: "Symbol" short_description: "An object, place, or event that carries deeper meaning" long_description: | An object, place, image, or event that carries metaphorical or thematic weight BEYOND its literal function in the story. Symbols work through accumulation — a single mention rarely qualifies. Look for objects or images that RECUR across multiple chapters, that the narrative lingers on with unusual descriptive attention, or that gain meaning through contrast with their ordinary function. linguistic_cues: - Unusually detailed or lyrical description of a mundane object - Objects that characters fixate on or return to - Events described with language that exceeds their literal significance - Objects that appear at structurally important moments (beginnings, endings, turning points) disambiguation: - "NOT a one-time metaphor — must recur or carry structural weight" - "NOT a setting description, even a vivid one — symbols point BEYOND themselves" - "NOT a plot event that happens to have symbolic resonance — if the primary function is plot, use 'plot_event'" significance_criteria: - "The object/image appears in multiple chapters or at structurally significant moments" - "The narrative draws attention to it with unusual descriptive language" - "Its meaning deepens or changes across the narrative" prototypical_examples: - | Carl's dwindling cigarette supply serves as a tangible representation of his limited resources, his connection to his pre-dungeon identity, and the precarious nature of survival. The counting recurs across multiple chapters. "I counted, and I had nine left after this one." - | Carl's childhood Frogger video game serves as a symbol of his isolated upbringing and is cataloged by the dungeon as a potential artifact — the game that defined his childhood literally becomes a weapon in the world that will define the rest of his life. - | The system's bureaucratic, cheerful language ("Congratulations! You've been designated Crawler Number 4,122!") symbolizes the dehumanizing effect of framing life-or-death situations as entertainment, recurring throughout as a tonal counterpoint. non_examples: - "The ground was hot to the touch" # sensory detail, not symbolic - "He picked up a sword" # functional object, not symbolic priority: 4 ``` #### `relationship` ```yaml relationship: label: "Relationship" short_description: "A dynamic or tension between two or more characters" long_description: | A meaningful dynamic between two or more characters — how they relate to each other, what tensions or bonds define their interactions, and how this dynamic shapes the narrative. The key distinction from `character_trait`: character_trait describes a quality of ONE character; relationship describes the INTERACTION between two or more. linguistic_cues: - Recurring patterns in how two characters speak to or about each other - Moments of trust, betrayal, conflict, or vulnerability between characters - Characters finishing each other's thoughts, anticipating needs, or misunderstanding each other - Power dynamics (one character deferring to, protecting, or manipulating another) disambiguation: - "NOT a trait of a single character — must describe how characters interact" - "NOT a plot event between characters — if the focus is what happened, not how they relate, use 'plot_event'" - "NOT a one-line dialogue exchange — must reveal a pattern or dynamic" significance_criteria: - "The dynamic is consistent across multiple scenes" - "The dynamic affects character choices and plot direction" - "The dynamic changes or evolves across the narrative" prototypical_examples: - | Carl and Donut share a protective dynamic where Carl shields Donut from danger while Donut provides emotional grounding. This manifests as Carl's pragmatism clashing with Donut's innocence, and mutual reliance despite their personality differences. - | A tension exists between Carl, who views their reality with dread, and Donut, who embraces the spectacle and adulation of the crowd — their opposing orientations to the dungeon define their partnership. - | Carl maintains a fierce internal defiance against the dungeon's audience and AI, creating a three-way relationship between Carl, the system that controls him, and the spectators who consume him. non_examples: - | "'Goddamnit, Donut,' I said. 'I knew we should've gone with the grub.'" # a single dialogue exchange, not a relationship dynamic priority: 5 ``` #### `setting` ```yaml setting: label: "Setting" short_description: "A described place, time period, or atmosphere" long_description: | A meaningful description of a place, time period, or atmosphere that establishes the world of the story. Settings that should be extracted are those that MATTER — they establish rules, create atmosphere that affects the narrative, or define a location that will be significant to the plot. Routine or atmospheric descriptions of places the characters merely pass through should be skipped. linguistic_cues: - Extended descriptive passages focused on place or atmosphere - Rules or constraints of a world explicitly stated - Descriptions that establish mood or tone for a significant section - Architectural or geographical details that will matter for plot disambiguation: - "NOT a sensory detail of a place characters pass through briefly" - "NOT a single object in a room — that might be a 'symbol' or just narrative color" - "NOT the dungeon's game mechanics (unless described as part of the world-building)" significance_criteria: - "The location will be important to future plot events" - "The atmosphere contributes to the thematic register" - "The description establishes rules or constraints of the fictional world" prototypical_examples: - | The dungeon environment imposes a rigid, unnatural order upon its inhabitants and geography, contrasting the organic chaos of the surface world with geometric precision. "Each section was still a perfect, giant square. And within each square, there appeared to be four neighborhoods." - | The dungeon is described as an entire constructed world composed of interconnected hallways and paths with specific architectural constraints like low ceilings in side tunnels. - | The dungeon environment is characterized by featureless, pitch-black alleys where enemies can hide undetected, establishing the constant threat that defines the second floor experience. non_examples: - "The ground was hot to the touch" # sensory detail, not meaningful world-building - "Everything in this maze was featureless so far. I saw no signs of life." # if this is the ONLY description, it's weak — skip unless it recurs priority: 6 ``` ### 4.3 New Metadata Fields Add two new metadata fields specific to the fiction schema: #### `characters` (array of strings) A structured list of character names referenced in the concept. This enables per-character filtering and arc tracking across chapters. ```yaml # In concept output: { "concept_type": "character_trait", "characters": ["Carl", "Donut"], "description": "Carl and Donut share a protective dynamic...", ... } ``` **Why:** Currently, character names are embedded in the description text but not queryable as structured metadata. A user searching for "all concepts about Carl" relies on semantic search through description text, which is noisy. A `characters` field enables exact filtering: `WHERE "Carl" IN characters AND concept_type = "character_trait"`. **Population:** The extractor should extract character names from the concept description and verbatim quote. For the fiction schema only. #### `is_significant` (boolean, auto-populated) An auto-populated field that indicates whether the concept meets the significance criteria in §4.1. This is set by the extractor during extraction. ```yaml # In concept output: { "concept_type": "character_trait", "is_significant": true, "description": "Carl possesses a calculating and opportunistic nature...", ... } ``` **Why:** This enables a downstream quality filter. An agent querying the KB can filter to `is_significant = true` to get only the high-signal concepts. This is especially valuable for large novels where the raw concept count can be overwhelming. **Implementation note:** The extractor already makes a significance judgment by deciding whether to extract or skip. This field makes that judgment explicit and queryable. ### 4.4 Binary Decision Tree for Fiction ``` Is the concept primarily about HOW a character IS (their qualities, motivations, patterns)? YES: Does it describe how TWO OR MORE characters interact with each other? YES → RELATIONSHIP NO → CHARACTER_TRAIT NO: Is the concept an EVENT that changes the situation or advances the story? YES → PLOT_EVENT NO: Is the concept a recurring philosophical idea or moral question that the work explores across multiple chapters? YES → THEME NO: Does the concept describe a place, time, or atmosphere that establishes the world of the story? YES → SETTING NO: Is the concept an object, image, or event that carries metaphorical weight beyond its literal function? YES → SYMBOL NO → THEME (default fallback) ``` **Design notes:** - `CHARACTER_TRAIT` and `RELATIONSHIP` share the first fork (is this about character?) because they are the most commonly confused pair and the highest-priority types. - `PLOT_EVENT` is third because it's the second-most-common type and clearly distinct from character-focused concepts. - `THEME` is checked before `SETTING` and `SYMBOL` because themes are the default type and the most retrieval-valuable. - The default fallback is `THEME` — if nothing else fits, the concept probably carries thematic weight even if the extractor can't articulate it. ### 4.5 Section-Aware Extraction for Fiction Fiction benefits from section-aware extraction more than any other schema. The parent plan (§4.6) specifies the mechanism; this section specifies the fiction-specific application. **Fiction-specific position priors:** | Position | Types more likely | Types less likely | |---|---|---| | **Early chapters (0–20%)** | `character_trait`, `setting`, `relationship` | `theme`, `symbol` | | **Middle chapters (20–80%)** | `plot_event`, `character_trait`, `relationship` | `setting` | | **Late chapters (80–100%)** | `theme`, `symbol`, `plot_event` | `character_trait`, `setting` | **How this works in practice:** The extractor sees the section context block and naturally adjusts its priors. No explicit type-weighting rules are needed — the LLM responds to context. A section titled "Chapter 1: The Box" at position 2% will prime the extractor for character introduction and world establishment. A section titled "Epilogue" at position 98% will prime for thematic resolution and symbolic closure. **Additional fiction context:** For fiction specifically, the extractor prompt should also receive: ```yaml section_context: document_title: "Dungeon Crawler Carl" chapter_title: "Second Floor: The Borrows" chapter_number: 11 section_title: "The Bakery" section_position: "middle" # early/middle/late document_position: 0.20 # fraction through the novel pov_character: "Carl" # narrative point-of-view character, if identifiable characters_in_section: ["Carl", "Donut", "Mongo"] # characters mentioned in this section ``` The `pov_character` and `characters_in_section` fields are fiction-specific enrichment. They help the extractor understand perspective and make better decisions about `character_trait` vs. `relationship` (is this Carl reflecting on himself, or is the narrator observing others?). ### 4.6 Fiction Coherence Relationships The parent plan (§4.7) proposes a dimensional coherence model (alignment × function × scope). For fiction, the following derived labels are most relevant: | Fiction-relevant relationship | When it applies | |---|---| | `develops` | A character trait in chapter 1 is deepened or complicated by a later concept | | `contrasts` | Two concepts show a character acting differently in different contexts | | `foreshadows` | An early concept anticipates a later plot event or revelation | | `echoes` | A symbol or theme reappears with changed meaning in a later chapter | | `parallels` | Two characters or situations reflect each other structurally | These are not new relationship *types* — they derive from the dimensional model in the parent plan. `develops` = alignment=supportive, function=extends, scope=same. `foreshadows` = alignment=supportive, function=warrants, scope=same. The dimensional model handles them natively. **Recommendation:** No fiction-specific coherence changes beyond what the parent plan proposes. The dimensional model is already expressive enough. --- ## 5. Baseline Measurement — Fiction-Specific ### 5.1 Calibration Dataset for Fiction Use the existing *Dungeon Crawler Carl* ingestion as the calibration source: 1. **Select 8 chapters** spanning the narrative arc: chapters 1, 5, 11, 16, 21, 30, 40, 55 (epilogue) 2. **Hand-annotate 20–30 concepts per chapter** (160–240 total) using the enhanced type specs from §4.2 3. **Mark each concept as significant or not** using the significance criteria from §4.1 4. **Record character names** for each concept (as they should appear in the `characters` field) 5. **Record disambiguation notes** where the annotator hesitated ### 5.2 What to Measure | Metric | Target | Why | |---|---|---| | Type agreement vs. hand labels | ≥85% | Same as parent plan target | | Significance precision | ≥80% | Of concepts the extractor marks as significant, ≥80% should match hand annotations | | Significance recall | ≥70% | The extractor should catch at least 70% of the concepts hand-annotated as significant | | Character name accuracy | ≥90% | Character extraction is simpler than type classification | | Concepts per chapter (post-filter) | 8–15 | Validate that the significance filter reduces over-extraction | ### 5.3 Confusion Pairs to Watch Based on the review of actual extractions, the most likely confusion pairs are: | Pair | Why they confuse | Expected confusion rate | |---|---|---| | `character_trait` / `relationship` | Both describe character qualities; the difference is single-character vs. interaction | 15–20% | | `theme` / `character_trait` | A character's moral conflict can look like a theme | 10–15% | | `theme` / `plot_event` | "Carl chooses survival over morality" — is this a plot choice or a thematic moment? | 5–10% | | `setting` / `symbol` | A world-building detail can carry symbolic weight | 5–10% | | `plot_event` / `relationship` | A significant interaction between characters is both an event and a relationship marker | 5–10% | --- ## 6. Implementation Tasks ### Phase 1 — Enhanced Fiction Type Specs (small effort) 1. [ ] Update `config.yaml` fiction schema with the enhanced type specifications from §4.2 2. [ ] Add the significance criteria preamble to the fiction extraction prompt (§4.1) 3. [ ] Add the fiction binary decision tree to the extraction prompt (§4.4) 4. [ ] Add `characters` and `is_significant` metadata fields to the fiction concept output schema 5. [ ] Add fiction-specific `scope` statement to the schema in config.yaml 6. [ ] Update `docs/specs/concept-taxonomy-reference.md` to reflect all fiction changes ### Phase 2 — Section-Aware Fiction Extraction (small-medium effort) 1. [ ] Wire section metadata (chapter title, chapter number, position fraction) into the fiction extraction prompt — same mechanism as parent plan §4.6 2. [ ] Add `pov_character` and `characters_in_section` to the section context block (fiction-specific enrichment) 3. [ ] Test on 2–3 existing chapters to verify context appears correctly ### Phase 3 — Measure & Iterate (medium effort) 1. [ ] Hand-annotate the 8 calibration chapters using §5.1 protocol 2. [ ] Run the updated extractor against the same chapters 3. [ ] Compare type agreement, significance precision/recall, character name accuracy 4. [ ] Generate confusion matrix — focus on the 5 expected confusion pairs from §5.3 5. [ ] For each confused pair: sharpen disambiguation rules or adjust significance criteria 6. [ ] Re-run and re-measure until targets met 7. [ ] Record final metrics ### Phase 4 — Re-ingest Full Novel (small effort, optional) 1. [ ] Re-run the full *Dungeon Crawler Carl* ingestion with the updated fiction pipeline 2. [ ] Compare concept counts (should be ~60-70% reduction) 3. [ ] Spot-check retrieval quality with 5–10 representative queries 4. [ ] Update `concept-taxonomy-reference.md` with final fiction schema documentation --- ## 7. What This Does NOT Change - **The 6 types** — `character_trait`, `plot_event`, `theme`, `symbol`, `relationship`, `setting` are all preserved - **The default type** — `theme` remains the default (correct for fiction) - **The pipeline architecture** — parse → structure → summarize → classify → extract → index → coherence is unchanged - **Other schemas** — this spec is fiction-only; non-fiction schemas are covered by the parent plan - **The coherence relationship model** — fiction uses the same dimensional model as everything else (parent plan §4.7) --- ## 8. Relationship to Parent Plan This spec is designed to be implementable independently, but it fits into the parent plan's phase structure: | This spec's phase | Parent plan phase | Dependency | |---|---|---| | Phase 1 (enhanced type specs) | Phase 1 (enhanced type specs) | Parallel — can be done simultaneously | | Phase 2 (section-aware) | Phase 2 (section-aware) | Shared — same mechanism, fiction-specific context fields | | Phase 3 (measure & iterate) | Phase 0 (baseline) + Phase 3 (re-measure) | Sequence — needs the validation infrastructure from parent Phase 0 | | Phase 4 (re-ingest) | Phase 3 (finalize) | After — wait for both specs to stabilize | **Recommendation:** Implement this spec's Phase 1 in parallel with the parent plan's Phase 1. Coordinate on Phase 2 (shared section-awareness infrastructure). Do Phase 3 calibration together (the calibration dataset should include both fiction and non-fiction documents). --- ## 9. References - Parent plan: `docs/specs/muninn-taxonomy-redesign-plan.md` - Taxonomy reference: `docs/specs/concept-taxonomy-reference.md` - Rosch, E. (1978). *Principles of Categorization* — prototypicality, basic-level categories - LandingAI (2025). *LLM Extraction Schema Design* — descriptive fields, document-mirroring - Visser, S. et al. (2021). *Argument Scheme Annotation* — decision tree heuristics - Data source: *Dungeon Crawler Carl* ingestion (job `b59c147c`, 55 chapters) --- ## Appendix A: Changes Summary | What | Current | Proposed | Phase | |---|---|---|---| | Type descriptions | 1-sentence label | Structured spec (long desc + cues + disambiguation + examples + significance criteria + non-examples) | 1 | | Significance filter | None | Preamble instruction + per-type criteria + `is_significant` field | 1 | | Character tracking | None (names in text only) | Structured `characters` array field | 1 | | Decision tree | None | Binary tree for 6 fiction types | 1 | | Section context | Not passed to extractor | Chapter title/number, position fraction, POV character, characters in section | 2 | | Concept count per chapter | ~30–50 | ~8–15 (after significance filter) | 1 | | Non-examples in type specs | None | `non_examples` field for each type | 1 | | Fiction calibration dataset | None | 8 chapters, 160–240 hand-annotated concepts | 3 | | Measurement targets | None | ≥85% type agreement, ≥80% significance precision, ≥90% character accuracy | 3 |