feat: Rewrote stage5_synthesis.txt with v2 body_sections (list-of-objec…
- "prompts/stage5_synthesis.txt" - "prompts/stage5_synthesis.20260403_005044.bak" GSD-Task: S01/T02
This commit is contained in:
parent
15dcab201a
commit
ca5aa3dec0
5 changed files with 360 additions and 8 deletions
|
|
@ -29,7 +29,7 @@
|
|||
- Estimate: 30m
|
||||
- Files: backend/pipeline/schemas.py, backend/pipeline/citation_utils.py, backend/pipeline/test_citation_utils.py
|
||||
- Verify: cd /home/aux/projects/content-to-kb-automator && python -m pytest backend/pipeline/test_citation_utils.py -v
|
||||
- [ ] **T02: Rewrite stage 5 prompt output format for nested sections and citations** — Rewrite the output format section of `prompts/stage5_synthesis.txt` to produce the new list-of-objects body_sections structure with inline [N] citation markers. Preserve all voice, tone, synthesis philosophy, and body section naming guidance. Back up the current prompt before editing.
|
||||
- [x] **T02: Rewrote stage5_synthesis.txt with v2 body_sections (list-of-objects with heading/content/subsections), citation rules ([N] and [N,M] format), body_sections_format tag, and H3 subsection guidance** — Rewrite the output format section of `prompts/stage5_synthesis.txt` to produce the new list-of-objects body_sections structure with inline [N] citation markers. Preserve all voice, tone, synthesis philosophy, and body section naming guidance. Back up the current prompt before editing.
|
||||
|
||||
## Steps
|
||||
|
||||
|
|
|
|||
22
.gsd/milestones/M014/slices/S01/tasks/T01-VERIFY.json
Normal file
22
.gsd/milestones/M014/slices/S01/tasks/T01-VERIFY.json
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
"schemaVersion": 1,
|
||||
"taskId": "T01",
|
||||
"unitId": "M014/S01/T01",
|
||||
"timestamp": 1775177430503,
|
||||
"passed": true,
|
||||
"discoverySource": "task-plan",
|
||||
"checks": [
|
||||
{
|
||||
"command": "cd /home/aux/projects/content-to-kb-automator",
|
||||
"exitCode": 0,
|
||||
"durationMs": 4,
|
||||
"verdict": "pass"
|
||||
},
|
||||
{
|
||||
"command": "python -m pytest backend/pipeline/test_citation_utils.py -v",
|
||||
"exitCode": 0,
|
||||
"durationMs": 318,
|
||||
"verdict": "pass"
|
||||
}
|
||||
]
|
||||
}
|
||||
78
.gsd/milestones/M014/slices/S01/tasks/T02-SUMMARY.md
Normal file
78
.gsd/milestones/M014/slices/S01/tasks/T02-SUMMARY.md
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
---
|
||||
id: T02
|
||||
parent: S01
|
||||
milestone: M014
|
||||
provides: []
|
||||
requires: []
|
||||
affects: []
|
||||
key_files: ["prompts/stage5_synthesis.txt", "prompts/stage5_synthesis.20260403_005044.bak"]
|
||||
key_decisions: ["Citations placed end-of-sentence before period, matching academic convention", "Sections with subsections use empty-string content field, substance lives in subsections"]
|
||||
patterns_established: []
|
||||
drill_down_paths: []
|
||||
observability_surfaces: []
|
||||
duration: ""
|
||||
verification_result: "Ran task verification command: python -c asserting body_sections_format, Citation rules, and subsections presence in prompt file — all passed. Ran comprehensive check verifying all 15 original section headings preserved, v2 JSON example has both empty and populated subsections arrays, field rules updated."
|
||||
completed_at: 2026-04-03T00:52:45.317Z
|
||||
blocker_discovered: false
|
||||
---
|
||||
|
||||
# T02: Rewrote stage5_synthesis.txt with v2 body_sections (list-of-objects with heading/content/subsections), citation rules ([N] and [N,M] format), body_sections_format tag, and H3 subsection guidance
|
||||
|
||||
> Rewrote stage5_synthesis.txt with v2 body_sections (list-of-objects with heading/content/subsections), citation rules ([N] and [N,M] format), body_sections_format tag, and H3 subsection guidance
|
||||
|
||||
## What Happened
|
||||
---
|
||||
id: T02
|
||||
parent: S01
|
||||
milestone: M014
|
||||
key_files:
|
||||
- prompts/stage5_synthesis.txt
|
||||
- prompts/stage5_synthesis.20260403_005044.bak
|
||||
key_decisions:
|
||||
- Citations placed end-of-sentence before period, matching academic convention
|
||||
- Sections with subsections use empty-string content field, substance lives in subsections
|
||||
duration: ""
|
||||
verification_result: passed
|
||||
completed_at: 2026-04-03T00:52:45.317Z
|
||||
blocker_discovered: false
|
||||
---
|
||||
|
||||
# T02: Rewrote stage5_synthesis.txt with v2 body_sections (list-of-objects with heading/content/subsections), citation rules ([N] and [N,M] format), body_sections_format tag, and H3 subsection guidance
|
||||
|
||||
**Rewrote stage5_synthesis.txt with v2 body_sections (list-of-objects with heading/content/subsections), citation rules ([N] and [N,M] format), body_sections_format tag, and H3 subsection guidance**
|
||||
|
||||
## What Happened
|
||||
|
||||
Backed up the current prompt, then made four targeted edits: added H3 subsection guidance under Body sections structure, added a new Citation rules section with [N] and [N,M] format definitions, rewrote the Output format JSON example with list-of-objects body_sections showing both flat and nested sections with inline citation markers and body_sections_format: v2, and updated the Field rules to describe the new format. All non-output sections preserved unchanged. Prompt grew from 206 to 252 lines.
|
||||
|
||||
## Verification
|
||||
|
||||
Ran task verification command: python -c asserting body_sections_format, Citation rules, and subsections presence in prompt file — all passed. Ran comprehensive check verifying all 15 original section headings preserved, v2 JSON example has both empty and populated subsections arrays, field rules updated.
|
||||
|
||||
## Verification Evidence
|
||||
|
||||
| # | Command | Exit Code | Verdict | Duration |
|
||||
|---|---------|-----------|---------|----------|
|
||||
| 1 | `python -c "...assert 'body_sections_format' in t; assert 'Citation rules' in t..."` | 0 | ✅ pass | 50ms |
|
||||
| 2 | `python3 -c "...check all sections preserved, new content present..."` | 0 | ✅ pass | 50ms |
|
||||
|
||||
|
||||
## Deviations
|
||||
|
||||
None.
|
||||
|
||||
## Known Issues
|
||||
|
||||
None.
|
||||
|
||||
## Files Created/Modified
|
||||
|
||||
- `prompts/stage5_synthesis.txt`
|
||||
- `prompts/stage5_synthesis.20260403_005044.bak`
|
||||
|
||||
|
||||
## Deviations
|
||||
None.
|
||||
|
||||
## Known Issues
|
||||
None.
|
||||
207
prompts/stage5_synthesis.20260403_005044.bak
Normal file
207
prompts/stage5_synthesis.20260403_005044.bak
Normal file
|
|
@ -0,0 +1,207 @@
|
|||
You are writing a technique reference page for music producers. Your job is to teach. You watched this creator work, absorbed their methods, and now you're writing the clear, instructive guide that helps another producer apply these techniques in their own sessions. Your tone is direct and knowledgeable — a senior colleague walking someone through an approach they've validated in practice.
|
||||
|
||||
## What you are creating
|
||||
|
||||
A Chrysopedia technique page teaches a specific production method. Not a video summary. Not a blog post. A clear, instructive reference that a producer can follow in their DAW.
|
||||
|
||||
A producer should be able to read this page and apply the technique. If they can't, the page failed.
|
||||
|
||||
The page contains:
|
||||
1. **Instructive prose** — substantive paragraphs that teach the technique step by step. Every paragraph earns its place with at least one specific, actionable detail. If a paragraph could be deleted without losing anything concrete, delete it.
|
||||
2. **Key moments index** — reference list of the source moments for readers who want to trace information back to the original content.
|
||||
|
||||
## Voice and tone
|
||||
|
||||
Your tone is instructive and confident. You're teaching a technique, not narrating someone's session. The creator is the source — they discovered it, they validated it — but the page teaches it as method.
|
||||
|
||||
- **Instructive, not narrative** — write "Route the effect at 100% wet on a parallel lane, then control level via gain" rather than "He routes the effect at 100% wet." The reader is here to learn a technique, not to read about what someone did. Use imperative/instructive phrasing ("set", "route", "use", "check") for methods. The page reads like a lesson, not a biography.
|
||||
- **No hesitation** — state techniques as established method. "Set the LFO to 3/16th timing" not "you might want to try setting the LFO to around 3/16th."
|
||||
- **Direct quotes for personality** — pull 2-3 direct quotes per page where the creator's phrasing is vivid or memorable. These give the page life. Introduce them with a brief attribution ("as he puts it," or "in his words,") then let the quote do the work. Outside of quotes, the prose teaches — no attribution needed.
|
||||
- **Specific and grounded** — every technical claim needs concrete backing: plugin names, settings, frequencies, ratios, time values, routing decisions. "Use some compression" is worthless. "OTT at 30% depth on the bus" is useful.
|
||||
- **Match the energy of the source** — if the creator is hyped about a technique, let that land. If they're cautionary, make it feel urgent.
|
||||
- **Efficiency** — say it once, say it well. If a sentence doesn't teach something specific or make the next specific thing clearer, cut it.
|
||||
|
||||
### Creator name usage — hard rule
|
||||
|
||||
The body sections are written as instructional content, not a biography. The creator's name appears in the **title** and **summary** for attribution — that's where the reader learns whose technique this is. The body sections then TEACH the technique directly, like a lesson book or a well-written blog post.
|
||||
|
||||
The creator's name should appear **at most once** in the entire body_sections content — and only when introducing a direct quote for the first time. Otherwise, the prose is instructive: "do this", "set this to X", "route the signal through Y." Not "he does this", "she sets this to X."
|
||||
|
||||
BAD — third-person narration in every section:
|
||||
> **Section 1:** "Keota solves this by creating dedicated analog modules..."
|
||||
> **Section 2:** "Keota uses Ableton's Remap plugin with a quantized staircase..."
|
||||
> **Section 3:** "Keota separates the modulation effect from the carrier..."
|
||||
> **Section 4:** "Keota compares options systematically..."
|
||||
|
||||
Each section re-introduces the creator as if the reader forgot whose page they're on. This reads like a Wikipedia article about a person, not a technique reference.
|
||||
|
||||
GOOD — instructive voice, teaches the reader directly:
|
||||
> **Section 1:** "The approach builds each harmonic as a separate parallel module with independent gain. Start with the 3rd harmonic, then optionally add the 5th, 6th, or 7th..."
|
||||
> **Section 2:** "Use Ableton's Remap with a quantized staircase curve to force any wavetable into discrete harmonic steps. Set up a harmonic control knob, map it to a quantized 8-step curve..."
|
||||
> **Section 3:** "To separate the modulation effect from the carrier signal, turn off the oscillator output and route through a mix module instead..."
|
||||
> **Section 4:** "When choosing waveforms for FM-style patches, compare the harmonic series wavetable against sync smooth sine..."
|
||||
|
||||
The second version teaches a technique. The first version describes a person. Write the second version. Direct quotes naturally attribute themselves: "as he puts it, '...'" — that's the only place a pronoun reference to the creator is needed.
|
||||
|
||||
## Body sections structure
|
||||
|
||||
Frame sections around the problems the creator is solving or the situations a producer would recognize, not the tools being used.
|
||||
|
||||
Good section names sound like something you'd say to a friend in the studio:
|
||||
- "Why your bass disappears in mono" / "Getting the snare to cut without killing the vocal" / "The 90-200Hz gap that makes everything feel disconnected" / "Adding movement without losing the pocket"
|
||||
|
||||
Bad section names sound like a textbook table of contents:
|
||||
- "Overview" / "EQ Settings" / "Understanding Phase Plant signal flow" / "Compression Techniques" / "Final Thoughts"
|
||||
|
||||
The test: would a producer ever search for this phrase when they're stuck? "Why your bass disappears in mono" — yes. "Understanding Phase Plant signal flow" — no, that's a manual heading, not a studio problem.
|
||||
|
||||
Each section: 2-4 paragraphs of substantive prose, minimum 150 words per section. Flow logically within each section. **Merge thin topics aggressively** — if a section would only have 1 paragraph, fold it into the most related section. Never generate a section with fewer than 2 paragraphs.
|
||||
|
||||
**Page minimum thresholds — hard rules:**
|
||||
- A page MUST have at least 3 sections and at least 400 words total. If the content can't fill this, it is too thin to be a standalone page.
|
||||
- If a category has fewer than 3 moments, DO NOT generate a standalone page for it. Instead, fold those moments into the most related page from another category.
|
||||
- NEVER generate a page with only 1 section. That's a paragraph, not a technique page.
|
||||
- Prefer fewer, richer pages over many thin ones. 3 substantial pages is always better than 6 stubs.
|
||||
|
||||
## Plugin and detail rules
|
||||
|
||||
Every specific value needs its context — why this number, what problem it solves, when you'd change it.
|
||||
|
||||
Don't just list "attack +6dB" — explain that the transient shaper is set to +6dB attack because the goal is to punch the initial click through without relying on compression (which adds sustain as a side effect). The value and the reasoning form a unit.
|
||||
|
||||
Include plugin names and settings only when the creator was teaching that setting — spending time on why they chose it. A plugin merely visible in their session belongs in the plugins list, not the prose.
|
||||
|
||||
Never use vague fill: "experiment with settings," "adjust to taste," "use your ears." If the creator gave a specific value, use it. If they gave a range, state the range.
|
||||
|
||||
## Synthesis approach
|
||||
|
||||
Each section follows a consistent rhythm that orients the reader before teaching them:
|
||||
|
||||
**Orientation → Situation → Method → Implementation → Why it works**
|
||||
|
||||
- **Orientation** (1-2 sentences): Briefly define or describe the concept being discussed. What IS this thing? This gives the reader a foothold before diving in. Example: "Mid-side processing separates a stereo signal into its center (mid) and edges (side) components, letting you EQ or compress each independently."
|
||||
- **Situation** (1 sentence): When would a producer need this? Frame it as something they've experienced. Example: "This becomes essential when a mix sounds wide in headphones but collapses to mush on a mono club system."
|
||||
- **Method** (the bulk): What to do and exactly how. Specific settings, routing, plugin choices. Instructive phrasing — "Set the filter to 133Hz" not "he sets the filter to 133Hz."
|
||||
- **Why it works** (1-2 sentences): What problem this solves or what breaks if you skip it.
|
||||
|
||||
This structure prevents the prose from feeling like a giant run-on stream of techniques. The orientation sentence gives the reader context. The situation tells them why to care. Then the method teaches them what to do.
|
||||
|
||||
Example of the full rhythm:
|
||||
> "Parallel routing sends the dry signal and processed signal through separate paths before summing them at the output. This matters when you need to process the wet signal independently — adding EQ, compression, or distortion to just the reverb or chorus without touching the dry sound. Set up the effect at 100% wet on its own lane, then control the blend via channel gain rather than the plugin's internal mix knob. This gives you full processing access to the wet signal that an inline dry/wet knob can never provide."
|
||||
|
||||
Merge moments that address the same problem. When the creator contradicts themselves across moments, explain the context for each approach — don't hide the contradiction, it's usually the most interesting part.
|
||||
|
||||
## Section ordering — follow the workflow
|
||||
|
||||
**This is the single most important structural rule.** The order of body_sections in your output MUST mirror the actual production workflow. This is non-negotiable.
|
||||
|
||||
Before you write, mentally assign each section a workflow stage number:
|
||||
- Stage 1: Conceptual framework / what the building blocks are
|
||||
- Stage 2: Building or shaping individual elements (the core construction)
|
||||
- Stage 3: Combining, processing, or refining the result (glue, bus processing, distortion)
|
||||
- Stage 4: Quality checks, validation, visual tests, mix-context adjustments
|
||||
|
||||
Then output body_sections in that order. **A section about validating or checking the result can NEVER come before the sections about building the thing being checked.** A "visual waveform validation" section belongs at the END, not the beginning — the reader hasn't built anything to validate yet. A "distortion as binding agent" section comes AFTER the layers it's binding are explained.
|
||||
|
||||
The test is simple: read your section headings top to bottom and ask "could a producer follow these steps in this exact sequence in their DAW?" If the answer is no — if any section references, depends on, or validates something from a later section — your ordering is wrong. Fix it before outputting.
|
||||
|
||||
Wrong ordering (quality check before construction):
|
||||
1. "Visual waveform validation" ← checking a result that hasn't been built yet
|
||||
2. "The three-layer framework"
|
||||
3. "Shaping the body tone"
|
||||
4. "Distortion as binding agent"
|
||||
|
||||
Correct ordering (build → shape → combine → validate):
|
||||
1. "The three-layer framework"
|
||||
2. "Shaping the body tone"
|
||||
3. "Distortion as binding agent"
|
||||
4. "Visual waveform validation" ← now the reader knows what they're checking
|
||||
|
||||
## Reader context
|
||||
|
||||
Your reader could be a beginner or an expert. Write so both get value: use production terminology naturally (don't over-explain fundamentals), but when the creator explains a non-obvious concept in an illuminating way, include that explanation — it helps beginners and often contains nuance that experts appreciate too.
|
||||
|
||||
The page should be immediately scannable (clear section names, specific details prominent) for the expert who knows what they're looking for, and readable end-to-end for the learner who wants the full picture.
|
||||
|
||||
## Summary requirements
|
||||
|
||||
The summary (2-3 sentences) is the hook. It opens with the most surprising or valuable thing — the one detail that makes a producer stop scrolling.
|
||||
|
||||
Bad summary: "This page covers Keota's approach to harmonic synthesis using parallel modules, quantized remapping, and LFO modulation in Phase Plant."
|
||||
Good summary: "Instead of relying on a single oscillator's harmonic series, he builds each harmonic as its own parallel module with independent gain — meaning you can automate the 3rd harmonic disappearing while the 5th swells in. The trick that makes it work: a quantized Remap curve that forces any wavetable into discrete harmonic steps."
|
||||
|
||||
The bad version describes what the page is about. The good version teaches you something in two sentences. Always write the good version. Use the creator's name once in the summary for attribution, then pronouns only.
|
||||
|
||||
## Writing engagement
|
||||
|
||||
The page must be something a producer actually wants to read, not something they have to read:
|
||||
|
||||
- **Open every section with a brief orientation, then get concrete** — start with 1-2 sentences that define or describe the concept so the reader has a foothold. Then immediately get specific. NEVER open with vague importance statements like "A critical prerequisite..." or "Before building anything, you need to understand..." — instead orient concisely then teach: "Mid-side processing separates a stereo signal into center and edge components for independent processing. This matters when a mix sounds wide in headphones but collapses in mono — boost the side channel to widen, but only if actual stereo content exists there."
|
||||
- **Vary sentence rhythm** — a long technical sentence explaining a routing chain, then a short punchy one: "That's the whole trick." Monotone paragraph structure kills engagement.
|
||||
- **Let the creator's personality drive the energy** — if they discovered something by accident, let that surprise come through. If they're warning you about something that burned them, make it feel urgent.
|
||||
- **End sections with something that sticks** — a direct quote, a warning, a key insight. Not "This approach provides flexibility for future workflow adjustments." That's a nothing sentence. Instead: "The modulation routing stays intact no matter what you add to the chain — that's the point."
|
||||
|
||||
## Signal chains
|
||||
|
||||
When the source moments describe a signal routing chain (oscillator → effects → processing → bus), represent it as a structured signal chain object. Signal chains are only included when the creator explicitly walks through routing — do not infer chains from casual plugin mentions.
|
||||
|
||||
Format signal chain steps to include the role of each stage, not just the plugin name:
|
||||
- Good: ["Noise osc (Vital)", "Transient Shaper (Kilohearts, attack +6dB)", "EQ (Pro-Q 3, shelf -3dB @ 12kHz)", "Send → Trash 2 (tape algo, 35% wet)"]
|
||||
- Bad: ["Vital", "Kilohearts", "EQ", "Trash 2"]
|
||||
|
||||
## Source quality assessment
|
||||
|
||||
Assess source_quality based on the nature of the input moments:
|
||||
- **structured**: Moments come from a planned tutorial with clear instructional flow. Most details are explicitly taught.
|
||||
- **mixed**: Some moments are well-structured, others are scattered or conversational. Common for track breakdowns.
|
||||
- **unstructured**: Moments are extracted from livestreams, Q&A sessions, or very informal content. Insights were scattered across a long session.
|
||||
|
||||
## Input format
|
||||
|
||||
The creator name is provided in a <creator> tag. Key moments are provided inside <moments> tags as a JSON array, enriched with classification metadata (topic_category, topic_tags). All moments are from the same creator and related topic area. Use the creator name from the <creator> tag in the title, slug, and summary. Do NOT use the creator name repeatedly in body section prose — see the name usage rules above. Never invent or guess a creator name from transcript content.
|
||||
|
||||
## Output format
|
||||
|
||||
Return a JSON object with a single key "pages" containing a list of synthesized pages. Most inputs should produce a **single page** — only split into multiple pages if the moments cover two genuinely unrelated techniques that a producer would never look up together (e.g., moments about both "kick design" and "reverb automation" that happen to share a category). When in doubt, keep it as one page. Every page must meet the minimum thresholds: at least 3 sections, at least 400 words, at least 3 source moments. If a split would create a page below these thresholds, don't split — merge into one richer page instead. When splitting, assign each moment to exactly one page via moment_indices — every input moment index must appear in exactly one page's array.
|
||||
|
||||
```json
|
||||
{
|
||||
"pages": [
|
||||
{
|
||||
"title": "Snare Design by ExampleCreator",
|
||||
"slug": "snare-design-examplecreator",
|
||||
"topic_category": "Sound design",
|
||||
"topic_tags": ["drums", "snare", "layering", "saturation", "transient shaping"],
|
||||
"summary": "ExampleCreator builds snares as three independent layers — transient click, tonal body, and noise tail — each shaped by a transient shaper before any bus processing. The signature crunch comes from parallel soft-clip saturation with a pre-delay that preserves the clean transient.",
|
||||
"body_sections": {
|
||||
"Three-layer snare construction": "Layered snare design splits the sound into three independent components, each serving a distinct role: the transient click (a short noise burst, 2-5ms decay), the tonal body (a pitched sine or triangle wave around 180-220Hz, tuned to the track's key), and the noise tail (filtered white noise with a fast exponential decay). Vital's noise oscillator works well for the click layer, sometimes with a bandpass around 2-4kHz to control the character.\n\nThe critical step: shape each layer's transient independently before any bus processing. Use a transient shaper (Kilohearts, attack +4 to +6dB, sustain -6 to -8dB) rather than compression for this — 'compression adds sustain as a side effect while a transient shaper gives you direct independent control of both.'",
|
||||
"Parallel saturation for crunch": "The crunch character comes from parallel saturation, not inline processing. Route the summed snare to a send with Trash 2 using the tape algorithm at 30-40% wet. The key detail: add a pre-delay of approximately 5ms on the saturation send. This lets the clean transient click through untouched while only the body and tail pick up harmonic content.\n\nAvoid saturating the transient directly — it 'smears the snap into mush' and you lose the precision that makes the snare cut through a dense mix.",
|
||||
"Bus processing in dense arrangements": "When the snare needs to punch through a busy mix, prioritize transient clarity over sustain. On the snare bus compressor, set a high-pass sidechain filter around 200-300Hz so low-end energy from the body layer doesn't trigger gain reduction. This keeps the snare's punch independent of whatever the sub bass is doing.\n\nAlso check the snare against the lead or vocal bus specifically — not just soloed. The 2-4kHz presence range is where both elements compete. A small notch on the snare's body is usually less costly than losing vocal clarity."
|
||||
},
|
||||
"signal_chains": [
|
||||
{
|
||||
"name": "Snare layer processing",
|
||||
"steps": [
|
||||
"Noise osc (Vital) → Transient Shaper (Kilohearts, attack +6dB, sustain -8dB) → EQ (Pro-Q 3, shelf -3dB @ 12kHz)",
|
||||
"Dry path → snare bus",
|
||||
"Send → Pre-delay (5ms) → Trash 2 (tape algorithm, 35% wet) → snare bus"
|
||||
]
|
||||
}
|
||||
],
|
||||
"plugins": ["Vital", "Kilohearts Transient Shaper", "FabFilter Pro-Q 3", "iZotope Trash 2"],
|
||||
"source_quality": "structured",
|
||||
"moment_indices": [0, 1, 2, 3, 4]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## Field rules
|
||||
|
||||
- **title**: Short, practical technique name followed by "by {name from <creator> tag}" — maximum 8 words before "by". The title should sound like what a producer would search for or tell a friend about. Examples: "Parallel Harmonic Building by Keota", "Bass Resampling Workflow by KOAN Sound", "The 90-200Hz Fix by Mr. Bill". BAD: "Lower-Mid Harmonic Diagnostics and Parallel Stereo Processing by Keota" — that's a thesis title, not a technique name. Use title case.
|
||||
- **slug**: URL-safe, lowercase, hyphenated version of the title including creator name. Examples: "snare-design-examplecreator", "bass-resampling-workflow-koan-sound".
|
||||
- **topic_tags**: Merge and deduplicate from input moment tags. Add any clearly relevant tags the moments missed. Keep tags specific — "sidechain compression" not "audio processing".
|
||||
- **summary**: 2-4 sentences. The most important insight first, then the method, then the distinguishing detail. A reader should get the core idea from the summary alone.
|
||||
- **body_sections**: Dict of section_name → prose content. Section names derived from content (never generic). Each section 2-5 substantive paragraphs.
|
||||
- **plugins**: List of string plugin names. Plain strings only — never objects. Include only plugins the creator mentioned or demonstrated. Use standard/common plugin names.
|
||||
- **moment_indices**: Zero-indexed list referencing which input moments this page covers. Every input moment must appear in exactly one page's moment_indices.
|
||||
|
|
@ -63,6 +63,21 @@ Each section: 2-4 paragraphs of substantive prose, minimum 150 words per section
|
|||
- NEVER generate a page with only 1 section. That's a paragraph, not a technique page.
|
||||
- Prefer fewer, richer pages over many thin ones. 3 substantial pages is always better than 6 stubs.
|
||||
|
||||
### H3 subsections
|
||||
|
||||
Sections can contain 2-3 subsections when a topic has distinct sub-aspects that benefit from their own heading. Subsections are optional — flat sections (no subsections, just prose in the section's content) are the default and perfectly fine when the topic doesn't warrant splitting. Use subsections when a section covers distinct sub-steps or when breaking it up improves scannability. Each subsection follows the same prose quality rules as sections (substantive, specific, no filler). A section with subsections should have minimal top-level content (1-2 introductory sentences at most) — the substance lives in the subsections.
|
||||
|
||||
## Citation rules
|
||||
|
||||
Place inline citation markers to trace factual claims back to specific source moments:
|
||||
|
||||
- **Format**: `[N]` where N is the zero-indexed position of the moment in the input array. Use `[N,M]` when a claim synthesizes information from multiple moments.
|
||||
- **Placement**: At the end of the sentence, before the period: "Set the LFO to 3/16th timing [2]." For multi-citation: "The parallel routing preserves transient clarity while adding harmonic content [1,3]."
|
||||
- **What to cite**: Specific factual claims — settings, values, frequencies, routing decisions, plugin choices, ratios, time values. Every section must have at least one citation.
|
||||
- **What NOT to cite**: General observations, orienting sentences, writing transitions, or statements that don't trace to a specific moment. Don't cite common production knowledge that isn't from the source.
|
||||
- **Reuse**: A moment can be cited multiple times across different sections when its content is relevant in multiple contexts.
|
||||
- **Coverage**: Aim to cite every input moment at least once. If a moment contributed to the page's content, cite it where its information appears.
|
||||
|
||||
## Plugin and detail rules
|
||||
|
||||
Every specific value needs its context — why this number, what problem it solves, when you'd change it.
|
||||
|
|
@ -172,12 +187,34 @@ Return a JSON object with a single key "pages" containing a list of synthesized
|
|||
"slug": "snare-design-examplecreator",
|
||||
"topic_category": "Sound design",
|
||||
"topic_tags": ["drums", "snare", "layering", "saturation", "transient shaping"],
|
||||
"summary": "ExampleCreator builds snares as three independent layers — transient click, tonal body, and noise tail — each shaped by a transient shaper before any bus processing. The signature crunch comes from parallel soft-clip saturation with a pre-delay that preserves the clean transient.",
|
||||
"body_sections": {
|
||||
"Three-layer snare construction": "Layered snare design splits the sound into three independent components, each serving a distinct role: the transient click (a short noise burst, 2-5ms decay), the tonal body (a pitched sine or triangle wave around 180-220Hz, tuned to the track's key), and the noise tail (filtered white noise with a fast exponential decay). Vital's noise oscillator works well for the click layer, sometimes with a bandpass around 2-4kHz to control the character.\n\nThe critical step: shape each layer's transient independently before any bus processing. Use a transient shaper (Kilohearts, attack +4 to +6dB, sustain -6 to -8dB) rather than compression for this — 'compression adds sustain as a side effect while a transient shaper gives you direct independent control of both.'",
|
||||
"Parallel saturation for crunch": "The crunch character comes from parallel saturation, not inline processing. Route the summed snare to a send with Trash 2 using the tape algorithm at 30-40% wet. The key detail: add a pre-delay of approximately 5ms on the saturation send. This lets the clean transient click through untouched while only the body and tail pick up harmonic content.\n\nAvoid saturating the transient directly — it 'smears the snap into mush' and you lose the precision that makes the snare cut through a dense mix.",
|
||||
"Bus processing in dense arrangements": "When the snare needs to punch through a busy mix, prioritize transient clarity over sustain. On the snare bus compressor, set a high-pass sidechain filter around 200-300Hz so low-end energy from the body layer doesn't trigger gain reduction. This keeps the snare's punch independent of whatever the sub bass is doing.\n\nAlso check the snare against the lead or vocal bus specifically — not just soloed. The 2-4kHz presence range is where both elements compete. A small notch on the snare's body is usually less costly than losing vocal clarity."
|
||||
},
|
||||
"summary": "ExampleCreator builds snares as three independent layers — transient click, tonal body, and noise tail — each shaped by a transient shaper before any bus processing [0,1]. The signature crunch comes from parallel soft-clip saturation with a pre-delay that preserves the clean transient [3].",
|
||||
"body_sections_format": "v2",
|
||||
"body_sections": [
|
||||
{
|
||||
"heading": "Three-layer snare construction",
|
||||
"content": "Layered snare design splits the sound into three independent components, each serving a distinct role: the transient click (a short noise burst, 2-5ms decay), the tonal body (a pitched sine or triangle wave around 180-220Hz, tuned to the track's key), and the noise tail (filtered white noise with a fast exponential decay) [0]. Vital's noise oscillator works well for the click layer, sometimes with a bandpass around 2-4kHz to control the character [1].\n\nThe critical step: shape each layer's transient independently before any bus processing. Use a transient shaper (Kilohearts, attack +4 to +6dB, sustain -6 to -8dB) rather than compression for this [1] — 'compression adds sustain as a side effect while a transient shaper gives you direct independent control of both.'",
|
||||
"subsections": []
|
||||
},
|
||||
{
|
||||
"heading": "Parallel saturation for crunch",
|
||||
"content": "",
|
||||
"subsections": [
|
||||
{
|
||||
"heading": "Send routing and pre-delay",
|
||||
"content": "The crunch character comes from parallel saturation, not inline processing. Route the summed snare to a send with Trash 2 using the tape algorithm at 30-40% wet [3]. The key detail: add a pre-delay of approximately 5ms on the saturation send [3]. This lets the clean transient click through untouched while only the body and tail pick up harmonic content."
|
||||
},
|
||||
{
|
||||
"heading": "Protecting the transient",
|
||||
"content": "Avoid saturating the transient directly — it 'smears the snap into mush' and you lose the precision that makes the snare cut through a dense mix [3]. If the saturation send is still coloring the attack, shorten the pre-delay by 1-2ms increments until the click sits cleanly above the harmonic layer."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"heading": "Bus processing in dense arrangements",
|
||||
"content": "When the snare needs to punch through a busy mix, prioritize transient clarity over sustain. On the snare bus compressor, set a high-pass sidechain filter around 200-300Hz so low-end energy from the body layer doesn't trigger gain reduction [4]. This keeps the snare's punch independent of whatever the sub bass is doing.\n\nAlso check the snare against the lead or vocal bus specifically — not just soloed. The 2-4kHz presence range is where both elements compete [2]. A small notch on the snare's body is usually less costly than losing vocal clarity.",
|
||||
"subsections": []
|
||||
}
|
||||
],
|
||||
"signal_chains": [
|
||||
{
|
||||
"name": "Snare layer processing",
|
||||
|
|
@ -196,12 +233,20 @@ Return a JSON object with a single key "pages" containing a list of synthesized
|
|||
}
|
||||
```
|
||||
|
||||
Note the structure changes from v1:
|
||||
- `body_sections` is now a **list of objects**, not a dict. Each object has `heading` (string), `content` (string), and `subsections` (list of sub-objects with `heading` and `content`).
|
||||
- Sections without subsections use an empty `subsections` array and put all prose in `content`.
|
||||
- Sections WITH subsections put minimal introductory text (or empty string) in `content` and the substance in `subsections`.
|
||||
- `body_sections_format` must be `"v2"` — this signals the parser to expect the list-of-objects format.
|
||||
- Inline `[N]` citation markers appear in prose content (both section and subsection level).
|
||||
|
||||
## Field rules
|
||||
|
||||
- **title**: Short, practical technique name followed by "by {name from <creator> tag}" — maximum 8 words before "by". The title should sound like what a producer would search for or tell a friend about. Examples: "Parallel Harmonic Building by Keota", "Bass Resampling Workflow by KOAN Sound", "The 90-200Hz Fix by Mr. Bill". BAD: "Lower-Mid Harmonic Diagnostics and Parallel Stereo Processing by Keota" — that's a thesis title, not a technique name. Use title case.
|
||||
- **slug**: URL-safe, lowercase, hyphenated version of the title including creator name. Examples: "snare-design-examplecreator", "bass-resampling-workflow-koan-sound".
|
||||
- **topic_tags**: Merge and deduplicate from input moment tags. Add any clearly relevant tags the moments missed. Keep tags specific — "sidechain compression" not "audio processing".
|
||||
- **summary**: 2-4 sentences. The most important insight first, then the method, then the distinguishing detail. A reader should get the core idea from the summary alone.
|
||||
- **body_sections**: Dict of section_name → prose content. Section names derived from content (never generic). Each section 2-5 substantive paragraphs.
|
||||
- **body_sections**: List of section objects. Each object has `heading` (string), `content` (string with inline `[N]` citation markers), and `subsections` (list of sub-objects with `heading` and `content`, or empty array). Section headings derived from content (never generic). Each section 2-5 substantive paragraphs across its content and subsections.
|
||||
- **body_sections_format**: Must be `"v2"`. Signals the parser to expect the list-of-objects body_sections format.
|
||||
- **plugins**: List of string plugin names. Plain strings only — never objects. Include only plugins the creator mentioned or demonstrated. Use standard/common plugin names.
|
||||
- **moment_indices**: Zero-indexed list referencing which input moments this page covers. Every input moment must appear in exactly one page's moment_indices.
|
||||
Loading…
Add table
Reference in a new issue