Benchmark: Phase 7 Block Content Baseline

benchmark-phase7-block-baseline Doc

active benchmark

Phase 7 Baseline: Content Structure Before Blocks

Captured 2026-03-07, before block-structured content model exists. All notes are monolithic HTML blobs.

Corpus Overview

Metric Value
Total notes <strong>256</strong>
Total content <strong>1,088,274 chars (~272K tokens)</strong>
Average note size 4,251 chars
Median note size 2,578 chars
P90 note size 9,706 chars
Max note size 28,769 chars (plan-2026-02-28-woodpecker-mcp)
Average sections per note <strong>7.7 headings</strong>

Size Distribution

Bucket Count Avg Size % of Notes Block Impact
&lt; 500 chars 12 338 5% Low — too small for sections
500-1K chars 23 684 9% Low — 1-2 sections
1K-2K chars 61 1,532 24% Medium — 3-5 sections
2K-5K chars 94 3,144 <strong>37%</strong> <strong>High — 5-8 sections, biggest cohort</strong>
5K-10K chars 41 6,686 16% <strong>High — 8-15 sections</strong>
10K+ chars 25 16,217 10% <strong>Critical — 15-34 sections, most waste per read</strong>
Key finding: 63% of notes (160/256) are over 2KB. These are the notes where block-level access delivers the most token savings. The 25 notes over 10KB average 16,217 chars (~4,054 tokens) — reading just one section instead of the full note would save ~90% per access.

Section Distribution

Headings per Note Count Avg Size Block Benefit
0 headings 27 764 None — flat content, no sections to split
1-3 headings 15 915 Minimal — few sections
4-7 headings 108 2,369 <strong>Moderate — 4-7 addressable blocks</strong>
8-15 headings 86 5,401 <strong>High — get_block saves ~85% per read</strong>
16+ headings 20 16,683 <strong>Critical — get_block saves ~94% per read</strong>
Key finding: 214/256 notes (84%) have 4+ headings — meaning 84% of notes would benefit from block-level access. Only 27 notes (11%) are flat content with no sections.

Content Type Distribution

Content Type Count % of Notes Block Type
Lists (ul/ol) 239 93% <code>list</code>
Tables 118 46% <code>table</code>
Code blocks (pre) 72 28% <code>code</code>
Mermaid diagrams 37 14% <code>mermaid</code>
Key finding: Rich, structured content is pervasive. 46% of notes have tables, 28% have code blocks. These are exactly the content types that benefit from typed blocks — a table block can be queried, updated, and rendered independently from surrounding text.

Size by Note Type

Type Count Avg Size Max Size Block Impact
(untyped) 85 3,568 26,688 High — legacy notes, many large
todo 38 2,278 7,394 Medium
<strong>plan</strong> <strong>38</strong> <strong>9,441</strong> <strong>28,769</strong> <strong>Critical — largest type, most sections, most read</strong>
phase 34 1,926 6,948 Medium
sop 13 4,382 7,748 High — procedural, section-level reads
project-page 11 7,612 17,922 High — large, multi-section
convention 10 3,838 17,273 High
template 9 2,822 4,752 Medium
doc 8 5,121 7,426 High — concept/benchmark/decision docs
skill 5 2,152 2,873 Medium
agent 4 4,150 5,206 High — personality definitions
Key finding: Plans are the largest note type (avg 9,441 chars, ~2,360 tokens) and are the most frequently read notes (4 plans loaded at every session startup). Block-level access to plans alone would save thousands of tokens per session.

Hierarchy: Current State

Metric Value
Notes with a parent <strong>34</strong> (all phases)
Notes without a parent <strong>222</strong>
Note types that CAN have parents Only <code>phase</code>
Orphaned docs (should have parents) <strong>6</strong> concept/benchmark/incident/decision docs

Orphaned Documents (logically belong under a phase)

Slug Logical Parent
<code>concept-phase5-database-side-intelligence</code> <code>phase-postgres-5-fulltext-search</code>
<code>concept-phase5-self-hosted-rag</code> <code>phase-postgres-5-fulltext-search</code>
<code>benchmark-phase5-knowledge-baseline</code> <code>phase-postgres-5-fulltext-search</code>
<code>concept-argocd-ghost-override</code> <code>phase-postgres-5-fulltext-search</code>
<code>incident-phase5-deployment-outage-2026-03-06</code> <code>phase-postgres-5-fulltext-search</code>
<code>decision-phase6-vector-search-architecture</code> <code>phase-postgres-6-vector-search</code>
Key finding: 6 docs already exist that should nest under phases but can't due to the type restriction. This will grow as more concept/benchmark/decision docs are created for Phases 6, 7, and 8. The hierarchy relaxation in Phase 7 solves this.

Token Cost Estimates: Before vs After Blocks

Operation Before (monolithic HTML) After (block-level) Savings
Read one section of a plan ~2,360 tokens (full note) ~200 tokens (one block) <strong>~92%</strong>
Read TOC of a plan ~2,360 tokens (full note) ~50 tokens (headings only) <strong>~98%</strong>
Update one section ~2,360 tokens (send full html_content back) ~100 tokens (send one block) <strong>~96%</strong>
Session startup (4 plans) ~8,750 tokens (4 × full get_note) ~400 tokens (4 × TOC + targeted sections) <strong>~95%</strong>
Search result (find section) ~640 tokens (note-level snippet) ~200 tokens (block-level result) <strong>~69%</strong>

Success Criteria for Phase 7

  • All 256 notes decomposed into blocks (backfill migration)
  • Block-level read/write API endpoints working
  • TOC generation for all notes with 4+ headings (214 notes)
  • 6 orphaned docs nested under their logical parent phases
  • Existing MCP tools (get_note, update_note) continue working unchanged
  • Benchmark re-test shows measurable token reduction vs this baseline
  • phase-postgres-7-block-content — the phase this benchmarks
  • benchmark-phase5-knowledge-baseline — Phase 5 before/after comparison (methodology reference)
  • decision-phase6-vector-search-architecture — per-block embedding depends on blocks existing