{
  "day": "2026-10-29",
  "merges": 250,
  "baseline_merges_per_day": 268.7,
  "lines_added": 133468,
  "lines_removed": 21505,
  "files_changed": 2265,
  "busiest_hour": {
    "hour": 6,
    "merges": 18
  },
  "hours": [
    11,
    9,
    11,
    9,
    14,
    17,
    18,
    7,
    12,
    9,
    9,
    9,
    8,
    13,
    9,
    7,
    10,
    12,
    10,
    9,
    11,
    9,
    9,
    8
  ],
  "agents": [
    [
      "Claude Sonnet 5.5",
      177
    ],
    [
      "Claude",
      51
    ],
    [
      "Claude Opus 5.5",
      21
    ],
    [
      "unattributed",
      1
    ]
  ],
  "products": [
    {
      "name": "ai-bookkeeper",
      "merges": [
        {
          "sha": "e508b2e670de3fe81b9084c965cd70e8864459c9",
          "at": 1793235576000,
          "title": "ai-bookkeeper: restaurant bookkeeping page, fixture, test and post",
          "pr": 11251,
          "agent": "Claude",
          "models": [],
          "track": null,
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "ai-bookkeeper"
          },
          "files": 8,
          "lines_added": 136,
          "lines_removed": 1,
          "added_files": [
            "docs/posts/2026-10-29-restaurant-bookkeeping-from-a-bank-statement.md",
            "ventures/ai-bookkeeper/fixtures/restaurant-checking.csv",
            "ventures/ai-bookkeeper/restaurant-bookkeeping.html",
            "ventures/ai-bookkeeper/restaurant.test.mjs"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "606aeabb08f7a6aa63f40dbea3fd8276dba0720c",
          "at": 1793235733000,
          "title": "ai-bookkeeper: free tax calendar page (.ics) and browser fix for toIcs",
          "pr": 11252,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "ai-bookkeeper: free tax calendar page with .ics download; fix toIcs in browsers",
            "post: shorten description"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "ai-bookkeeper"
          },
          "files": 10,
          "lines_added": 188,
          "lines_removed": 2,
          "added_files": [
            "docs/posts/2026-10-29-free-small-business-tax-calendar-ics.md",
            "prompts/runs/2026-10-29-session_01EhTJVLiTwehiU7LAH4JGz7.json",
            "ventures/ai-bookkeeper/tax-calendar.html"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "0283306e4cfb6689417285a01a710472daa78b8d",
          "at": 1793236144000,
          "title": "ai-bookkeeper: real estate agent bookkeeping page, fixture, test and post",
          "pr": 11253,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "ai-bookkeeper: real estate agent bookkeeping page, fixture, test and post"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "ai-bookkeeper"
          },
          "files": 9,
          "lines_added": 183,
          "lines_removed": 1,
          "added_files": [
            "docs/posts/2026-10-29-real-estate-agent-bookkeeping-from-a-bank-statement.md",
            "prompts/runs/2026-10-29-session_01AcxTtKViSj2qwMf4m7LoCJ.json",
            "ventures/ai-bookkeeper/fixtures/realtor-checking.csv",
            "ventures/ai-bookkeeper/realtor-bookkeeping.html",
            "ventures/ai-bookkeeper/realtor.test.mjs"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "e6984967853efed10cc37abf28d9760408c557a6",
          "at": 1793236190000,
          "title": "ai-bookkeeper: state income tax boxes on the estimate card",
          "pr": 11254,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "ai-bookkeeper: state income tax boxes on the estimate card, README and post"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "ai-bookkeeper"
          },
          "files": 5,
          "lines_added": 75,
          "lines_removed": 5,
          "added_files": [
            "docs/posts/2026-10-29-state-income-tax-on-the-bookkeeper-page.md",
            "prompts/runs/2026-10-29-session_01AcxTtH6hH96k4fMPyEidq6.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "4b7baeac24a809c465e9458b8ece7d4eca8901c5",
          "at": 1793239052000,
          "title": "ai-bookkeeper: hair salon and barber bookkeeping page, fixture, test and post",
          "pr": 11260,
          "agent": "Claude",
          "models": [],
          "track": "ventures",
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "ai-bookkeeper"
          },
          "files": 8,
          "lines_added": 135,
          "lines_removed": 1,
          "added_files": [
            "docs/posts/2026-10-29-salon-and-barber-bookkeeping-page.md",
            "ventures/ai-bookkeeper/fixtures/salon-checking.csv",
            "ventures/ai-bookkeeper/salon-bookkeeping.html",
            "ventures/ai-bookkeeper/salon.test.mjs"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "0d0ecdc2cb3c370e0c4e4117c6502ab3a48accd9",
          "at": 1793239256000,
          "title": "ai-bookkeeper: house-cleaner bookkeeping page, fixture, test and post",
          "pr": 11261,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "ai-bookkeeper: house-cleaner bookkeeping page, fixture, test and post"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "ai-bookkeeper"
          },
          "files": 9,
          "lines_added": 180,
          "lines_removed": 1,
          "added_files": [
            "docs/posts/2026-10-29-cleaning-business-bookkeeping-from-a-bank-statement.md",
            "prompts/runs/2026-10-29-session_01EhTJVNuTJPeaLXDknRKjrH.json",
            "ventures/ai-bookkeeper/cleaning-bookkeeping.html",
            "ventures/ai-bookkeeper/cleaning.test.mjs",
            "ventures/ai-bookkeeper/fixtures/cleaning-checking.csv"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "589cfaf4a75a9baafda734f43d1bbe4c58c3bd50",
          "at": 1793239903000,
          "title": "ai-bookkeeper: mutated-fixture robustness test for the statement reader",
          "pr": 11266,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "ai-bookkeeper: mutated-fixture robustness test for the statement reader, and post",
            "prompts: run record for ventures/2 session"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "ai-bookkeeper"
          },
          "files": 4,
          "lines_added": 112,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-fuzzing-the-bank-statement-reader.md",
            "prompts/runs/2026-10-29-session_01E5sJKnG5Ka2BuF99cHJKjU.json",
            "ventures/ai-bookkeeper/mutated-fixtures.test.mjs"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "02ef50d63dcc12cc1e4b190e5bd3d0608f657b17",
          "at": 1793242660000,
          "title": "ai-bookkeeper: S-corp election worksheet on the page",
          "pr": 11271,
          "agent": "Claude",
          "models": [],
          "track": "ventures",
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "ai-bookkeeper"
          },
          "files": 6,
          "lines_added": 80,
          "lines_removed": 3,
          "added_files": [
            "docs/posts/2026-10-29-would-an-s-corp-save-you-tax.md",
            "ventures/ai-bookkeeper/eval/browser-scorp.mjs"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "27d5ae8d37853a1a475eb45cd577ae5098988d29",
          "at": 1793242681000,
          "title": "ai-bookkeeper: landscaping bookkeeping page, fixture, test and post",
          "pr": 11272,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "ai-bookkeeper: landscaping bookkeeping page, fixture, test and post"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "ai-bookkeeper"
          },
          "files": 9,
          "lines_added": 181,
          "lines_removed": 1,
          "added_files": [
            "docs/posts/2026-10-29-landscaping-business-bookkeeping-from-a-bank-statement.md",
            "prompts/runs/2026-10-29-session_01EhTJVLi9qez4dkBeha6kdt.json",
            "ventures/ai-bookkeeper/fixtures/landscaping-checking.csv",
            "ventures/ai-bookkeeper/landscaping-bookkeeping.html",
            "ventures/ai-bookkeeper/landscaping.test.mjs"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "00b3138a2d6f5fa1a1ef70602ba467377dd62b85",
          "at": 1793242841000,
          "title": "ai-bookkeeper: personal trainer bookkeeping page, fixture, test, built-in rules for coaching apps, certifications and gym rent, and post",
          "pr": 11273,
          "agent": "Claude",
          "models": [],
          "track": "ventures",
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "ai-bookkeeper"
          },
          "files": 9,
          "lines_added": 154,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-personal-trainer-bookkeeping-page.md",
            "ventures/ai-bookkeeper/fixtures/trainer-checking.csv",
            "ventures/ai-bookkeeper/trainer-bookkeeping.html",
            "ventures/ai-bookkeeper/trainer.test.mjs"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "ed3132d0a5c8d84a335e7bea998b615e1bec2d71",
          "at": 1793243441000,
          "title": "process: fix unresolved merge conflicts on main (ai-bookkeeper) and S-corp post frontmatter",
          "pr": 11276,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "process",
          "bullets": [
            "Resolve unresolved merge conflicts on main (ai-bookkeeper index and README) and add missing S-corp post frontmatter"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "ai-bookkeeper"
          },
          "files": 3,
          "lines_added": 47,
          "lines_removed": 8,
          "added_files": [
            "prompts/runs/2026-10-29-session_01AcxTtJH9cSVTgJxRf9LYX1.json"
          ],
          "revert": false,
          "fix_forward": true
        },
        {
          "sha": "eb03ab7553b633b1c757249c2bd4082f74f75cea",
          "at": 1793246396000,
          "title": "ai-bookkeeper: photographer bookkeeping page, fixture, test, built-in rules for gallery software, dues, second shooters and print labs, and post",
          "pr": 11287,
          "agent": "Claude",
          "models": [],
          "track": "ventures",
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "ai-bookkeeper"
          },
          "files": 9,
          "lines_added": 154,
          "lines_removed": 1,
          "added_files": [
            "docs/posts/2026-10-29-photographer-bookkeeping-page.md",
            "ventures/ai-bookkeeper/fixtures/photographer-checking.csv",
            "ventures/ai-bookkeeper/photographer-bookkeeping.html",
            "ventures/ai-bookkeeper/photographer.test.mjs"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "5b1a3d172beedcf08a57f717cbd304e9a1c26884",
          "at": 1793247061000,
          "title": "ai-bookkeeper: tutor bookkeeping page, fixture, test, built-in rules and post",
          "pr": 11291,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "ai-bookkeeper: tutor bookkeeping page, fixture, test, built-in rules for tutoring marketplaces, classroom apps, materials and exam fees, and post",
            "Fill run record; fix photographer post description length"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "ai-bookkeeper"
          },
          "files": 10,
          "lines_added": 272,
          "lines_removed": 1,
          "added_files": [
            "docs/posts/2026-10-29-tutor-bookkeeping-page.md",
            "prompts/runs/2026-10-29-session_01AcxTtHnQyBoRZGz36UBUyb.json",
            "ventures/ai-bookkeeper/fixtures/tutor-checking.csv",
            "ventures/ai-bookkeeper/tutor-bookkeeping.html",
            "ventures/ai-bookkeeper/tutor.test.mjs"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "ab8203eb799a6a337de36f040957ef72e18b3df5",
          "at": 1793247793000,
          "title": "Red team retrospective post + fix unclosed-quote CSV defect in ai-bookkeeper",
          "pr": 11295,
          "agent": "Claude Opus 5.5",
          "models": [
            "Claude Opus 5.5"
          ],
          "track": "process",
          "bullets": [
            "Red team retrospective post; ai-bookkeeper: unclosed CSV quote no longer swallows the file"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "ai-bookkeeper"
          },
          "files": 4,
          "lines_added": 247,
          "lines_removed": 3,
          "added_files": [
            "docs/posts/2026-10-29-red-team-fifteen-days-damage-and-repairs.md",
            "prompts/runs/2026-10-29-session_01XpHqycgnBSZwGAeAk4DiVj.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "ab26e8371de39f631ff1e759290d3c1058617e6e",
          "at": 1793250590000,
          "title": "ai-bookkeeper: pet sitter and dog walker bookkeeping page, rules, test and post",
          "pr": 11305,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "ai-bookkeeper: pet sitter and dog walker bookkeeping page, fixture, test, built-in rules for marketplace payouts, supplies and dues, and post",
            "prompts: run record for pet sitter page"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "ai-bookkeeper"
          },
          "files": 10,
          "lines_added": 265,
          "lines_removed": 1,
          "added_files": [
            "docs/posts/2026-10-29-pet-sitter-bookkeeping-page.md",
            "prompts/runs/2026-10-29-session_01AcxTtLKRMAeotfEsriDQsv.json",
            "ventures/ai-bookkeeper/fixtures/petcare-checking.csv",
            "ventures/ai-bookkeeper/petcare-bookkeeping.html",
            "ventures/ai-bookkeeper/petcare.test.mjs"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "3b2d21bc07c250898450ca588e8081be3f26a311",
          "at": 1793250858000,
          "title": "ai-bookkeeper: fuzzing binary readers found an .xls stall; bound the OLE reader",
          "pr": 11306,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "ai-bookkeeper: bound the OLE reader against wild name lengths and sector sizes (found by fuzzing binary fixtures)"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "ai-bookkeeper"
          },
          "files": 5,
          "lines_added": 163,
          "lines_removed": 3,
          "added_files": [
            "docs/posts/2026-10-29-a-spreadsheet-that-stalled-the-bookkeeper.md",
            "prompts/runs/2026-10-29-session_01E5sJKjpb64EioDMdEcbaHa.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "fc7f64b2c11f51defee24d0ae689302421b12bec",
          "at": 1793264395000,
          "title": "ai-bookkeeper: farmers-market and cottage-food vendor bookkeeping page, rule, test and post",
          "pr": 11362,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "explore",
          "bullets": [
            "ai-bookkeeper: farmers-market and cottage-food vendor bookkeeping page, rule, test and post",
            "prompts: run record for market vendor page"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "ai-bookkeeper"
          },
          "files": 10,
          "lines_added": 182,
          "lines_removed": 1,
          "added_files": [
            "docs/posts/2026-10-29-farmers-market-vendor-bookkeeping-page.md",
            "prompts/runs/2026-10-29-session_01EhTJVQ1TF2QS9wnCwZSiEn.json",
            "ventures/ai-bookkeeper/fixtures/marketvendor-checking.csv",
            "ventures/ai-bookkeeper/marketvendor-bookkeeping.html",
            "ventures/ai-bookkeeper/marketvendor.test.mjs"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "8be20d062b3864055eb9970123dc3066a8d5ed57",
          "at": 1793265133000,
          "title": "ai-bookkeeper: home daycare bookkeeping page, rules, test and post",
          "pr": 11364,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "ai-bookkeeper: home daycare bookkeeping page, rules, test and post",
            "prompts: run record for home daycare page"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "ai-bookkeeper"
          },
          "files": 10,
          "lines_added": 204,
          "lines_removed": 1,
          "added_files": [
            "docs/posts/2026-10-29-home-daycare-bookkeeping-page.md",
            "prompts/runs/2026-10-29-session_01AcxTtJ22HGs2bW7gQmVp49.json",
            "ventures/ai-bookkeeper/daycare-bookkeeping.html",
            "ventures/ai-bookkeeper/daycare.test.mjs",
            "ventures/ai-bookkeeper/fixtures/daycare-checking.csv"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "49d3620afff49da7de2c0bcfadfd865a457f6998",
          "at": 1793265925000,
          "title": "redteam: ai-bookkeeper ledger.mjs 2026-10-29",
          "pr": 11370,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "redteam",
          "bullets": [
            "redteam: ai-bookkeeper ledger.mjs 2026-10-29",
            "redteam record: PR number"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "ai-bookkeeper"
          },
          "files": 2,
          "lines_added": 187,
          "lines_removed": 0,
          "added_files": [
            "prompts/runs/2026-10-29-session_01E5sJKmNbSfEj9Si7DMgVet.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "daeefb00dced831e20be773797ba39faf8c2ba71",
          "at": 1793267956000,
          "title": "ai-bookkeeper: therapist and counselor bookkeeping page, rules, test and post",
          "pr": 11372,
          "agent": "Claude",
          "models": [],
          "track": "ventures",
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "ai-bookkeeper"
          },
          "files": 10,
          "lines_added": 189,
          "lines_removed": 1,
          "added_files": [
            "docs/posts/2026-10-29-therapist-bookkeeping-page.md",
            "prompts/runs/2026-10-29-session_01EhTJVKQAb1AH5gDuo3gzw2.json",
            "ventures/ai-bookkeeper/fixtures/therapist-checking.csv",
            "ventures/ai-bookkeeper/therapist-bookkeeping.html",
            "ventures/ai-bookkeeper/therapist.test.mjs"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "5a3402c99c5d4adc4901d6766abb84a1236b851c",
          "at": 1793268144000,
          "title": "ai-bookkeeper: massage therapist and esthetician rules, page and post",
          "pr": 11373,
          "agent": "Claude",
          "models": [],
          "track": "research",
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "ai-bookkeeper"
          },
          "files": 9,
          "lines_added": 142,
          "lines_removed": 1,
          "added_files": [
            "docs/posts/2026-10-29-bookkeeping-for-massage-therapists-and-estheticians.md",
            "ventures/ai-bookkeeper/fixtures/massage-checking.csv",
            "ventures/ai-bookkeeper/massage-bookkeeping.html",
            "ventures/ai-bookkeeper/massage.test.mjs"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "fec9e02f659608f22bde84f8e725c6f00987961c",
          "at": 1793268618000,
          "title": "ai-bookkeeper: tattoo artist bookkeeping page, rules, test and post",
          "pr": 11376,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "ai-bookkeeper: tattoo artist bookkeeping page, rules, test and post",
            "prompts: run record for tattoo artist page"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "ai-bookkeeper"
          },
          "files": 9,
          "lines_added": 188,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-tattoo-artist-bookkeeping-page.md",
            "prompts/runs/2026-10-29-session_01AcxTtJ22HGs2bW7gQmVp49-2.json",
            "ventures/ai-bookkeeper/fixtures/tattoo-checking.csv",
            "ventures/ai-bookkeeper/tattoo-bookkeeping.html",
            "ventures/ai-bookkeeper/tattoo.test.mjs"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "013cef2d47bb6a566a6c9d6fe659251e86df8e11",
          "at": 1793272980000,
          "title": "ai-bookkeeper: mobile detailer page, supplier and owner-draw rules, test, post",
          "pr": 11389,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "ai-bookkeeper: mobile detailer page, supplier and owner-draw rules, test, post; fix tattoo canonical"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "ai-bookkeeper"
          },
          "files": 10,
          "lines_added": 255,
          "lines_removed": 1,
          "added_files": [
            "docs/posts/2026-10-29-mobile-detailer-bookkeeping-page.md",
            "prompts/runs/2026-10-29-session_01E5sJKnRSsd5thxEA4x42jP.json",
            "ventures/ai-bookkeeper/detailing-bookkeeping.html",
            "ventures/ai-bookkeeper/detailing.test.mjs",
            "ventures/ai-bookkeeper/fixtures/detailing-checking.csv"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "f50983516515a82da421ffb157b80824731333a7",
          "at": 1793275313000,
          "title": "ai-bookkeeper: wedding DJ, planner and florist page, rules, test, post",
          "pr": 11392,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "ai-bookkeeper: wedding DJ, planner and florist page, rules, test, post"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "ai-bookkeeper"
          },
          "files": 9,
          "lines_added": 184,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-wedding-dj-planner-florist-bookkeeping-page.md",
            "prompts/runs/2026-10-29-session_01EhTJVMQ6BKHeFkdq5SXtDr.json",
            "ventures/ai-bookkeeper/eventpro-bookkeeping.html",
            "ventures/ai-bookkeeper/eventpro.test.mjs",
            "ventures/ai-bookkeeper/fixtures/eventpro-checking.csv"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "1c9807b4afb70c4a9a7d9f137a8e37874e249277",
          "at": 1793275503000,
          "title": "ai-bookkeeper: owner-operator trucker page, factoring/fuel-card/Form 2290 rules, test, post",
          "pr": 11393,
          "agent": "Claude",
          "models": [],
          "track": "ventures",
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "ai-bookkeeper"
          },
          "files": 8,
          "lines_added": 149,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-owner-operator-trucker-bookkeeping-page.md",
            "ventures/ai-bookkeeper/fixtures/trucking-checking.csv",
            "ventures/ai-bookkeeper/trucking-bookkeeping.html",
            "ventures/ai-bookkeeper/trucking.test.mjs"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "1fc3701f40e1268ab6d53269fdfa452bad48e604",
          "at": 1793275896000,
          "title": "ai-bookkeeper: home inspector page, Spectora/camera/licence rules, test, post",
          "pr": 11395,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "explore",
          "bullets": [
            "ai-bookkeeper: home inspector page, Spectora/camera/licence rules, test, post"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "ai-bookkeeper"
          },
          "files": 9,
          "lines_added": 173,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-home-inspector-bookkeeping-page.md",
            "prompts/runs/2026-10-29-session_01AcxTtLLbYGZmzS3ttaGeyW.json",
            "ventures/ai-bookkeeper/fixtures/inspector-checking.csv",
            "ventures/ai-bookkeeper/inspector-bookkeeping.html",
            "ventures/ai-bookkeeper/inspector.test.mjs"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "c54dbea751e04d6056d33d1f5d96561759548886",
          "at": 1793278407000,
          "title": "ai-bookkeeper: auto repair shop page and rules",
          "pr": 11400,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "ai-bookkeeper: auto repair shop page, fleet/repair-software/rent/ASE rules, test, post",
            "prompts: fill the unfilled marine-hull run record (#11398) so validate is green",
            "flagships: trim wall-framing-takeoff next: under the 2000-character cap (validate was red on main)"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "ai-bookkeeper"
          },
          "files": 11,
          "lines_added": 197,
          "lines_removed": 6,
          "added_files": [
            "docs/posts/2026-10-29-auto-repair-shop-bookkeeping-page.md",
            "prompts/runs/2026-10-29-session_01E5sJKkKmkfNAD4mmYgswCg.json",
            "ventures/ai-bookkeeper/autorepair-bookkeeping.html",
            "ventures/ai-bookkeeper/autorepair.test.mjs",
            "ventures/ai-bookkeeper/fixtures/autorepair-checking.csv"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "6c2dc39a78b9617b905ea3264797da8513087a86",
          "at": 1793279652000,
          "title": "ai-bookkeeper: small farm and CSA page, rules, test, post",
          "pr": 11403,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "ai-bookkeeper: small farm and CSA page, rules, test, post"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "ai-bookkeeper"
          },
          "files": 9,
          "lines_added": 188,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-small-farm-csa-bookkeeping.md",
            "prompts/runs/2026-10-29-session_01EhTJVLc5EM449EQSioqeGs.json",
            "ventures/ai-bookkeeper/fixtures/smallfarm-checking.csv",
            "ventures/ai-bookkeeper/smallfarm-bookkeeping.html",
            "ventures/ai-bookkeeper/smallfarm.test.mjs"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "d1ba074a51b3157dd5fff1ede8c59660b4e08358",
          "at": 1793282017000,
          "title": "main is red: flagships changepoint next: over the cap, a dead /ventures/ link, ai-bookkeeper title and FAQ divergences",
          "pr": 11411,
          "agent": "Claude Opus 5.5",
          "models": [
            "Claude Opus 5.5"
          ],
          "track": null,
          "bullets": [
            "flagships: changepoint-detector next: back under the 2,000-character cap",
            "pages build: a post's dead /ventures/ link and an ai-bookkeeper page with no <title>",
            "ai-bookkeeper: FAQ JSON-LD matches the visible answers; market-vendor page gets share tags and structured data"
          ],
          "detail": "PR #11410 took it to 2,101 characters, so portfolio/router/validate.py fails on main and on every open PR.",
          "area": {
            "kind": "product",
            "name": "ai-bookkeeper"
          },
          "files": 7,
          "lines_added": 16,
          "lines_removed": 10,
          "added_files": [],
          "revert": false,
          "fix_forward": true
        },
        {
          "sha": "e08861643c0e7bf72d2e1a124c55324377e34e50",
          "at": 1793293207000,
          "title": "ai-bookkeeper: vending route page, rules, test, post",
          "pr": 11437,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "ai-bookkeeper: vending route page, rules, test, post"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "ai-bookkeeper"
          },
          "files": 9,
          "lines_added": 184,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-vending-route-bookkeeping.md",
            "prompts/runs/2026-10-29-session_01EhTJVPKKF3iqV5bAddoaph.json",
            "ventures/ai-bookkeeper/fixtures/vending-checking.csv",
            "ventures/ai-bookkeeper/vending-bookkeeping.html",
            "ventures/ai-bookkeeper/vending.test.mjs"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "7fc52e70ad33306429b06a4015a1d64ea3aba36a",
          "at": 1793293746000,
          "title": "ai-bookkeeper: property test for the S-corp comparison",
          "pr": 11439,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "ai-bookkeeper: property test for the S-corp comparison, post"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "ai-bookkeeper"
          },
          "files": 4,
          "lines_added": 102,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-testing-the-s-corp-calculator-with-400-random-businesses.md",
            "prompts/runs/2026-10-29-session_01AcxTtKSbuZVfeFT3E4icrg.json",
            "ventures/ai-bookkeeper/scorp-property.test.mjs"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "b7b080dcb99194942d2632413844f231929006ff",
          "at": 1793296800000,
          "title": "ai-bookkeeper: mobile notary page, rules, test, post",
          "pr": 11449,
          "agent": "Claude",
          "models": [],
          "track": "ventures",
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "ai-bookkeeper"
          },
          "files": 9,
          "lines_added": 183,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-mobile-notary-bookkeeping.md",
            "prompts/runs/2026-10-29-session_01EhTJVMit2LRD6aesVvEkxq.json",
            "ventures/ai-bookkeeper/fixtures/notary-checking.csv",
            "ventures/ai-bookkeeper/notary-bookkeeping.html",
            "ventures/ai-bookkeeper/notary.test.mjs"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "eac1efba2650c407d5bfe8012a40552dc6423ffe",
          "at": 1793297420000,
          "title": "ai-bookkeeper: Ohio vendor discount preset, test, post",
          "pr": 11452,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "ai-bookkeeper: Ohio vendor discount preset (0.75%, $750/month cap from 2026), test, post"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "ai-bookkeeper"
          },
          "files": 6,
          "lines_added": 86,
          "lines_removed": 3,
          "added_files": [
            "docs/posts/2026-10-29-ohio-sales-tax-discount-cap.md",
            "prompts/runs/2026-10-29-session_01AcxTtL3yee4pF3paBbBqn3.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "559f79c762000ad749b0b9b95d94af6679a16858",
          "at": 1793297955000,
          "title": "ai-bookkeeper: pin Ohio quarterly sales tax due dates",
          "pr": 11454,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "ai-bookkeeper: pin Ohio quarterly sales tax due dates; post and run record",
            "flagships: bring ai-bookkeeper next: under the 2000-character cap"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "ai-bookkeeper"
          },
          "files": 5,
          "lines_added": 70,
          "lines_removed": 3,
          "added_files": [
            "docs/posts/2026-10-29-ohio-quarterly-sales-tax-due-dates.md",
            "prompts/runs/2026-10-29-session_01E5sJKkHdWwv3dz5b3UnXXF.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "9eb74a1209f7e59b95a09e000040c904ff50f3bb",
          "at": 1793298125000,
          "title": "ai-bookkeeper: pin year-boundary due-date roll and no-weekend sweep",
          "pr": 11456,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "ai-bookkeeper: pin year-boundary due-date roll and no-weekend sweep for every state"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "ai-bookkeeper"
          },
          "files": 2,
          "lines_added": 66,
          "lines_removed": 1,
          "added_files": [
            "prompts/runs/2026-10-29-session_01E5sJKkhtnLiscFXR16n2a7.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "34f249d3642205051cc4f499e1da8c0eea1b162e",
          "at": 1793303971000,
          "title": "ai-bookkeeper: food truck page, rules, test, post",
          "pr": 11466,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "ai-bookkeeper: food truck page, rules, test, post"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "ai-bookkeeper"
          },
          "files": 9,
          "lines_added": 185,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-food-truck-bookkeeping.md",
            "prompts/runs/2026-10-29-session_01EhTJVPxdLD6fuvry7vWrYi.json",
            "ventures/ai-bookkeeper/fixtures/foodtruck-checking.csv",
            "ventures/ai-bookkeeper/foodtruck-bookkeeping.html",
            "ventures/ai-bookkeeper/foodtruck.test.mjs"
          ],
          "revert": false,
          "fix_forward": false
        }
      ]
    },
    {
      "name": "wall-framing-takeoff",
      "merges": [
        {
          "sha": "1c45a74ff57c19236eb86fe220e45ba4d847e243",
          "at": 1793232009000,
          "title": "wall-framing-takeoff: IFC reader takes opening height and sill, checked on a real buildingSMART file",
          "pr": 11241,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "explore",
          "bullets": [
            "wall-framing-takeoff: IFC reader takes opening height and sill, checked on a real buildingSMART file"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "wall-framing-takeoff"
          },
          "files": 9,
          "lines_added": 311,
          "lines_removed": 9,
          "added_files": [
            "docs/posts/2026-10-28-reading-window-sills-from-a-real-ifc-file.md",
            "prompts/runs/2026-10-28-session_01EhTJVP5z4mSF3D17fQm8dR.json",
            "ventures/wall-framing-takeoff/fixtures/bsi-wall-with-opening-and-window-ifc4.ifc"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "04d03836fc32170b94584d31b232073fd8e016ad",
          "at": 1793250129000,
          "title": "wall-framing-takeoff: read multi-storey IFC one storey at a time",
          "pr": 11301,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "wall-framing-takeoff: read multi-storey IFC one storey at a time; blog post"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "wall-framing-takeoff"
          },
          "files": 7,
          "lines_added": 105,
          "lines_removed": 7,
          "added_files": [
            "docs/posts/2026-10-29-two-storeys-were-one-plan.md",
            "prompts/runs/2026-10-29-session_01EhTJVMLGFQbjtFmfFBUteX.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "bbb97f0031d2ec911fef5308d9d4ce9c50db6592",
          "at": 1793254947000,
          "title": "wall-framing-takeoff: seeded fuzz test for sheathing tiling (1,200 layouts, no violation)",
          "pr": 11331,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "explore",
          "bullets": [
            "wall-framing-takeoff: seeded fuzz test for sheathing tiling (1,200 layouts, no violation); post"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "wall-framing-takeoff"
          },
          "files": 3,
          "lines_added": 139,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-1200-random-walls-and-no-gap-in-the-sheathing.md",
            "prompts/runs/2026-10-29-session_01E5sJKnU96gqhfyqbntCyHw.json",
            "ventures/wall-framing-takeoff/sheathing-fuzz.test.mjs"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "81e70427c475ab9cc9cc6f94af92268181f61a19",
          "at": 1793257705000,
          "title": "wall-framing-takeoff: plan sketch editor (draw walls, doors, windows)",
          "pr": 11340,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "wall-framing-takeoff: plan sketch editor (click-drawn walls, doors, windows to the plan)"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "wall-framing-takeoff"
          },
          "files": 10,
          "lines_added": 528,
          "lines_removed": 5,
          "added_files": [
            "docs/posts/2026-10-29-draw-your-house-get-a-framing-takeoff.md",
            "prompts/runs/2026-10-29-session_01EhTJVM2VusAB8U28dd7TAv.json",
            "ventures/wall-framing-takeoff/eval-sketch-click.mjs",
            "ventures/wall-framing-takeoff/sketch.mjs",
            "ventures/wall-framing-takeoff/sketch.test.mjs"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "5828c93f2e6e48f10e7ed87d30fd8594453b7b96",
          "at": 1793258161000,
          "title": "wall-framing-takeoff: Move tool in the plan sketch (drag corners and walls)",
          "pr": 11343,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "wall-framing-takeoff: Move tool in the plan sketch (drag corners and walls)"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "wall-framing-takeoff"
          },
          "files": 8,
          "lines_added": 192,
          "lines_removed": 9,
          "added_files": [
            "docs/posts/2026-10-29-drag-a-wall-framing-takeoff-sketch.md",
            "prompts/runs/2026-10-29-session_01AcxTtKVFAcvyuULTUPTRxm.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "59217f48c45574bc4e4a4ef216811b980d7096cc",
          "at": 1793258528000,
          "title": "wall-framing-takeoff: slide and resize doors and windows in the plan sketch",
          "pr": 11345,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "wall-framing-takeoff: slide and resize doors and windows in the plan sketch"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "wall-framing-takeoff"
          },
          "files": 8,
          "lines_added": 158,
          "lines_removed": 6,
          "added_files": [
            "docs/posts/2026-10-29-drag-a-door-along-the-wall.md",
            "prompts/runs/2026-10-29-session_01E5sJKihGX8iGzQvAAqHctd.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "f40a7f0cc78d05738f0e27047f542825556145e7",
          "at": 1793260881000,
          "title": "wall-framing-takeoff: plan sketch survives a page reload",
          "pr": 11350,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "process",
          "bullets": [
            "wall-framing-takeoff: plan sketch survives a page reload (local storage), browser test, post"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "wall-framing-takeoff"
          },
          "files": 6,
          "lines_added": 90,
          "lines_removed": 1,
          "added_files": [
            "docs/posts/2026-10-29-sketch-survives-reload.md",
            "prompts/runs/2026-10-29-session_01EhTJVLpVLzoSwJky1LxqGK.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "c2f0fcb909b1ea2fc875baea07530e7e13e86017",
          "at": 1793260966000,
          "title": "wall-framing-takeoff: validate the stored plan sketch (restoreSketch), drop damaged items",
          "pr": 11351,
          "agent": "Claude",
          "models": [],
          "track": "ventures",
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "wall-framing-takeoff"
          },
          "files": 6,
          "lines_added": 122,
          "lines_removed": 6,
          "added_files": [
            "prompts/runs/2026-10-29-session_01EhTJVPRbGzvaQsNobZazQv.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "5b51f3c2a8336bc021039428a7344e2ef7333470",
          "at": 1793261292000,
          "title": "wall-framing-takeoff: trace over a picture in the plan sketch, scaled from two clicks",
          "pr": 11349,
          "agent": "Claude",
          "models": [],
          "track": "process",
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "wall-framing-takeoff"
          },
          "files": 8,
          "lines_added": 162,
          "lines_removed": 7,
          "added_files": [
            "docs/posts/2026-10-29-trace-over-a-scanned-plan.md",
            "prompts/runs/2026-10-29-session_01EhTJVNY1CizjjFkaGmnuZT.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "ca34e1f78eaf92f0a1a9f5ddb299c85affb7131e",
          "at": 1793261719000,
          "title": "wall-framing-takeoff: move the trace-over picture",
          "pr": 11356,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "wall-framing-takeoff: move the trace-over picture (click a spot, then where it goes)"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "wall-framing-takeoff"
          },
          "files": 5,
          "lines_added": 85,
          "lines_removed": 9,
          "added_files": [
            "prompts/runs/2026-10-29-session_01E5sJKnEmgaUNCmDtLrcUdZ.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "a2943dd3a82dabb60388dc5faedcc864d1c8d21e",
          "at": 1793262440000,
          "title": "wall-framing-takeoff: straighten a crooked trace-over picture",
          "pr": 11359,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "wall-framing-takeoff: straighten a crooked trace-over picture (level or plumb from two clicks)"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "wall-framing-takeoff"
          },
          "files": 8,
          "lines_added": 180,
          "lines_removed": 18,
          "added_files": [
            "docs/posts/2026-10-29-straighten-a-crooked-plan-scan.md",
            "prompts/runs/2026-10-29-session_01E5sJKnmEW81d2zdjYYFDwR.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "e62d2555cdb679c9b6cad997647cbb5dfab75ca8",
          "at": 1793264315000,
          "title": "wall-framing-takeoff: keep the trace-over picture across reloads",
          "pr": 11360,
          "agent": "Claude",
          "models": [],
          "track": "process",
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "wall-framing-takeoff"
          },
          "files": 5,
          "lines_added": 60,
          "lines_removed": 6,
          "added_files": [
            "docs/posts/2026-10-29-trace-over-picture-survives-reload.md"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "79a98a072818008068c8f91a35384773fa76aca9",
          "at": 1793268721000,
          "title": "wall-framing-takeoff: shoe moulding in the trim takeoff",
          "pr": 11379,
          "agent": "Claude",
          "models": [],
          "track": "ventures",
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "wall-framing-takeoff"
          },
          "files": 5,
          "lines_added": 24,
          "lines_removed": 7,
          "added_files": [],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "5c625635e4eea9cc29959f7cd550c8567b327867",
          "at": 1793269296000,
          "title": "wall-framing-takeoff: scarf-joint allowance for spliced trim runs",
          "pr": 11380,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "wall-framing-takeoff: scarf-joint allowance for spliced trim runs"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "wall-framing-takeoff"
          },
          "files": 7,
          "lines_added": 99,
          "lines_removed": 16,
          "added_files": [
            "docs/posts/2026-10-29-baseboard-scarf-joints-cost-board.md",
            "prompts/runs/2026-10-29-session_01E5sJKnw84zCVFJz6XquEfx.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "327460940621a3a4ab0762193cd461b9118b613b",
          "at": 1793271519000,
          "title": "wall-framing-takeoff: eave baffle count for attic loose fill",
          "pr": 11382,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "wall-framing-takeoff: eave baffle count for attic loose fill"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "wall-framing-takeoff"
          },
          "files": 6,
          "lines_added": 76,
          "lines_removed": 4,
          "added_files": [
            "docs/posts/2026-10-29-how-many-eave-baffles-for-an-attic.md",
            "prompts/runs/2026-10-29-session_01EhTJVN77kEMqT4TSP4CMKW.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "c6a4e2d52391158068e753f712b2ec1b77fec410",
          "at": 1793271724000,
          "title": "wall-framing-takeoff: read nested DXF block symbols (mirrored, turned)",
          "pr": 11383,
          "agent": "Claude",
          "models": [],
          "track": "ventures",
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "wall-framing-takeoff"
          },
          "files": 5,
          "lines_added": 73,
          "lines_removed": 5,
          "added_files": [
            "docs/posts/2026-10-29-nested-cad-door-symbols-in-the-wall-framing-takeoff.md"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "1f56b517d92251c109ddb98a072271596f326191",
          "at": 1793279145000,
          "title": "wall-framing-takeoff: staggered blocking rows",
          "pr": 11401,
          "agent": "Claude",
          "models": [],
          "track": "ventures",
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "wall-framing-takeoff"
          },
          "files": 4,
          "lines_added": 39,
          "lines_removed": 4,
          "added_files": [
            "docs/posts/2026-10-29-staggered-blocking-in-a-wall-takeoff.md"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "6cebf4ba00cc4a396476757256166406e2642ab5",
          "at": 1793287585000,
          "title": "wall-framing-takeoff: sheathing weight on gable wall shop panels",
          "pr": 11424,
          "agent": "Claude",
          "models": [],
          "track": "ventures",
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "wall-framing-takeoff"
          },
          "files": 5,
          "lines_added": 42,
          "lines_removed": 5,
          "added_files": [
            "docs/posts/2026-10-29-gable-wall-panels-get-a-weight.md"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "d51d4dde36f69d55459bd275ca1fd357c84f62e2",
          "at": 1793289778000,
          "title": "wall-framing-takeoff: stair riser boards and handrail join the lumber order",
          "pr": 11428,
          "agent": "Claude",
          "models": [],
          "track": "explore",
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "wall-framing-takeoff"
          },
          "files": 4,
          "lines_added": 52,
          "lines_removed": 4,
          "added_files": [
            "docs/posts/2026-10-29-the-stair-order-was-missing-its-risers.md"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "a5c7987762528c5a057e7678f5ec8a4cc2fa0cf1",
          "at": 1793290773000,
          "title": "wall-framing-takeoff: foundation piers (pads, columns, rebar)",
          "pr": 11432,
          "agent": "Claude",
          "models": [],
          "track": null,
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "wall-framing-takeoff"
          },
          "files": 5,
          "lines_added": 63,
          "lines_removed": 3,
          "added_files": [
            "docs/posts/2026-10-29-foundation-takeoff-now-counts-piers.md"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "b4697209d4ccfb573899f5578da4d5a297002100",
          "at": 1793293330000,
          "title": "wall-framing-takeoff: page box for foundation piers",
          "pr": 11438,
          "agent": "Claude",
          "models": [],
          "track": null,
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "wall-framing-takeoff"
          },
          "files": 6,
          "lines_added": 50,
          "lines_removed": 3,
          "added_files": [
            "docs/posts/2026-10-29-pier-footings-in-the-framing-takeoff-page.md"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "7ad447f8d821432f8625d38f2c74cb95a9d53230",
          "at": 1793294029000,
          "title": "wall-framing-takeoff: stepped footings",
          "pr": 11442,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "wall-framing-takeoff: stepped footings (taller stem, riser blocks, step bars)"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "wall-framing-takeoff"
          },
          "files": 6,
          "lines_added": 107,
          "lines_removed": 6,
          "added_files": [
            "docs/posts/2026-10-29-stepped-footings-in-a-framing-takeoff.md",
            "prompts/runs/2026-10-29-session_01E5sJKjaeS2oWiFQNxArZvx.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "e9d0c3de482f24772079f53ed17d4473059116a9",
          "at": 1793297362000,
          "title": "wall-framing-takeoff: schedule skips listed holidays and weather days",
          "pr": 11451,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "wall-framing-takeoff: schedule skips listed holidays and weather days"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "wall-framing-takeoff"
          },
          "files": 7,
          "lines_added": 157,
          "lines_removed": 11,
          "added_files": [
            "docs/posts/2026-10-29-wall-framing-schedule-holidays.md",
            "prompts/runs/2026-10-29-session_01AcxTtL4QCcqhTivtn9XH1u.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "6ebe8f5fd7a9b0418603e5f0dcea8932080f3785",
          "at": 1793298059000,
          "title": "wall-framing-takeoff: holiday and weather-day fields on the schedule card",
          "pr": 11455,
          "agent": "Claude",
          "models": [],
          "track": "ventures",
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "wall-framing-takeoff"
          },
          "files": 4,
          "lines_added": 11,
          "lines_removed": 4,
          "added_files": [],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "9c6a0c00ecffee906e2fb9f56fe102e8cdf5debf",
          "at": 1793301685000,
          "title": "wall-framing-takeoff: siding counts gable triangles",
          "pr": 11463,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "wall-framing-takeoff: siding counts gable triangles"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "wall-framing-takeoff"
          },
          "files": 6,
          "lines_added": 176,
          "lines_removed": 8,
          "added_files": [
            "docs/posts/2026-10-29-siding-takeoff-gable-ends.md",
            "prompts/runs/2026-10-29-session_01E5sJKntYYjEg4wNHv3ioKv.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "89676c5d73f0ec8199d53961176fb0e8aa7cc47a",
          "at": 1793303991000,
          "title": "wall-framing-takeoff: measure advanced framing savings (24 in, details, together) on two houses",
          "pr": 11467,
          "agent": "Claude",
          "models": [],
          "track": "creative",
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "wall-framing-takeoff"
          },
          "files": 5,
          "lines_added": 115,
          "lines_removed": 2,
          "added_files": [
            "docs/posts/2026-10-29-advanced-framing-saves-a-quarter-of-the-lumber.md",
            "ventures/wall-framing-takeoff/advanced-bench.mjs",
            "ventures/wall-framing-takeoff/advanced-bench.test.mjs"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "cd0e1e17945dcf9f3f1b2fc49f6718e13cd089a6",
          "at": 1793307494000,
          "title": "wall-framing-takeoff: page controls for trim shoe moulding and scarf overlap",
          "pr": 11476,
          "agent": "Claude",
          "models": [],
          "track": "ventures",
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "wall-framing-takeoff"
          },
          "files": 4,
          "lines_added": 26,
          "lines_removed": 6,
          "added_files": [
            "docs/posts/2026-10-29-trim-take-off-shoe-moulding-and-scarf-joints.md"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "c2ac2c29f07f65b2b7c8e904fa4b61deb3321368",
          "at": 1793308567000,
          "title": "wall-framing-takeoff: panelised vs stick piece-count bench",
          "pr": 11481,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "wall-framing-takeoff: panelised vs stick piece-count bench, README, post"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "wall-framing-takeoff"
          },
          "files": 6,
          "lines_added": 185,
          "lines_removed": 2,
          "added_files": [
            "docs/posts/2026-10-29-panelised-vs-stick-framing-piece-counts.md",
            "prompts/runs/2026-10-29-session_01AcxTtHQBVnbkrJHCbYvbPS.json",
            "ventures/wall-framing-takeoff/panelised-bench.mjs",
            "ventures/wall-framing-takeoff/panelised-bench.test.mjs"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "1d89ff00d91d7cb0f3114f4d1c11e5cccb126d35",
          "at": 1793311067000,
          "title": "wall-framing-takeoff: stair tread span check between stringers",
          "pr": 11486,
          "agent": "Claude",
          "models": [],
          "track": "ventures",
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "wall-framing-takeoff"
          },
          "files": 5,
          "lines_added": 49,
          "lines_removed": 2,
          "added_files": [
            "docs/posts/2026-10-29-do-your-stair-treads-span-too-far.md"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "9e3160cdd81e6d447aae48f8c1c729f8e6f53a01",
          "at": 1793311123000,
          "title": "wall-framing-takeoff: refresh stale bench row in README; post on first-fit vs length-priced lumber",
          "pr": 11487,
          "agent": "Claude",
          "models": [],
          "track": "process",
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "wall-framing-takeoff"
          },
          "files": 2,
          "lines_added": 27,
          "lines_removed": 2,
          "added_files": [
            "docs/posts/2026-10-29-first-fit-costs-9-percent-when-lumber-prices-by-length.md"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "d1fe94b8d2afbf1e03b45d604b3ace9ceda3b9c0",
          "at": 1793315401000,
          "title": "wall-framing-takeoff: --wall-layer/--door-layer/--window-layer flags, found on real DXF files",
          "pr": 11499,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "wall-framing-takeoff: --wall-layer/--door-layer/--window-layer flags, found on real DXF files",
            "Shorten post description; run record"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "wall-framing-takeoff"
          },
          "files": 5,
          "lines_added": 92,
          "lines_removed": 3,
          "added_files": [
            "docs/posts/2026-10-29-real-dxf-files-wall-framing-layer-flags.md",
            "prompts/runs/2026-10-29-session_01AcxTtLCuvpGGKZZNv6kL5b.json"
          ],
          "revert": false,
          "fix_forward": false
        }
      ]
    },
    {
      "name": "shed-designer",
      "merges": [
        {
          "sha": "a0af78ce0674ac7dee78b5a9a2cec764ffc54d17",
          "at": 1793250873000,
          "title": "shed-designer: drag-to-design shed with plans, 3D, cut sheet, Home Depot/Lowe's pricing and cost optimizers",
          "pr": 11268,
          "agent": "Claude Opus 5.5",
          "models": [
            "Claude Opus 5.5"
          ],
          "track": null,
          "bullets": [
            "shed-designer: drag-to-design gable shed with plans, 3D view and lumber cut sheet",
            "shed-designer: link from sibling tools so the page is not a crawlable orphan",
            "docs/posts: point five tool links at the served path, not /ventures/",
            "shed-designer: structure checks, no floating parts, cited prices, options, roof trim, interior",
            "Sync tree counts for shed-designer (1319 -> 1320 mirrored tools)",
            "gitops: mount the 56th mirror shard that shed-designer's pages add"
          ],
          "detail": "New browser tool in ventures/shed-designer.",
          "area": {
            "kind": "product",
            "name": "shed-designer"
          },
          "files": 61,
          "lines_added": 11088,
          "lines_removed": 13,
          "added_files": [
            "docs/posts/2026-10-29-549-off-an-8x12-shed-with-stock-parts.md",
            "docs/posts/2026-10-29-an-8-ft-shed-peak-and-a-6-6-door.md",
            "docs/posts/2026-10-29-home-depot-or-lowes-for-an-8x12-shed.md",
            "docs/posts/2026-10-29-the-shed-walls-had-no-tops.md",
            "docs/posts/2026-10-29-what-a-shed-costs-past-the-lumber.md",
            "prompts/runs/2026-10-29-session_01XpHqybzchtMfHw92UkSk5K.json",
            "ventures/shed-designer/LICENSE",
            "ventures/shed-designer/README.md",
            "ventures/shed-designer/VENTURE.yaml",
            "ventures/shed-designer/app.mjs",
            "ventures/shed-designer/candidates.mjs",
            "ventures/shed-designer/catalog.mjs",
            "ventures/shed-designer/checks.mjs",
            "ventures/shed-designer/checks.test.mjs",
            "ventures/shed-designer/connections.mjs",
            "ventures/shed-designer/connections.test.mjs",
            "ventures/shed-designer/data/structure-fixture.json",
            "ventures/shed-designer/drawings.mjs",
            "ventures/shed-designer/drawings.test.mjs",
            "ventures/shed-designer/editor.mjs",
            "ventures/shed-designer/editor.test.mjs",
            "ventures/shed-designer/estimate.mjs",
            "ventures/shed-designer/estimate.test.mjs",
            "ventures/shed-designer/finishing.test.mjs",
            "ventures/shed-designer/index.html",
            "ventures/shed-designer/instructions.mjs",
            "ventures/shed-designer/instructions.test.mjs",
            "ventures/shed-designer/integrity.mjs",
            "ventures/shed-designer/integrity.test.mjs",
            "ventures/shed-designer/llms.txt",
            "ventures/shed-designer/lowes.mjs",
            "ventures/shed-designer/lumber.mjs",
            "ventures/shed-designer/lumber.test.mjs",
            "ventures/shed-designer/model.mjs",
            "ventures/shed-designer/model.test.mjs",
            "ventures/shed-designer/optimize.mjs",
            "ventures/shed-designer/optimize.test.mjs",
            "ventures/shed-designer/page.test.mjs",
            "ventures/shed-designer/prices.mjs",
            "ventures/shed-designer/products.mjs",
            "ventures/shed-designer/quote.mjs",
            "ventures/shed-designer/quote.test.mjs",
            "ventures/shed-designer/render3d.mjs",
            "ventures/shed-designer/robots.txt",
            "ventures/shed-designer/shed-plans-with-cut-list.html",
            "ventures/shed-designer/simplify.mjs",
            "ventures/shed-designer/sitemap.xml",
            "ventures/shed-designer/structure.mjs",
            "ventures/shed-designer/structure.test.mjs",
            "ventures/shed-designer/usage.mjs",
            "ventures/shed-designer/usage.test.mjs"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "ad860fb75b7a99c43237d1eb035d7bc64a680960",
          "at": 1793251346000,
          "title": "shed-designer: structural correctness — ridge-beam post on a skid, ridge-board eave loads, skid joints on blocks, panel joints on framing",
          "pr": 11307,
          "agent": "Claude Opus 5.5",
          "models": [
            "Claude Opus 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "shed-designer: ridge-board eave loads, skid joints on blocks, sill cripples on layout, panel-edge checks",
            "shed-designer: a skid under the ridge-beam posts, and a check that it is there",
            "shed-designer: a cripple over the jack where a king stud pushes a layout line aside",
            "shed-designer: pin the stud, floor joist and rafter checks to hand calculations",
            "shed-designer: post and README on the four framing faults the new checks found"
          ],
          "detail": "",
          "area": {
            "kind": "product",
            "name": "shed-designer"
          },
          "files": 9,
          "lines_added": 314,
          "lines_removed": 13,
          "added_files": [
            "docs/posts/2026-10-29-four-framing-faults-the-shed-checks-missed.md",
            "prompts/runs/2026-10-29-session_01XpHqydjPUYuhxkkTPrf1fd.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "dd988879b155198a9ff2c10696ae5ba1a15f7b8d",
          "at": 1793251797000,
          "title": "shed-designer: plans and cut sheet lane — cut optimizer proves its lower bound and buys cheaper",
          "pr": 11311,
          "agent": "Claude Opus 5.5",
          "models": [
            "Claude Opus 5.5"
          ],
          "track": "polish",
          "bullets": [
            "shed-designer: plans and cut sheet lane — cut optimizer solves the relaxation, proves its lower bound",
            "docs/posts: how close is a lumber cut list to the cheapest possible"
          ],
          "detail": "Gilmore-Gomory column generation (revised simplex over patterns, exact branch-and-bound knapsack pricing per stock length); the relaxation's whole patterns are rounded down and the rest packed as before, keeping the cheaper plan.",
          "area": {
            "kind": "product",
            "name": "shed-designer"
          },
          "files": 11,
          "lines_added": 378,
          "lines_removed": 42,
          "added_files": [
            "docs/posts/2026-10-29-shed-designer-cut-list-proven-lower-bound.md",
            "prompts/runs/2026-10-29-session_01XpHqycCR7esoCNZ2PusK5P.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "effdf81e1063918ce0ec00abb3d935aee57f2c77",
          "at": 1793251905000,
          "title": "shed-designer: choose top and cap plate joints together; offset check at the IRC's 24\"",
          "pr": 11313,
          "agent": "Claude",
          "models": [],
          "track": "ventures",
          "bullets": [],
          "detail": "With 8 or 10 ft boards the greedy split took the longest top-plate piece first and could leave the cap plate no joint 4 ft clear of it, so the connection check failed on presets such as the 12x16.",
          "area": {
            "kind": "product",
            "name": "shed-designer"
          },
          "files": 4,
          "lines_added": 72,
          "lines_removed": 10,
          "added_files": [],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "d88db00f55aee09f70f64465d291f13dbea7c4db",
          "at": 1793252596000,
          "title": "shed-designer: plans and cut sheet lane — plans print, fit the page, carry every mark and match the model",
          "pr": 11314,
          "agent": "Claude Opus 5.5",
          "models": [
            "Claude Opus 5.5"
          ],
          "track": "polish",
          "bullets": [
            "shed-designer: plans and cut sheet lane — plans print, fit the page, carry every mark and match the model",
            "docs/posts: checking shed plans against the model that drew them"
          ],
          "detail": "",
          "area": {
            "kind": "product",
            "name": "shed-designer"
          },
          "files": 6,
          "lines_added": 350,
          "lines_removed": 26,
          "added_files": [
            "docs/posts/2026-10-29-shed-designer-plans-checked-against-the-model.md",
            "ventures/shed-designer/plans.test.mjs"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "dd8913527922c9a4f21d803bd2bf847fb9807104",
          "at": 1793253104000,
          "title": "shed-designer: plans and cut sheet lane — cut sheet counts identical boards, prints in colour; door steps name marks",
          "pr": 11319,
          "agent": "Claude",
          "models": [],
          "track": "polish",
          "bullets": [],
          "detail": "",
          "area": {
            "kind": "product",
            "name": "shed-designer"
          },
          "files": 8,
          "lines_added": 108,
          "lines_removed": 29,
          "added_files": [
            "docs/reports/shed-designer-overnight-lane2.md"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "a064fa67ca0f9480589b43f5451d3b90ed255294",
          "at": 1793253677000,
          "title": "shed-designer: lumber list pages for 12 common sizes, written by the engine and checked for drift",
          "pr": 11322,
          "agent": "Claude",
          "models": [],
          "track": "ventures",
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "shed-designer"
          },
          "files": 21,
          "lines_added": 1214,
          "lines_removed": 2,
          "added_files": [
            "docs/posts/2026-10-29-how-much-lumber-for-a-shed-by-size.md",
            "prompts/runs/2026-10-29-session_01EhTJVNQhvCRNjtPaWJKLU1.json",
            "ventures/shed-designer/how-much-lumber-for-a-10x10-shed.html",
            "ventures/shed-designer/how-much-lumber-for-a-10x12-shed.html",
            "ventures/shed-designer/how-much-lumber-for-a-10x14-shed.html",
            "ventures/shed-designer/how-much-lumber-for-a-10x16-shed.html",
            "ventures/shed-designer/how-much-lumber-for-a-10x20-shed.html",
            "ventures/shed-designer/how-much-lumber-for-a-12x12-shed.html",
            "ventures/shed-designer/how-much-lumber-for-a-12x16-shed.html",
            "ventures/shed-designer/how-much-lumber-for-a-12x20-shed.html",
            "ventures/shed-designer/how-much-lumber-for-a-12x24-shed.html",
            "ventures/shed-designer/how-much-lumber-for-a-8x10-shed.html",
            "ventures/shed-designer/how-much-lumber-for-a-8x16-shed.html",
            "ventures/shed-designer/how-much-lumber-for-a-8x8-shed.html",
            "ventures/shed-designer/make-size-pages.mjs",
            "ventures/shed-designer/shed-lumber-list-by-size.html",
            "ventures/shed-designer/size-pages.test.mjs"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "efc143d6af29bb5ec41d3ad3b098ef3fe3196454",
          "at": 1793253837000,
          "title": "shed-designer: lane 5 robustness — fuzz test over designs and junk state, and the bugs it found",
          "pr": 11312,
          "agent": "Claude Opus 5.5",
          "models": [
            "Claude Opus 5.5"
          ],
          "track": "polish",
          "bullets": [
            "shed-designer: lane 5 robustness — fuzz test over designs and junk state, and the bugs it found",
            "shed-designer lane 5: run record; shorten the post description"
          ],
          "detail": "A seeded property test (fuzz.test.mjs) sweeps random designs and junk saved/linked state and asserts: no throws, no NaN or negative lengths or prices, integrity passes, every structural check runs, SVG and R12 DXF well formed.",
          "area": {
            "kind": "product",
            "name": "shed-designer"
          },
          "files": 11,
          "lines_added": 430,
          "lines_removed": 39,
          "added_files": [
            "docs/posts/2026-10-29-breaking-the-shed-designer-on-purpose.md",
            "prompts/runs/2026-10-29-session_01XpHqyd3twBvmmRdYbigYAJ.json",
            "ventures/shed-designer/fuzz.test.mjs"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "e6ba59652059f028d978efa6b0286da20a9f0990",
          "at": 1793254186000,
          "title": "shed-designer: lane 3 editor UX — keyboard, touch, undo, end view, faster edits, browser tests",
          "pr": 11316,
          "agent": "Claude Opus 5.5",
          "models": [
            "Claude Opus 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "shed-designer: lane 3 editor UX — keyboard, touch, undo, end view, faster edits, browser tests",
            "shed-designer: door and window touch targets, no jump when grabbed off-centre",
            "shed-designer browser CI: Playwright 1.63.0, which installs Chromium on Ubuntu 26.04",
            "publish-surface: shed-designer-browser.yml publishes nothing"
          ],
          "detail": "",
          "area": {
            "kind": "product",
            "name": "shed-designer"
          },
          "files": 13,
          "lines_added": 764,
          "lines_removed": 70,
          "added_files": [
            ".github/workflows/shed-designer-browser.yml",
            "docs/posts/2026-10-29-shed-designer-driven-like-a-first-time-visitor.md",
            "prompts/runs/2026-10-29-session_01XpHqyeer9LhNXp1mg3LzQU.json",
            "ventures/shed-designer/browser.test.mjs"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "83a4717917d195b7af77b1297b5675a264759fab",
          "at": 1793254819000,
          "title": "shed-designer: rafter-tie heel joint nailed for the thrust, not a fixed three 16d",
          "pr": 11315,
          "agent": "Claude",
          "models": [],
          "track": "ventures",
          "bullets": [],
          "detail": "Under a ridge board the tie holds the rafter pair's outward thrust, wL^2/8h.",
          "area": {
            "kind": "product",
            "name": "shed-designer"
          },
          "files": 7,
          "lines_added": 114,
          "lines_removed": 3,
          "added_files": [
            "docs/posts/2026-10-29-how-many-nails-hold-a-shed-rafter-tie.md"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "de5dfc3581f5b0622c8de68609003db8eb7faf6f",
          "at": 1793255621000,
          "title": "shed-designer: plans and cut sheet lane — sheet counts rip narrow rows from shared sheets",
          "pr": 11320,
          "agent": "Claude Opus 5.5",
          "models": [
            "Claude Opus 5.5"
          ],
          "track": "polish",
          "bullets": [
            "shed-designer: plans and cut sheet lane — sheet counts rip narrow rows from shared sheets",
            "lane 2 report: sheet goods",
            "shed-designer: make-size-pages money() signs outside the symbol (check_money_sign, from PR #11322)",
            "shed-designer: size-pages index ships Article JSON-LD (secondary-schema test, from PR #11322)"
          ],
          "detail": "The floor and roof sheet counts packed every piece as a full-width sheet, so a 24\" last floor row or a 9\" course at the ridge cost a whole sheet per piece.",
          "area": {
            "kind": "product",
            "name": "shed-designer"
          },
          "files": 23,
          "lines_added": 173,
          "lines_removed": 117,
          "added_files": [],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "e945f8e65c452024a1dcaf33a0c631ca727f6e75",
          "at": 1793256862000,
          "title": "shed-designer: lane 1 structural — gable headers carry the end rafter; regenerate size pages; lane report",
          "pr": 11332,
          "agent": "Claude Opus 5.5",
          "models": [
            "Claude Opus 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "shed-designer: gable-wall headers carry the end rafter's roof; lane 1 overnight report",
            "shed-designer: regenerate the size pages (main red since the heel-joint nails)",
            "shed-designer: size pages pass the money-sign and structured-data checks"
          ],
          "detail": "A gable-wall header was checked with a flat 40 lb/ft for the gable framing and nothing for the end rafter, which bears on the gable studs along the whole slope: half a rafter spacing of roof, about 47 lb/ft at 30 psf snow.",
          "area": {
            "kind": "product",
            "name": "shed-designer"
          },
          "files": 4,
          "lines_added": 89,
          "lines_removed": 4,
          "added_files": [
            "docs/reports/shed-designer-overnight-lane1.md"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "53afcc7812f4ccba206a143ea4d1460a386512ca",
          "at": 1793256982000,
          "title": "shed-designer: lane 3 — end view fills its box on a phone; overnight report",
          "pr": 11327,
          "agent": "Claude Opus 5.5",
          "models": [
            "Claude Opus 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "shed-designer: lane 3 — end view fills its box on a phone; overnight report",
            "shed-designer: make-size-pages money() signs outside the symbol (check_money_sign was red on main)",
            "shed-designer: size index page ships JSON-LD (port of PR #11334; secondary-schema test was red on main)",
            "shed-designer: regenerate size pages from the engine (size-pages drift test was red on main; same content as PR #11334)"
          ],
          "detail": "The end view reserved room for a 14/12 roof in a fixed 2:1 box, so on a Pixel 7 the 8 ft gable end was drawn 76 px wide in a 344 px box and its three 44 px handle targets overlapped.",
          "area": {
            "kind": "product",
            "name": "shed-designer"
          },
          "files": 6,
          "lines_added": 80,
          "lines_removed": 8,
          "added_files": [
            "docs/posts/2026-10-29-playwright-on-ubuntu-26-04.md",
            "docs/reports/shed-designer-overnight-lane3.md"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "fb1fae73c751b00f22bc64137bce2795aac6e82c",
          "at": 1793280698000,
          "title": "shed-designer: lane 5 — roof sheathing joints on rafters, connector-seat wording, fuzz requires connection checks",
          "pr": 11317,
          "agent": "Claude Opus 5.5",
          "models": [
            "Claude Opus 5.5"
          ],
          "track": "polish",
          "bullets": [
            "shed-designer: lane 5 — connector seats described as connectors; fuzz requires every connection check",
            "docs: shed-designer overnight lane 5 report",
            "shed-designer: lane 5 — roof sheathing joints always land on a rafter",
            "shed-designer: money() puts the sign outside the $ (fix_money_sign.mjs; main's validate is red on it since PR #11322)",
            "shed-designer: size index page ships JSON-LD; regenerate the size pages"
          ],
          "detail": "The connection check called a connector seat \"a full birdsmouth seat\" (the default design uses connectors).",
          "area": {
            "kind": "product",
            "name": "shed-designer"
          },
          "files": 4,
          "lines_added": 68,
          "lines_removed": 4,
          "added_files": [
            "docs/reports/shed-designer-overnight-lane5.md"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "7f4a93556b4509e3469387d5a0e3863ad931c0f0",
          "at": 1793282028000,
          "title": "shed-designer: lane 4 cost honesty — estimates labelled, store comparison agrees with the list, unpriced openings named, marketing page tested",
          "pr": 11318,
          "agent": "Claude Opus 5.5",
          "models": [
            "Claude Opus 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "shed-designer: lane 4 cost honesty — estimates labelled, store comparison agrees with the list, unpriced openings named, marketing page tested against the tool",
            "shed-designer post and record: Menards readings are not committed",
            "flagships: changepoint-detector next: back under the 2,000-character cap",
            "pages build: a post's dead /ventures/ link and an ai-bookkeeper page with no <title>",
            "ai-bookkeeper: FAQ JSON-LD matches the visible answers; market-vendor page gets share tags and structured data"
          ],
          "detail": "",
          "area": {
            "kind": "product",
            "name": "shed-designer"
          },
          "files": 10,
          "lines_added": 313,
          "lines_removed": 28,
          "added_files": [
            "docs/posts/2026-10-29-shed-designer-numbers-that-drift.md",
            "prompts/runs/2026-10-29-session_01XpHqyeS6gsz3tkQdJ13SA8.json",
            "ventures/shed-designer/marketing.test.mjs",
            "ventures/shed-designer/prices-honesty.test.mjs"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "4ae01daa10961dd183b9f1a067276f215b8f102e",
          "at": 1793282525000,
          "title": "shed-designer: lane 4 — allowlisted price re-check, drywall tape price, link from the install-bid article, lane report",
          "pr": 11412,
          "agent": "Claude",
          "models": [],
          "track": "ventures",
          "bullets": [],
          "detail": "",
          "area": {
            "kind": "product",
            "name": "shed-designer"
          },
          "files": 7,
          "lines_added": 241,
          "lines_removed": 4,
          "added_files": [
            "docs/reports/shed-designer-overnight-lane4.md",
            "ventures/shed-designer/recheck_prices.py",
            "ventures/shed-designer/test_recheck_prices.py"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "bf852ba9950aa182bf85e531ae90229b26fbed06",
          "at": 1793282694000,
          "title": "shed-designer: lane 5 — siding nailers behind 4 ft joints that land beside an opening",
          "pr": 11326,
          "agent": "Claude Opus 5.5",
          "models": [
            "Claude Opus 5.5"
          ],
          "track": "polish",
          "bullets": [
            "shed-designer: lane 5 — connector seats described as connectors; fuzz requires every connection check",
            "docs: shed-designer overnight lane 5 report",
            "shed-designer: lane 5 — roof sheathing joints always land on a rafter",
            "shed-designer: money() puts the sign outside the $ (fix_money_sign.mjs; main's validate is red on it since PR #11322)",
            "shed-designer: lane 5 (WIP) — siding nailers behind 4 ft joints that land beside an opening",
            "shed-designer: fuzz requires the siding-joint check too; pin the narrow-gap nailer case"
          ],
          "detail": "The connection check called a connector seat \"a full birdsmouth seat\" (the default design uses connectors).",
          "area": {
            "kind": "product",
            "name": "shed-designer"
          },
          "files": 5,
          "lines_added": 95,
          "lines_removed": 7,
          "added_files": [
            "docs/posts/2026-10-29-the-window-that-ate-the-stud.md"
          ],
          "revert": false,
          "fix_forward": false
        }
      ]
    },
    {
      "name": "changepoint-detector",
      "merges": [
        {
          "sha": "16c46adc02e0640077d7cc7b3da8dba7c0d3a8ce",
          "at": 1793236803000,
          "title": "changepoint-detector: shape-or-shock test on the drift warning (negative result)",
          "pr": 11259,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "changepoint-detector: shape-or-shock test on the drift warning (negative result)"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "changepoint-detector"
          },
          "files": 6,
          "lines_added": 101,
          "lines_removed": 1,
          "added_files": [
            "docs/posts/2026-10-29-shape-or-shock-a-negative-result.md",
            "prompts/runs/2026-10-29-session_01E5sJKjZAPVyZ6ARjQ85SKy.json",
            "ventures/changepoint-detector/eval/drift-warning-shape.mjs",
            "ventures/changepoint-detector/eval/drift-warning-shape.out.txt"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "1135e386341d92603b37ac76284e8d597f6b6626",
          "at": 1793239745000,
          "title": "changepoint-detector: level-scaled refit as a shape-vs-shock test (negative result)",
          "pr": 11264,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "changepoint-detector: level-scaled refit as a shape-vs-shock test (negative result)"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "changepoint-detector"
          },
          "files": 6,
          "lines_added": 110,
          "lines_removed": 1,
          "added_files": [
            "docs/posts/2026-10-29-shape-or-shock-second-try.md",
            "prompts/runs/2026-10-29-session_01AcxTtKfejihXY8RtDtRBAn.json",
            "ventures/changepoint-detector/eval/drift-warning-multiplicative.mjs",
            "ventures/changepoint-detector/eval/drift-warning-multiplicative.out.txt"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "98f3b8c352974f2ee39950507077fa1b5893838a",
          "at": 1793243379000,
          "title": "changepoint-detector: log refit as a shape-vs-shock test (negative result)",
          "pr": 11275,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "posts: front matter for two 2026-10-29 posts",
            "changepoint-detector: log refit as a shape-vs-shock test (negative result), post; front matter for two posts"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "changepoint-detector"
          },
          "files": 7,
          "lines_added": 187,
          "lines_removed": 2,
          "added_files": [
            "docs/posts/2026-10-29-shape-or-shock-third-try-log-refit.md",
            "prompts/runs/2026-10-29-session_01AcxTtGzUEnMciCpnAqp8g4.json",
            "ventures/changepoint-detector/drift-warning-log.test.mjs",
            "ventures/changepoint-detector/eval/drift-warning-log.mjs",
            "ventures/changepoint-detector/eval/drift-warning-log.out.txt"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "e39c8373ab528a8803ddff89650645aac4f98ff0",
          "at": 1793251238000,
          "title": "changepoint-detector: drift warning tested on two real shock series (Australian arrivals)",
          "pr": 11309,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "changepoint-detector: drift warning on two real shock series (Australian arrivals)"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "changepoint-detector"
          },
          "files": 10,
          "lines_added": 380,
          "lines_removed": 1,
          "added_files": [
            "docs/posts/2026-10-29-the-drift-warning-and-9-11.md",
            "prompts/runs/2026-10-29-session_01E5sJKniPbkygD4GZZ9swnD.json",
            "ventures/changepoint-detector/data/au-arrivals-japan.csv",
            "ventures/changepoint-detector/data/au-arrivals-us.csv",
            "ventures/changepoint-detector/drift-warning-arrivals.test.mjs",
            "ventures/changepoint-detector/eval/drift-warning-arrivals.mjs",
            "ventures/changepoint-detector/eval/drift-warning-arrivals.out.txt"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "6c601c7f82f32af15096ca5132f49240ed8fe91b",
          "at": 1793254219000,
          "title": "changepoint-detector: drift warning on trendless seasonal series (null warns too)",
          "pr": 11324,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "changepoint-detector: drift warning on trendless seasonal series (UK lung deaths; null warns too)"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "changepoint-detector"
          },
          "files": 12,
          "lines_added": 435,
          "lines_removed": 1,
          "added_files": [
            "docs/posts/2026-10-29-a-seasonal-shock-warning-that-also-warns-on-nothing.md",
            "prompts/runs/2026-10-29-session_01AcxTtJ4Bkb9fCrse5JXDPw.json",
            "ventures/changepoint-detector/data/uk-fdeaths.csv",
            "ventures/changepoint-detector/data/uk-ldeaths.csv",
            "ventures/changepoint-detector/data/uk-mdeaths.csv",
            "ventures/changepoint-detector/data/us-accidental-deaths.csv",
            "ventures/changepoint-detector/drift-warning-trendless.test.mjs",
            "ventures/changepoint-detector/eval/drift-warning-trendless.mjs",
            "ventures/changepoint-detector/eval/drift-warning-trendless.out.txt"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "624125e4db422e174ca56c5c1c34beb8cf85d798",
          "at": 1793257173000,
          "title": "changepoint-detector: range95 on a real closure (Ansett 1989 pilots' dispute), test, post",
          "pr": 11339,
          "agent": "Claude",
          "models": [],
          "track": "ventures",
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "changepoint-detector"
          },
          "files": 8,
          "lines_added": 506,
          "lines_removed": 2,
          "added_files": [
            "docs/posts/2026-10-29-an-airline-strike-in-weekly-data.md",
            "ventures/changepoint-detector/ansett-strike.test.mjs",
            "ventures/changepoint-detector/data/ansett-melsyd-economy.csv",
            "ventures/changepoint-detector/eval/ansett-strike.mjs",
            "ventures/changepoint-detector/eval/ansett-strike.out.txt"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "947a423b2f93e0ab6fb8397a2502e2d666c988ee",
          "at": 1793265198000,
          "title": "changepoint-detector: Hurricane Maria in Puerto Rico daily deaths (real shock, ranges hold)",
          "pr": 11365,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "changepoint-detector: Hurricane Maria in Puerto Rico daily deaths, a real shock the ranges hold"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "changepoint-detector"
          },
          "files": 9,
          "lines_added": 1455,
          "lines_removed": 1,
          "added_files": [
            "docs/posts/2026-10-29-the-detector-and-the-hurricane.md",
            "prompts/runs/2026-10-29-session_01AcxTtJFsU6XXEed7wKqiyd.json",
            "ventures/changepoint-detector/data/puerto-rico-daily-deaths.csv",
            "ventures/changepoint-detector/eval/maria-deaths.mjs",
            "ventures/changepoint-detector/eval/maria-deaths.out.txt",
            "ventures/changepoint-detector/maria-deaths.test.mjs"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "fc2e6adf698e84c9842d91be5d446f3afc4f90af",
          "at": 1793268083000,
          "title": "changepoint-detector: drift warning on 195 months of euro factory orders",
          "pr": 11374,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "changepoint-detector: drift warning on 195 months of euro factory orders (warns 4/4, 16-22 steps)"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "changepoint-detector"
          },
          "files": 9,
          "lines_added": 311,
          "lines_removed": 1,
          "added_files": [
            "docs/posts/2026-10-29-does-a-longer-series-tell-a-shock-from-a-season-changepoint.md",
            "prompts/runs/2026-10-29-session_01EhTJVP2sngMrpuMTuwLQFa.json",
            "ventures/changepoint-detector/data/eu-elecequip.csv",
            "ventures/changepoint-detector/drift-warning-elecequip.test.mjs",
            "ventures/changepoint-detector/eval/drift-warning-elecequip.mjs",
            "ventures/changepoint-detector/eval/drift-warning-elecequip.out.txt"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "28c0a50977bd433bdff9da8161353021be418afc",
          "at": 1793269388000,
          "title": "changepoint-detector: same-length synthetic null for driftWarning",
          "pr": 11381,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "changepoint-detector: same-length synthetic null for driftWarning (autocorrelation alone fires it)"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "changepoint-detector"
          },
          "files": 7,
          "lines_added": 136,
          "lines_removed": 1,
          "added_files": [
            "docs/posts/2026-10-29-does-a-drift-warning-cry-wolf-on-a-clean-series.md",
            "prompts/runs/2026-10-29-session_01E5sJKn1D7SLF5xvy1he95b.json",
            "ventures/changepoint-detector/drift-warning-null195.test.mjs",
            "ventures/changepoint-detector/eval/drift-warning-null195.mjs",
            "ventures/changepoint-detector/eval/drift-warning-null195.out.txt"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "6168c14adfbce725834c009629294f23c8479628",
          "at": 1793277361000,
          "title": "changepoint-detector: drift warning points at --ar1 on autocorrelated series",
          "pr": 11396,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "changepoint-detector: drift warning points at --ar1 when noise is autocorrelated; measured on a 195-month null"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "changepoint-detector"
          },
          "files": 8,
          "lines_added": 113,
          "lines_removed": 2,
          "added_files": [
            "docs/posts/2026-10-29-when-noise-alone-looks-like-a-drifting-season.md",
            "prompts/runs/2026-10-29-session_01AcxTtJ25zSRunBYxhRs84L.json",
            "ventures/changepoint-detector/drift-warning-null195-ar1.test.mjs",
            "ventures/changepoint-detector/eval/drift-warning-null195-ar1.mjs",
            "ventures/changepoint-detector/eval/drift-warning-null195-ar1.out.txt"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "5cba8860900e05e5c64f61e95f79d6ddbbd8e386",
          "at": 1793279992000,
          "title": "changepoint-detector: real airline-miles series, trend model gives one change at 1946",
          "pr": 11407,
          "agent": "Claude",
          "models": [],
          "track": "ventures",
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "changepoint-detector"
          },
          "files": 8,
          "lines_added": 100,
          "lines_removed": 2,
          "added_files": [
            "docs/posts/2026-10-29-airline-miles-one-change-after-the-war.md",
            "ventures/changepoint-detector/airmiles.test.mjs",
            "ventures/changepoint-detector/data/airmiles.csv",
            "ventures/changepoint-detector/eval/airmiles.mjs",
            "ventures/changepoint-detector/eval/airmiles.out.txt"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "b45aedc3792049049c7069ee6840fd1ae8f1668d",
          "at": 1793280783000,
          "title": "changepoint-detector: --ar1 loses the drift warning on UK gas (real-series check)",
          "pr": 11410,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "changepoint-detector: --ar1 loses the drift warning on UK gas (real series check)"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "changepoint-detector"
          },
          "files": 8,
          "lines_added": 123,
          "lines_removed": 1,
          "added_files": [
            "docs/posts/2026-10-29-does-ar1-hide-a-drifting-season.md",
            "docs/reports/changepoint-ar1-real-drift.md",
            "prompts/runs/2026-10-29-session_01E5sJKkGoupbVvsz3AMq2Fx.json",
            "ventures/changepoint-detector/drift-warning-real-ar1.test.mjs",
            "ventures/changepoint-detector/eval/drift-warning-real-ar1.mjs",
            "ventures/changepoint-detector/eval/drift-warning-real-ar1.out.txt"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "4901155ad2c7273798ee572e6ae08c713f7e5303",
          "at": 1793284234000,
          "title": "changepoint-detector: real WWWusage and nhtemp series pinned",
          "pr": 11417,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "changepoint-detector: real WWWusage and nhtemp series pinned (wanderer: 21 steps, 0 with --ar1)",
            "docs: changepoint-detector post on WWWusage and nhtemp",
            "prompts: run record"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "changepoint-detector"
          },
          "files": 8,
          "lines_added": 292,
          "lines_removed": 4,
          "added_files": [
            "docs/posts/2026-10-29-a-wandering-series-is-not-a-staircase.md",
            "prompts/runs/2026-10-29-session_01AcxTtJwRiwnZPdN9YAnQu3.json",
            "ventures/changepoint-detector/data/nhtemp.csv",
            "ventures/changepoint-detector/data/www-usage.csv",
            "ventures/changepoint-detector/wwwusage-nhtemp.test.mjs"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "3dabf0fb9ee575040a964c1cf507b8ad9a397df7",
          "at": 1793311249000,
          "title": "changepoint-detector: Ansett first-class series, a closure that is not quiet (negative result)",
          "pr": 11488,
          "agent": "Claude",
          "models": [],
          "track": "research",
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "changepoint-detector"
          },
          "files": 8,
          "lines_added": 494,
          "lines_removed": 1,
          "added_files": [
            "docs/posts/2026-10-29-a-quieter-airline-series-was-not-quiet.md",
            "ventures/changepoint-detector/ansett-first.test.mjs",
            "ventures/changepoint-detector/data/ansett-melsyd-first.csv",
            "ventures/changepoint-detector/eval/ansett-first.mjs",
            "ventures/changepoint-detector/eval/ansett-first.out.txt"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "aec93af34179a77ec1afe3a9b101196d3ff43cf7",
          "at": 1793312457000,
          "title": "changepoint-detector: sweep all 30 Ansett series for the 1989 strike",
          "pr": 11494,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "changepoint-detector: sweep all 30 Ansett series for the 1989 strike (no quiet series; range95 holds 29/30 nb)",
            "Shorten post description"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "changepoint-detector"
          },
          "files": 10,
          "lines_added": 7615,
          "lines_removed": 1,
          "added_files": [
            "docs/posts/2026-10-29-thirty-airline-series-none-quiet-changepoints.md",
            "docs/reports/2026-10-29-ansett-sweep.md",
            "prompts/runs/2026-10-29-session_01E5sJKjWuTLZQUqFKS5oFt8.json",
            "ventures/changepoint-detector/ansett-sweep.test.mjs",
            "ventures/changepoint-detector/data/ansett-all.csv",
            "ventures/changepoint-detector/eval/ansett-sweep.mjs",
            "ventures/changepoint-detector/eval/ansett-sweep.out.txt"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "cd02b1dabd82f3a34d73b0b94f395dc4ed1d2634",
          "at": 1793316040000,
          "title": "changepoint-detector: SMI, CAC and FTSE alongside the DAX volatility rise",
          "pr": 11503,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "changepoint-detector: SMI, CAC and FTSE alongside the DAX volatility rise"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "changepoint-detector"
          },
          "files": 12,
          "lines_added": 5767,
          "lines_removed": 4,
          "added_files": [
            "docs/posts/2026-10-29-did-four-european-stock-markets-get-more-volatile-together.md",
            "docs/reports/changepoint-eu-markets-2026-10-29.md",
            "prompts/runs/2026-10-29-session_01AcxTtJHsXUFk2HBEsvdppD.json",
            "ventures/changepoint-detector/data/cac-returns.csv",
            "ventures/changepoint-detector/data/ftse-returns.csv",
            "ventures/changepoint-detector/data/smi-returns.csv",
            "ventures/changepoint-detector/eu-markets.test.mjs",
            "ventures/changepoint-detector/eval/eu-markets.mjs",
            "ventures/changepoint-detector/eval/eu-markets.out.txt"
          ],
          "revert": false,
          "fix_forward": false
        }
      ]
    },
    {
      "name": "hearth-and-horizon",
      "merges": [
        {
          "sha": "6ad665baefc94c066688a25c4dbc74fe138d1aa0",
          "at": 1793232622000,
          "title": "hearth-and-horizon: Zita and the Bread in the Oven (Little Lamps, text only) + blog post",
          "pr": 11244,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "creative",
          "bullets": [
            "hearth-and-horizon: Zita and the Bread in the Oven (Little Lamps, text only) + blog post"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "hearth-and-horizon"
          },
          "files": 11,
          "lines_added": 311,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-zita-and-the-bread-in-the-oven-bedtime-story.md",
            "prompts/runs/2026-10-29-session_01AcxTtLdQKub1ZgAarEwkjn.json",
            "ventures/hearth-and-horizon/stories/zita-and-the-bread-in-the-oven.md",
            "ventures/hearth-and-horizon/zita-and-the-bread-in-the-oven.html"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "3cf1a43e1757f70b7345b0d00b915a47d68839f3",
          "at": 1793236177000,
          "title": "hearth-and-horizon: Boil It Once (nitrate and a boil-water notice, 2047, text only)",
          "pr": 11255,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "creative",
          "bullets": [
            "hearth-and-horizon: Boil It Once (nitrate and a boil-water notice, 2047, text only) + blog post; shorten a main post description over 160 chars",
            "creative run record"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "hearth-and-horizon"
          },
          "files": 12,
          "lines_added": 516,
          "lines_removed": 1,
          "added_files": [
            "docs/posts/2026-10-29-boil-it-once-nitrate-boil-water-notice-story.md",
            "prompts/runs/2026-10-29-session_01AcxTtJjQB2tDsEmikfjfmw.json",
            "ventures/hearth-and-horizon/boil-it-once.html",
            "ventures/hearth-and-horizon/stories/boil-it-once.md"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "1b4aadd728e9e1f73aaae40e60f8bcd8009db08c",
          "at": 1793236355000,
          "title": "hearth-and-horizon: The Warm Stack (hay self-heating, 2048, text only)",
          "pr": 11257,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "creative",
          "bullets": [
            "hearth-and-horizon: The Warm Stack (hay self-heating, 2048, text only) + blog post",
            "prompts: run record for The Warm Stack"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "hearth-and-horizon"
          },
          "files": 10,
          "lines_added": 467,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-the-warm-stack-hay-fire-story.md",
            "prompts/runs/2026-10-29-session_01E5sJKiXRgTFecLKajv4KvJ.json",
            "ventures/hearth-and-horizon/stories/the-warm-stack.md",
            "ventures/hearth-and-horizon/the-warm-stack.html"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "baee24dd99a2d2f65e59aa58129ce5419a509e33",
          "at": 1793258205000,
          "title": "hearth-and-horizon: Where the Pump Coughs (cistern story, text only)",
          "pr": 11344,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "creative",
          "bullets": [
            "hearth-and-horizon: Where the Pump Coughs (cistern story, text only), README, BIBLE, post"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "hearth-and-horizon"
          },
          "files": 11,
          "lines_added": 524,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-where-the-pump-coughs-a-cistern-story.md",
            "prompts/runs/2026-10-29-session_01AcxTtH8d8KntnuHLVgdMoJ.json",
            "ventures/hearth-and-horizon/stories/where-the-pump-coughs.md",
            "ventures/hearth-and-horizon/where-the-pump-coughs.html"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "ffa9a61df9d46716bed07b17f87d26f2e41a468b",
          "at": 1793261569000,
          "title": "hearth-and-horizon: The Candles Breathe (Easter Vigil CO2 story, text only)",
          "pr": 11354,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "creative",
          "bullets": [
            "hearth-and-horizon: The Candles Breathe (Easter Vigil CO2 story, text only)"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "hearth-and-horizon"
          },
          "files": 10,
          "lines_added": 417,
          "lines_removed": 0,
          "added_files": [
            "prompts/runs/2026-10-29-session_01AcxTtKf4GKSLKgofLzyCKK.json",
            "ventures/hearth-and-horizon/stories/the-candles-breathe.md",
            "ventures/hearth-and-horizon/the-candles-breathe.html"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "1bbeb59d4cfd305c8e2ca0028972a03052ce14a2",
          "at": 1793265009000,
          "title": "hearth-and-horizon: The Stack That Sweats (self-heating hay story, text only)",
          "pr": 11363,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "creative",
          "bullets": [
            "hearth-and-horizon: The Stack That Sweats (self-heating hay story, text only)",
            "prompts: run record for The Stack That Sweats"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "hearth-and-horizon"
          },
          "files": 11,
          "lines_added": 405,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-the-stack-that-sweats-a-hay-fire-story.md",
            "prompts/runs/2026-10-29-session_01AcxTtM11qrEPbSwe27FGpk.json",
            "ventures/hearth-and-horizon/stories/the-stack-that-sweats.md",
            "ventures/hearth-and-horizon/the-stack-that-sweats.html"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "a6c2e3ce7bca00a5b48c9375c4fe46ba4b7113b1",
          "at": 1793279561000,
          "title": "hearth-and-horizon: The Ring and the Bag (gift-mushroom poisoning story, text only)",
          "pr": 11402,
          "agent": "Claude",
          "models": [],
          "track": "creative",
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "hearth-and-horizon"
          },
          "files": 9,
          "lines_added": 354,
          "lines_removed": 0,
          "added_files": [
            "ventures/hearth-and-horizon/stories/the-ring-and-the-bag.md",
            "ventures/hearth-and-horizon/the-ring-and-the-bag.html"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "326af7f41ac4db5bc6dfefa8c5177671b7669158",
          "at": 1793286130000,
          "title": "hearth-and-horizon: The Warm Pack (swollen e-bike battery story, text only)",
          "pr": 11420,
          "agent": "Claude",
          "models": [],
          "track": "creative",
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "hearth-and-horizon"
          },
          "files": 9,
          "lines_added": 255,
          "lines_removed": 0,
          "added_files": [
            "ventures/hearth-and-horizon/stories/the-warm-pack.md",
            "ventures/hearth-and-horizon/the-warm-pack.html"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "9eb63f12ef398924da9c0c895106ef0e203235da",
          "at": 1793293968000,
          "title": "hearth-and-horizon: The Hall with the Doors Shut (wildfire smoke story, text only)",
          "pr": 11441,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "creative",
          "bullets": [
            "hearth-and-horizon: The Hall with the Doors Shut (wildfire smoke, box-fan filters, text only)"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "hearth-and-horizon"
          },
          "files": 10,
          "lines_added": 316,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-the-hall-with-the-doors-shut-smoke-story.md",
            "prompts/runs/2026-10-29-session_01AcxTtKufbQJ6VrrfU8M18w.json",
            "ventures/hearth-and-horizon/stories/the-hall-with-the-doors-shut.md",
            "ventures/hearth-and-horizon/the-hall-with-the-doors-shut.html"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "0c8795be6f6fb8e4f13d4dc4d2d5694df4f24541",
          "at": 1793301055000,
          "title": "hearth-and-horizon: The Detector in the Laundry (radon story, text only)",
          "pr": 11460,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "creative",
          "bullets": [
            "hearth-and-horizon: The Detector in the Laundry (radon in a granite undercroft, text only)"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "hearth-and-horizon"
          },
          "files": 10,
          "lines_added": 385,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-radon-in-a-granite-laundry.md",
            "prompts/runs/2026-10-29-session_01AcxTtJsGx16xW5PNEFRTNH.json",
            "ventures/hearth-and-horizon/stories/the-detector-in-the-laundry.md",
            "ventures/hearth-and-horizon/the-detector-in-the-laundry.html"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "6c847325d97df82e412c043944a133f25acc4d0e",
          "at": 1793301995000,
          "title": "hearth-and-horizon: The Slowest Chair on the Hill (lightning rule story, text only)",
          "pr": 11464,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "creative",
          "bullets": [
            "hearth-and-horizon: The Slowest Chair on the Hill (lightning rule story, text only)",
            "prompts: run record for creative 2026-10-29"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "hearth-and-horizon"
          },
          "files": 10,
          "lines_added": 475,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-the-slowest-chair-on-the-hill-a-lightning-story.md",
            "prompts/runs/2026-10-29-session_01E5sJKkBYedBoDqTRtftJY8.json",
            "ventures/hearth-and-horizon/stories/the-slowest-chair-on-the-hill.md",
            "ventures/hearth-and-horizon/the-slowest-chair-on-the-hill.html"
          ],
          "revert": false,
          "fix_forward": false
        }
      ]
    },
    {
      "name": "league-schedule-generator",
      "merges": [
        {
          "sha": "b0f1b6f2ada167d79bbbab7709b4305a7779e843",
          "at": 1793265743000,
          "title": "league-schedule-generator: officials for multi-division schedules",
          "pr": 11369,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "league-schedule-generator: officials for multi-division schedules, tests, post"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "league-schedule-generator"
          },
          "files": 5,
          "lines_added": 184,
          "lines_removed": 4,
          "added_files": [
            "docs/posts/2026-10-29-referees-across-divisions.md",
            "prompts/runs/2026-10-29-session_01E5sJKiSBg15Vw5aWzhDUD8.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "0f9537c73eb1a3ffbca50463ad7c65b72fd6bc56",
          "at": 1793268658000,
          "title": "league-schedule-generator: Google Calendar / Outlook import CSV",
          "pr": 11377,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "league-schedule-generator: Google Calendar / Outlook import CSV"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "league-schedule-generator"
          },
          "files": 6,
          "lines_added": 113,
          "lines_removed": 2,
          "added_files": [
            "docs/posts/2026-10-29-league-schedule-google-calendar-csv.md",
            "prompts/runs/2026-10-29-session_01AcxTtHZSs2ZRW5Wp4Czyx9.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "b41d04edda1ec8f494d12e4485bc3b681666554d",
          "at": 1793268706000,
          "title": "league-schedule-generator: calendar (.ics) export for multi-division schedules",
          "pr": 11378,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "league-schedule-generator: calendar (.ics) export for multi-division schedules, test, post"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "league-schedule-generator"
          },
          "files": 7,
          "lines_added": 122,
          "lines_removed": 6,
          "added_files": [
            "docs/posts/2026-10-29-calendar-files-for-multi-division-leagues.md",
            "prompts/runs/2026-10-29-session_01AcxTtKUMpzfhAkE9oJfan8.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "6f85706b93e97d9719d9cccd92460ced0c539d5d",
          "at": 1793271745000,
          "title": "polish: first-screen buttons on shift-roster-builder, league-schedule-generator, sales-agent",
          "pr": 11384,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "polish",
          "bullets": [
            "polish: first-screen buttons on shift-roster-builder, league-schedule-generator, sales-agent"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "league-schedule-generator"
          },
          "files": 6,
          "lines_added": 106,
          "lines_removed": 3,
          "added_files": [
            "docs/posts/2026-10-29-first-screen-buttons-on-three-tools.md",
            "docs/reports/polish-2026-10-29-flagship-cta-row.md",
            "prompts/runs/2026-10-29-session_01EhTJVP8YrHXPbRWCMjirNU.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "0a2a07f5557e0261184b315a4e8446ccb780c91b",
          "at": 1793275508000,
          "title": "league-schedule-generator: fix duplicate id 'start' (section renamed #make), main_health red",
          "pr": 11394,
          "agent": "Claude",
          "models": [],
          "track": "process",
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "league-schedule-generator"
          },
          "files": 1,
          "lines_added": 2,
          "lines_removed": 2,
          "added_files": [],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "63bdf9aaab4d6aabfbe0aa0ba029236ab6c328f8",
          "at": 1793297454000,
          "title": "league-schedule-generator: fuzz check of .ics and CSV exports (600 leagues, 0 faults)",
          "pr": 11453,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "league-schedule-generator: fuzz check of .ics and CSV exports (600 leagues, 0 faults)"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "league-schedule-generator"
          },
          "files": 5,
          "lines_added": 132,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-do-the-league-calendar-files-hold-up.md",
            "prompts/runs/2026-10-29-session_01AcxTtJ5oV9x6Fa7arbbVTs.json",
            "ventures/league-schedule-generator/eval/fuzz-exports.mjs"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "a18d42c51ad62ed7f0aa3eb36a28274135a1749d",
          "at": 1793304769000,
          "title": "league-schedule-generator: officials box on the multi-division page",
          "pr": 11471,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "league-schedule-generator: officials box on the multi-division page"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "league-schedule-generator"
          },
          "files": 7,
          "lines_added": 90,
          "lines_removed": 9,
          "added_files": [
            "docs/posts/2026-10-29-referees-for-every-division-on-one-page.md",
            "prompts/runs/2026-10-29-session_01AcxTtJnRztoaJzoZ5Ct79h.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "27e12631a360cb0c25d2e09b5e996da2a99db7a2",
          "at": 1793305431000,
          "title": "league-schedule-generator: per-team and per-official messages on the multi-division page",
          "pr": 11474,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "league-schedule-generator: per-team and per-official messages on the multi-division page",
            "ventures: run record"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "league-schedule-generator"
          },
          "files": 6,
          "lines_added": 191,
          "lines_removed": 3,
          "added_files": [
            "docs/posts/2026-10-29-league-schedule-messages-for-every-team-and-official.md",
            "prompts/runs/2026-10-29-session_01E5sJKnnsjaj61zosqmBNDC.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "1075141cc39c5d49e0b3c0109534bcdb75a08fc1",
          "at": 1793309030000,
          "title": "league-schedule-generator: mutation check of validateSchedule",
          "pr": 11484,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "league-schedule-generator: mutation check of validateSchedule (17 seeded faults, 0 missed)",
            "fix post description length on main"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "league-schedule-generator"
          },
          "files": 6,
          "lines_added": 231,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-does-the-schedule-checker-notice-a-planted-fault.md",
            "docs/reports/league-schedule-validator-mutation.md",
            "prompts/runs/2026-10-29-session_01E5sJKkHAzCrRCfVFRgCAhG.json",
            "ventures/league-schedule-generator/eval/mutate-validator.mjs"
          ],
          "revert": false,
          "fix_forward": false
        }
      ]
    },
    {
      "name": "photo-editing",
      "merges": [
        {
          "sha": "bb6c5299cabc976032b59f345718352b37393939",
          "at": 1793246280000,
          "title": "photo-editing: shootflow cull --picks scores the cull against a photographer's keepers",
          "pr": 11286,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "photo-editing: shootflow cull --picks scores the cull against a photographer's keepers"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "photo-editing"
          },
          "files": 7,
          "lines_added": 223,
          "lines_removed": 12,
          "added_files": [
            "docs/posts/2026-10-29-does-the-photo-cull-pick-what-you-would-pick.md",
            "prompts/runs/2026-10-29-session_01EhTJVM1i3AzjorW9fmsNbk.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "154e6ffb6901f5b7af0b5e84afe3842b8798c465",
          "at": 1793250028000,
          "title": "ShootFlow: OpenCV reference face detector for closed-eye culling",
          "pr": 11299,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "ShootFlow: OpenCV reference face detector for the closed-eye contract",
            "Flagship 7: record the OpenCV detector in next"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "photo-editing"
          },
          "files": 6,
          "lines_added": 172,
          "lines_removed": 5,
          "added_files": [
            "docs/posts/2026-10-29-shootflow-blink-detector-opencv.md",
            "prompts/runs/2026-10-29-session_01EhTJVNbtcnZHesRAL8tqX9.json",
            "ventures/photo-editing/tests/test_opencv_face_detector.py",
            "ventures/photo-editing/tools/opencv_face_detector.py"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "f56767691d8ea3a5b557855cc274b1490a60b584",
          "at": 1793257097000,
          "title": "photo-editing: marketing page and llms.txt cover shootflow cull; blog post",
          "pr": 11338,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": null,
          "bullets": [
            "photo-editing: marketing page and llms.txt cover shootflow cull; blog post",
            "post: shorten description"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "photo-editing"
          },
          "files": 3,
          "lines_added": 16,
          "lines_removed": 2,
          "added_files": [
            "docs/posts/2026-10-29-cull-a-shoot-offline-with-xmp-ratings.md"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "3bd2fb98d4b9094765da9c80ec35f65537f55fec",
          "at": 1793297431000,
          "title": "photo-editing: RAW review proxies from the embedded preview",
          "pr": 11450,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "photo-editing: RAW review proxies from the embedded preview",
            "post: shorten description",
            "Fix main's red checks: flagships wall-framing next over cap, cull.py mypy",
            "research: regenerate live-page links (red check on main)"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "photo-editing"
          },
          "files": 11,
          "lines_added": 137,
          "lines_removed": 32,
          "added_files": [
            "docs/posts/2026-10-29-shootflow-raw-review-proxies.md"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "04b3f45415ac2b5394655fa2c673af06a39728e4",
          "at": 1793314770000,
          "title": "photo-editing: shootflow cull --thumbs contact sheet in the report",
          "pr": 11496,
          "agent": "Claude",
          "models": [],
          "track": "ventures",
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "photo-editing"
          },
          "files": 6,
          "lines_added": 156,
          "lines_removed": 9,
          "added_files": [
            "docs/posts/2026-10-29-shootflow-cull-contact-sheet.md"
          ],
          "revert": false,
          "fix_forward": false
        }
      ]
    },
    {
      "name": "sales-agent",
      "merges": [
        {
          "sha": "baaaa4cb274ad85139c62ff82bb97d96dceac370",
          "at": 1793232721000,
          "title": "sales-agent: M8a CRM write-back (Pipedrive, HubSpot notes and opt-out)",
          "pr": 11243,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "sales-agent: M8a CRM write-back (Pipedrive, HubSpot notes and opt-out) + blog post",
            "sales-agent post description length; run record",
            "sales-agent post: shorter description",
            "sales-agent: Dockerfile copies self-host/crm.mjs"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "sales-agent"
          },
          "files": 9,
          "lines_added": 267,
          "lines_removed": 3,
          "added_files": [
            "docs/posts/2026-10-29-sales-agent-writes-replies-back-to-your-crm.md",
            "prompts/runs/2026-10-29-session_01AcxTtGEEC81SXYNPD7k5Xg.json",
            "ventures/sales-agent/self-host/crm.mjs"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "78f6429d9442a749d3d8e1136b73357c5c06a7b8",
          "at": 1793235509000,
          "title": "sales-agent: M8b person-clicked CRM stage move (Pipedrive, HubSpot)",
          "pr": 11250,
          "agent": "Claude",
          "models": [],
          "track": null,
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "sales-agent"
          },
          "files": 7,
          "lines_added": 132,
          "lines_removed": 11,
          "added_files": [
            "docs/posts/2026-10-29-sales-agent-moves-the-deal-only-when-you-click.md"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "7f4fdb1889ef582a15eb26adb464eb5a1a539048",
          "at": 1793239875000,
          "title": "redteam: share.mjs 2026-10-29; fix sales-agent dead mirror link that broke the front-door build",
          "pr": 11265,
          "agent": "Claude",
          "models": [],
          "track": "redteam",
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "sales-agent"
          },
          "files": 3,
          "lines_added": 184,
          "lines_removed": 1,
          "added_files": [
            "prompts/runs/2026-10-29-session_01AcxTtHcG2iLPxCwScjXpvi.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "ee58397b9ba506556efddd4a5735dca839d07573",
          "at": 1793302214000,
          "title": "polish: sales-agent guide page; fix seo_title that broke the build",
          "pr": 11465,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "polish",
          "bullets": [
            "polish: guide page for sales-agent; fix over-long Ohio seo_title that broke the build"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "sales-agent"
          },
          "files": 7,
          "lines_added": 148,
          "lines_removed": 1,
          "added_files": [
            "docs/posts/2026-10-29-replies-to-cold-outreach-guide.md",
            "docs/reports/polish-2026-10-29-sales-agent-guide.md",
            "prompts/runs/2026-10-29-session_01E5sJKju7gtsRLowNVJLNw6.json",
            "ventures/sales-agent/how-to-handle-replies-to-cold-outreach.html"
          ],
          "revert": false,
          "fix_forward": false
        }
      ]
    },
    {
      "name": "several products at once",
      "merges": [
        {
          "sha": "d8945dd55ef320e1465db09e6de8d21ff44c013c",
          "at": 1793294473000,
          "title": "explore: autocomplete=email on four email inputs (sweep of 1,328 pages)",
          "pr": 11444,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "explore",
          "bullets": [
            "ventures: autocomplete=email on four email inputs; post on the sweep",
            "prompts: run record for explore sweep",
            "posts: trim two descriptions to 160 characters",
            "posts: shorten sweep description"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "several products at once"
          },
          "files": 8,
          "lines_added": 59,
          "lines_removed": 6,
          "added_files": [
            "docs/posts/2026-10-29-email-fields-that-autofill.md",
            "prompts/runs/2026-10-29-session_01E5sJKmftFtZYR77j138vCz.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "01284e8826f87a53b1273822cb146e0abd6b67d7",
          "at": 1793294605000,
          "title": "Link 22 orphaned product pages; add orphan-page check",
          "pr": 11446,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "explore",
          "bullets": [
            "Link 22 orphaned product pages from their indexes; add check_orphan_pages.py",
            "Post front matter"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "several products at once"
          },
          "files": 15,
          "lines_added": 175,
          "lines_removed": 1,
          "added_files": [
            "docs/posts/2026-10-29-22-pages-nobody-linked-to.md",
            "platform/ci/check_orphan_pages.py",
            "prompts/runs/2026-10-29-session_01E5sJKn7bKzjyyrh8hBDKyn.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "1be6eabba5293498c754aba70eb3e774d8ed92b3",
          "at": 1793305996000,
          "title": "redteam: invalid.mjs + terms.mjs 2026-10-29",
          "pr": 11468,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "redteam",
          "bullets": [
            "redteam: invalid.mjs + terms.mjs 2026-10-29 (run browser script under test; fix row-scope abbreviation match)",
            "redteam: record PR number",
            "redteam: sync the vendored proposal-terms tests into the 60 ventures",
            "einvoice-preflight: clip the Israel page title to the 130-character limit (broke the pages build on main)",
            "docs: shorten a post seo_title that broke the pages build on main"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "several products at once"
          },
          "files": 67,
          "lines_added": 871,
          "lines_removed": 4,
          "added_files": [
            "docs/posts/2026-10-29-the-error-message-script-nobody-ran.md",
            "prompts/runs/2026-10-29-session_01EhTJVPcFDwYue7NTHHNbMW.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "86e0f2b6e22383cd21200c8024d9ef02d11ef5bb",
          "at": 1793307554000,
          "title": "polish: first-screen buttons on four flagship tool pages",
          "pr": 11478,
          "agent": "Claude",
          "models": [],
          "track": "polish",
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "several products at once"
          },
          "files": 6,
          "lines_added": 55,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-flagship-tools-now-open-on-a-button.md",
            "docs/reports/polish-2026-10-29-flagship-cta.md"
          ],
          "revert": false,
          "fix_forward": false
        }
      ]
    },
    {
      "name": "shift-roster-builder",
      "merges": [
        {
          "sha": "cdf181dfc1ad82aecd378bdc86e3d47793b53bb5",
          "at": 1793253738000,
          "title": "shift-roster-builder: fairness bench with narrow availability, README measurement, post",
          "pr": 11323,
          "agent": "Claude",
          "models": [],
          "track": "ventures",
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "shift-roster-builder"
          },
          "files": 3,
          "lines_added": 19,
          "lines_removed": 4,
          "added_files": [
            "docs/posts/2026-10-29-when-only-a-few-can-close-fairness-has-limits.md"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "e1dcede17e7f7a2fa5687e99bef9b7d9413cc2f9",
          "at": 1793300898000,
          "title": "shift-roster-builder: optional Slack/Discord/ntfy webhook alerts for the self-hosted hub",
          "pr": 11459,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "shift-roster-builder: optional Slack/Discord/ntfy webhook alerts for the self-hosted hub"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "shift-roster-builder"
          },
          "files": 7,
          "lines_added": 143,
          "lines_removed": 2,
          "added_files": [
            "docs/posts/2026-10-29-roster-hub-alerts-to-your-own-slack.md",
            "prompts/runs/2026-10-29-session_01EhTJVM76yeZrEyHRYqDv87.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "347a5997a1a087be99f5faabfba7d8fd640c9fdd",
          "at": 1793314804000,
          "title": "shift-roster-builder: guide + bench on rebuilding vs changing one shift after a call-out",
          "pr": 11497,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "shift-roster-builder: guide + bench on rebuilding vs changing one shift after a call-out"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "shift-roster-builder"
          },
          "files": 9,
          "lines_added": 179,
          "lines_removed": 3,
          "added_files": [
            "docs/posts/2026-10-29-rebuild-the-week-or-change-one-shift.md",
            "prompts/runs/2026-10-29-session_01EhTJVNihtUHNbYBbrDEiLD.json",
            "ventures/shift-roster-builder/eval/callout-churn-bench.mjs",
            "ventures/shift-roster-builder/schedule-change-after-posting.html"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "64e380eba01c8f8c2a0d2ea83283eefacdc9c317",
          "at": 1793314973000,
          "title": "shift-roster-builder: one-click 'Give to' cover for call-outs on the manager page",
          "pr": 11498,
          "agent": "Claude",
          "models": [],
          "track": null,
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "shift-roster-builder"
          },
          "files": 4,
          "lines_added": 56,
          "lines_removed": 3,
          "added_files": [
            "docs/posts/2026-10-29-shift-roster-builder-one-click-cover.md"
          ],
          "revert": false,
          "fix_forward": false
        }
      ]
    },
    {
      "name": "einvoice-preflight",
      "merges": [
        {
          "sha": "70c06a27bbcef76011595e3c095dfaf7387c40fd",
          "at": 1793290310000,
          "title": "einvoice-preflight: Israel allocation-number page with ID check digit test",
          "pr": 11429,
          "agent": "Claude",
          "models": [],
          "track": null,
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "einvoice-preflight"
          },
          "files": 11,
          "lines_added": 207,
          "lines_removed": 3,
          "added_files": [
            "docs/posts/2026-10-29-israel-invoices-above-5000-shekels-need-an-allocation-number.md",
            "ventures/einvoice-preflight/israel-allocation-number-e-invoice-mandate.html",
            "ventures/einvoice-preflight/israel-allocation-number-e-invoice-mandate.test.mjs",
            "ventures/einvoice-preflight/israel.mjs",
            "ventures/einvoice-preflight/israel.test.mjs"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "38cf024da3ebf91fa783ede5af65123c84a394dc",
          "at": 1793307529000,
          "title": "einvoice-preflight: South Korea e-invoicing page with business number check digit test",
          "pr": 11477,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "process",
          "bullets": [
            "einvoice-preflight: South Korea e-invoicing page with business number check digit test"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "einvoice-preflight"
          },
          "files": 11,
          "lines_added": 246,
          "lines_removed": 2,
          "added_files": [
            "docs/posts/2026-10-29-south-korea-electronic-tax-invoice.md",
            "prompts/runs/2026-10-29-session_01EhTJVMwnuwUmkY328Sh4n5.json",
            "ventures/einvoice-preflight/korea.mjs",
            "ventures/einvoice-preflight/korea.test.mjs",
            "ventures/einvoice-preflight/south-korea-e-invoice-mandate.html",
            "ventures/einvoice-preflight/south-korea-e-invoice-mandate.test.mjs"
          ],
          "revert": false,
          "fix_forward": false
        }
      ]
    },
    {
      "name": "saints-by-candlelight",
      "merges": [
        {
          "sha": "650321264621682fc23cb7e9ecd8410909d14ca7",
          "at": 1793244087000,
          "title": "saints-by-candlelight: Paul and the Fourteen Nights Before Malta (episode 53, text only) + blog post",
          "pr": 11279,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "creative",
          "bullets": [
            "saints-by-candlelight: Paul and the Fourteen Nights Before Malta (episode 53, text only) + blog post",
            "prompts: run record for episode 53"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "saints-by-candlelight"
          },
          "files": 7,
          "lines_added": 466,
          "lines_removed": 2,
          "added_files": [
            "docs/posts/2026-10-29-paul-shipwreck-malta-bedtime-story.md",
            "prompts/runs/2026-10-29-session_01E5sJKixr9UjZyV7Gecz7yG.json",
            "ventures/saints-by-candlelight/episodes/053-paul-and-the-fourteen-nights-before-malta.md",
            "ventures/saints-by-candlelight/paul-and-the-fourteen-nights-before-malta.html"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "fd495a088a1af78f6cf715a27bc8677eb9758aa8",
          "at": 1793265328000,
          "title": "saints-by-candlelight: Monica and the Window at Ostia (episode 54, text only)",
          "pr": 11366,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "creative",
          "bullets": [
            "saints-by-candlelight: Monica and the Window at Ostia (episode 54, text only)"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "saints-by-candlelight"
          },
          "files": 7,
          "lines_added": 489,
          "lines_removed": 2,
          "added_files": [
            "docs/posts/2026-10-29-monica-and-the-window-at-ostia-saints-by-candlelight.md",
            "prompts/runs/2026-10-29-session_01AcxTtHSLjRPpBHq63ryxLk.json",
            "ventures/saints-by-candlelight/episodes/054-monica-and-the-window-at-ostia.md",
            "ventures/saints-by-candlelight/monica-and-the-window-at-ostia.html"
          ],
          "revert": false,
          "fix_forward": false
        }
      ]
    },
    {
      "name": "child-tax-credit-calculator",
      "merges": [
        {
          "sha": "b80e10d7d8ae99e3b1da48b1f208d0aa247d6908",
          "at": 1793300355000,
          "title": "redteam: child-tax-credit-calculator 2026-10-29",
          "pr": 11457,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "redteam",
          "bullets": [
            "redteam: child-tax-credit-calculator 2026-10-29",
            "redteam: record PR link",
            "blog: shorten description"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "child-tax-credit-calculator"
          },
          "files": 3,
          "lines_added": 273,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-seeding-bugs-in-the-child-tax-credit-calculator.md",
            "prompts/runs/2026-10-29-session_01EhTJVPef67bKgbARjQ54Kr.json"
          ],
          "revert": false,
          "fix_forward": false
        }
      ]
    },
    {
      "name": "client-concentration-risk-analyzer",
      "merges": [
        {
          "sha": "b1bac7685a0dbfa5b2d21dc2a0d159c746651949",
          "at": 1793284046000,
          "title": "redteam: client-concentration-risk-analyzer cli 2026-10-29",
          "pr": 11416,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "redteam",
          "bullets": [
            "redteam: client-concentration-risk-analyzer cli 2026-10-29",
            "redteam record: PR 11416"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "client-concentration-risk-analyzer"
          },
          "files": 2,
          "lines_added": 177,
          "lines_removed": 1,
          "added_files": [
            "prompts/runs/2026-10-29-session_01EhTJVLEg7Ph4W3vN1YkHvY.json"
          ],
          "revert": false,
          "fix_forward": false
        }
      ]
    },
    {
      "name": "dupehound",
      "merges": [
        {
          "sha": "d1171948fc89fba1d51bdaa7d92b67c1faa8429a",
          "at": 1793250055000,
          "title": "dupehound: --normalize mode finds renamed copies",
          "pr": 11300,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "dupehound: --normalize mode finds renamed copies (CLI, WebAssembly, page)",
            "Shorten post description"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "dupehound"
          },
          "files": 13,
          "lines_added": 365,
          "lines_removed": 23,
          "added_files": [
            "docs/posts/2026-10-29-dupehound-finds-renamed-copies.md",
            "prompts/runs/2026-10-29-session_01EhTJVPX1D2LaQbLzXhWD1g.json"
          ],
          "revert": false,
          "fix_forward": false
        }
      ]
    },
    {
      "name": "ebay-fee-calculator",
      "merges": [
        {
          "sha": "a00a2f123d2197f5c25a773ccd1a12f0cf3bd6c0",
          "at": 1793300363000,
          "title": "ventures: llms.txt for ebay, etsy and shopify fee calculators, with worked examples",
          "pr": 11458,
          "agent": "Claude",
          "models": [],
          "track": "research",
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "ebay-fee-calculator"
          },
          "files": 4,
          "lines_added": 98,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-three-seller-fee-calculators-now-answer-assistants.md",
            "ventures/ebay-fee-calculator/llms.txt",
            "ventures/etsy-profit-calculator/llms.txt",
            "ventures/shopify-fee-calculator/llms.txt"
          ],
          "revert": false,
          "fix_forward": false
        }
      ]
    },
    {
      "name": "etsy-profit-calculator",
      "merges": [
        {
          "sha": "3ce7789e0000c3f08ae29151b9f1a1b38b58139e",
          "at": 1793240089000,
          "title": "redteam: wash-sale-checker + etsy-profit-calculator 2026-10-29",
          "pr": 11267,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "redteam",
          "bullets": [
            "redteam: boundary guards for wash-sale-checker and etsy-profit-calculator; shorten salon post description",
            "redteam: run record"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "etsy-profit-calculator"
          },
          "files": 4,
          "lines_added": 350,
          "lines_removed": 1,
          "added_files": [
            "prompts/runs/2026-10-29-session_01AcxTtH7RhB1U4oDFMHh38z.json"
          ],
          "revert": false,
          "fix_forward": false
        }
      ]
    },
    {
      "name": "open-tennis-robots",
      "merges": [
        {
          "sha": "feac6cf4a9309fa305a8867d73405932a29928a7",
          "at": 1793272305000,
          "title": "open-tennis-robots: launch checks tie feeder CAD to the flight model",
          "pr": 11386,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "ventures",
          "bullets": [
            "open-tennis-robots: launch checks tie feeder CAD to the flight model (rpm, nip push)"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "open-tennis-robots"
          },
          "files": 5,
          "lines_added": 137,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-tennis-feeder-nip-needs-241-newtons.md",
            "prompts/runs/2026-10-29-session_01AcxTtHo69z6iSet1artCdf.json"
          ],
          "revert": false,
          "fix_forward": false
        }
      ]
    },
    {
      "name": "seller-net-sheet",
      "merges": [
        {
          "sha": "090a9deb5de34a909159c40681b9ccc80f66b527",
          "at": 1793236763000,
          "title": "redteam: seller-net-sheet transfer-tax 2026-10-29",
          "pr": 11258,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "redteam",
          "bullets": [
            "redteam: seller-net-sheet transfer-tax 2026-10-29",
            "redteam: record PR number"
          ],
          "detail": null,
          "area": {
            "kind": "product",
            "name": "seller-net-sheet"
          },
          "files": 2,
          "lines_added": 181,
          "lines_removed": 0,
          "added_files": [
            "prompts/runs/2026-10-29-session_01E5sJKnUaQ7ZNY99YPnGts9.json"
          ],
          "revert": false,
          "fix_forward": false
        }
      ]
    },
    {
      "name": "sep-ira-vs-solo-401k-calculator",
      "merges": [
        {
          "sha": "fd04a33324bb0f55a31e859d077245753d839fc0",
          "at": 1793265446000,
          "title": "redteam: sep-ira-vs-solo-401k-calculator 2026-10-29",
          "pr": 11367,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "redteam",
          "bullets": [
            "redteam: sep-ira-vs-solo-401k-calculator 2026-10-29",
            "redteam: record PR number"
          ],
          "detail": "Catch rate 37.5% -> 87.5%; four boundary/default tests added.",
          "area": {
            "kind": "product",
            "name": "sep-ira-vs-solo-401k-calculator"
          },
          "files": 2,
          "lines_added": 197,
          "lines_removed": 0,
          "added_files": [
            "prompts/runs/2026-10-29-session_01E5sJKnjkwscGyuj1X6S5oA.json"
          ],
          "revert": false,
          "fix_forward": false
        }
      ]
    }
  ],
  "research": [
    {
      "name": "heavy-hydraulics",
      "merges": [
        {
          "sha": "235a07d9ed5c1c78d005615ebd098f7cf095f60b",
          "at": 1793246978000,
          "title": "research/heavy-hydraulics: 2e, model load shape vs a measured excavator power trace",
          "pr": 11292,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/heavy-hydraulics: milestone 2e, load shape of the force-model cycle against a measured excavator power trace + blog post"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "heavy-hydraulics"
          },
          "files": 8,
          "lines_added": 18804,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-excavator-load-shape-vs-our-model.md",
            "prompts/runs/2026-10-29-session_01AcxTtHk6Ksxs1CdhLuQSJC.json",
            "research/heavy-hydraulics/experiments/data/Digging_profile.csv",
            "research/heavy-hydraulics/experiments/data/ElectricExcavator_profile.csv",
            "research/heavy-hydraulics/experiments/trace_shape.py",
            "research/heavy-hydraulics/experiments/trace_shape_results.txt"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "d222a59f87015c8f20636aec8ef5f851a95ccb27",
          "at": 1793247115000,
          "title": "research/heavy-hydraulics: milestone 2f, idle time decides load-sensing vs open-centre",
          "pr": 11294,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/heavy-hydraulics: milestone 2f, idle-time sensitivity of load-sensing vs open-centre"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "heavy-hydraulics"
          },
          "files": 7,
          "lines_added": 210,
          "lines_removed": 1,
          "added_files": [
            "docs/posts/2026-10-29-idle-time-decides-load-sensing-vs-open-centre.md",
            "prompts/runs/2026-10-29-session_01E5sJKiacRjek4KyEQLz3hL.json",
            "research/heavy-hydraulics/experiments/idle_sensitivity.py",
            "research/heavy-hydraulics/experiments/idle_sensitivity_results.txt"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "38ce82d53a76cc27226db6474598009eda802955",
          "at": 1793250928000,
          "title": "research/heavy-hydraulics: milestone 2g, idle-time ranking vs open-centre neutral pressure",
          "pr": 11304,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/heavy-hydraulics: milestone 2g, idle-time ranking depends on open-centre neutral pressure",
            "post: shorten description",
            "flagships: trim wall-framing-takeoff next: under the 2000-char cap (history lives in its README)"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "heavy-hydraulics"
          },
          "files": 7,
          "lines_added": 196,
          "lines_removed": 2,
          "added_files": [
            "docs/posts/2026-10-29-does-an-excavators-idle-time-decide-its-hydraulic-circuit.md",
            "prompts/runs/2026-10-29-session_01AcxTtKQasbEnnAMo43MRCG.json",
            "research/heavy-hydraulics/experiments/idle_models.py",
            "research/heavy-hydraulics/experiments/idle_models_results.txt"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "525cf3e0d2d43f257c7b1f1d33cd8099ec94a491",
          "at": 1793254851000,
          "title": "research/heavy-hydraulics: 2h break-even neutral pressure for LS vs OC idle",
          "pr": 11329,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/heavy-hydraulics: 2h break-even neutral pressure for LS vs OC idle"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "heavy-hydraulics"
          },
          "files": 4,
          "lines_added": 112,
          "lines_removed": 0,
          "added_files": [
            "prompts/runs/2026-10-29-session_01E5sJKmtEAYsFp8AB2SXoHq.json",
            "research/heavy-hydraulics/experiments/idle_breakeven.py",
            "research/heavy-hydraulics/experiments/idle_breakeven_results.txt"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "730c01934e9e49b66894f9af73af2481c7ca6ca4",
          "at": 1793283937000,
          "title": "research/heavy-hydraulics: milestone 4 first pass, parts cost and payback (H5)",
          "pr": 11415,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/heavy-hydraulics: milestone 4 first pass, parts cost and payback (H5 refuted on the grid)"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "heavy-hydraulics"
          },
          "files": 7,
          "lines_added": 247,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-does-a-load-sensing-hydraulic-pump-pay-for-itself.md",
            "docs/reports/heavy-hydraulics-milestone-4.md",
            "prompts/runs/2026-10-29-session_01AcxTtJ4gXK8u4QWihgh6WT.json",
            "research/heavy-hydraulics/experiments/payback.py",
            "research/heavy-hydraulics/experiments/payback_results.txt"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "50a4007ada48feecab6f3e197c8b8b1ac0c9f297",
          "at": 1793284622000,
          "title": "research/heavy-hydraulics: milestone 5a, boom-lowering energy recovery bound",
          "pr": 11418,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/heavy-hydraulics: milestone 5a, boom-lowering energy recovery bound"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "heavy-hydraulics"
          },
          "files": 6,
          "lines_added": 196,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-how-much-can-an-excavator-boom-give-back.md",
            "prompts/runs/2026-10-29-session_01AcxTldMPLjZPaANMK86y.json",
            "research/heavy-hydraulics/experiments/regen_bound.py",
            "research/heavy-hydraulics/experiments/regen_bound_results.txt"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "04054c87fe3ac4dce4a7505abb8ad91f805cf383",
          "at": 1793286969000,
          "title": "research/heavy-hydraulics: milestone 5b, regen cap check",
          "pr": 11423,
          "agent": "Claude",
          "models": [],
          "track": "research",
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "heavy-hydraulics"
          },
          "files": 3,
          "lines_added": 36,
          "lines_removed": 0,
          "added_files": [
            "research/heavy-hydraulics/experiments/regen_uncapped.py",
            "research/heavy-hydraulics/experiments/regen_uncapped_results.txt"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "825a297ae14ac3d10affa0406b9af333068430a9",
          "at": 1793287987000,
          "title": "research/heavy-hydraulics: milestone 6, first paper draft and post",
          "pr": 11425,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/heavy-hydraulics: milestone 6, first paper draft and post",
            "prompts: run record and post description fix for heavy-hydraulics draft",
            "prompts: fill run record"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "heavy-hydraulics"
          },
          "files": 4,
          "lines_added": 136,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-does-load-sensing-pay-on-a-small-excavator.md",
            "prompts/runs/2026-10-29-session_01AcxTtKjuDvuf42SanoDhcw.json",
            "research/heavy-hydraulics/paper/draft.md"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "5c336a4055e233fdd705d8a630dab3b542d0d1a9",
          "at": 1793311737000,
          "title": "research/heavy-hydraulics: paper figure and number check",
          "pr": 11490,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "heavy-hydraulics: paper figure (ranking vs load factor) and draft number check; post"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "heavy-hydraulics"
          },
          "files": 7,
          "lines_added": 278,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-does-load-sensing-win-it-depends-on-one-number.md",
            "prompts/runs/2026-10-29-session_01AcxTtJDgWJrRMwN2m5yP9a.json",
            "research/heavy-hydraulics/experiments/figure.py",
            "research/heavy-hydraulics/experiments/ranking_vs_load_factor.svg",
            "research/heavy-hydraulics/paper/check_numbers.py"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "a9371f49472a379a65ef723858e567ed1903f4ae",
          "at": 1793311925000,
          "title": "research/heavy-hydraulics: milestone 2i, sourced neutral pressure reverses idle ranking",
          "pr": 11491,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/heavy-hydraulics: milestone 2i, sourced neutral pressure reverses the idle ranking",
            "research/heavy-hydraulics: shorten post description; run record"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "heavy-hydraulics"
          },
          "files": 7,
          "lines_added": 150,
          "lines_removed": 1,
          "added_files": [
            "docs/posts/2026-10-29-sourced-neutral-pressure-flips-load-sensing-ranking.md",
            "prompts/runs/2026-10-29-session_01AcxTtKNy8jrZaxyxxXW31i.json",
            "research/heavy-hydraulics/experiments/neutral_sourced.py",
            "research/heavy-hydraulics/experiments/neutral_sourced_results.txt"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "f47c067b0309103fae51ffcfa44a289d921f22a1",
          "at": 1793315407000,
          "title": "research/heavy-hydraulics: milestone 2j, sourced LS margin flips the idle ranking",
          "pr": 11500,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/heavy-hydraulics: milestone 2j, sourced LS margin flips the idle ranking back",
            "Fill run record"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "heavy-hydraulics"
          },
          "files": 7,
          "lines_added": 118,
          "lines_removed": 3,
          "added_files": [
            "docs/posts/2026-10-29-load-sensing-margin-flips-excavator-ranking.md",
            "prompts/runs/2026-10-29-session_01AcxTtJGzBvUwBzYcVaT8pF.json",
            "research/heavy-hydraulics/experiments/dpls_sourced.py",
            "research/heavy-hydraulics/experiments/dpls_sourced_results.txt"
          ],
          "revert": false,
          "fix_forward": false
        }
      ]
    },
    {
      "name": "marine-hull",
      "merges": [
        {
          "sha": "89b33c832f410b34b22e9f62012ff0ffdc5bce82",
          "at": 1793233183000,
          "title": "research/marine-hull: milestone 5i, held-out test of the solar surge rule",
          "pr": 11246,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/marine-hull: milestone 5i, held-out test of the solar surge rule",
            "prompts: run record for marine-hull 5i"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "marine-hull"
          },
          "files": 6,
          "lines_added": 248,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-solar-boat-surge-rule-mostly-a-speed-choice.md",
            "prompts/runs/2026-10-29-session_01E5sJKianqaRUFbQE5QR98s.json",
            "research/marine-hull/experiments/results_solar_surge_holdout.txt",
            "research/marine-hull/experiments/run_solar_surge_holdout.py"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "67db8394689b85e453d9df350e922fbfb76aea9d",
          "at": 1793262098000,
          "title": "research/marine-hull: 5j hull-constant uncertainty on best solar cruise speed",
          "pr": 11357,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/marine-hull: milestone 5j, hull-constant uncertainty on the best solar cruise speed"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "marine-hull"
          },
          "files": 6,
          "lines_added": 230,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-how-fast-should-a-solar-boat-cruise-hull-uncertainty.md",
            "prompts/runs/2026-10-29-session_01E5sJKjNsGRBbutWRPajmC6.json",
            "research/marine-hull/experiments/results_solar_hull_uncertainty.txt",
            "research/marine-hull/experiments/run_solar_hull_uncertainty.py"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "43b2a2d04a8b6eeee187f649d519b85819c4a5ab",
          "at": 1793272604000,
          "title": "research/marine-hull: 5k sensitivity of solar boat range to six inputs",
          "pr": 11387,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/marine-hull: 5k sensitivity of solar boat range to six inputs"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "marine-hull"
          },
          "files": 6,
          "lines_added": 210,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-what-moves-a-solar-boats-range-most.md",
            "prompts/runs/2026-10-29-session_01AcxTtLZPyaSv86Z1mmkz43.json",
            "research/marine-hull/experiments/results_solar_sensitivity.txt",
            "research/marine-hull/experiments/run_solar_sensitivity.py"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "cec3d7399755c1075b57dc5436d6839ab82fa3f0",
          "at": 1793277121000,
          "title": "research/marine-hull: 5l sourced hotel load and panel efficiency",
          "pr": 11398,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/marine-hull: 5l hotel load and panel efficiency from published figures"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "marine-hull"
          },
          "files": 5,
          "lines_added": 228,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-solar-boat-range-with-published-power-figures.md",
            "prompts/runs/2026-10-29-session_01E5sJKieBEX1oAbxuuUKzuZ.json",
            "research/marine-hull/experiments/results_solar_sourced.txt",
            "research/marine-hull/experiments/run_solar_sourced.py"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "bb0ccaf2b31dd87048c3c19536607c4767e8f4e6",
          "at": 1793284604000,
          "title": "research/marine-hull: 5m joint interval on deck-solar km/day",
          "pr": 11419,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/marine-hull: 5m joint interval on deck-solar km/day"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "marine-hull"
          },
          "files": 6,
          "lines_added": 156,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-how-far-does-a-solar-boat-go-per-day.md",
            "prompts/runs/2026-10-29-session_01E5sJKnZ7zpHpMu5DriStuU.json",
            "research/marine-hull/experiments/results_solar_mc.txt",
            "research/marine-hull/experiments/run_solar_mc.py"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "7347b89c504138e6c22957d1e1415ca3ecfab619",
          "at": 1793286815000,
          "title": "research/marine-hull: milestone 7a paper skeleton from logged results",
          "pr": 11422,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/marine-hull: milestone 7a paper skeleton from logged results",
            "fix post description length, add run record",
            "fix post description length, fill run record"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "marine-hull"
          },
          "files": 4,
          "lines_added": 116,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-small-survey-boat-hull-ranking-robust-range-not.md",
            "prompts/runs/2026-10-29-session_01AcxTtLUiS16ZfcNDG7C1CV.json",
            "research/marine-hull/paper/DRAFT.md"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "d89baa3524135d57046d9c5426325ec545126c79",
          "at": 1793308207000,
          "title": "research/marine-hull: milestone 6a, sea-state resistance multiplier sweep",
          "pr": 11480,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/marine-hull: milestone 6a, sea-state resistance multiplier sweep"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "marine-hull"
          },
          "files": 6,
          "lines_added": 217,
          "lines_removed": 1,
          "added_files": [
            "docs/posts/2026-10-29-rough-water-solar-boat-speed.md",
            "prompts/runs/2026-10-29-session_01AcxTtJq9SwVy5XRAvHgEe1.json",
            "research/marine-hull/experiments/results_solar_seastate.txt",
            "research/marine-hull/experiments/run_solar_seastate.py"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "c9cdeb8940aa1b6387a84465e42bfbf6c4c4ed9f",
          "at": 1793308363000,
          "title": "research/marine-hull: milestone 6b, speed policy under intermittent rough days",
          "pr": 11482,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/marine-hull: milestone 6b, speed policy under intermittent rough days",
            "prompts: run record for marine-hull 6b"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "marine-hull"
          },
          "files": 5,
          "lines_added": 183,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-slow-down-on-rough-days-solar-boat.md",
            "prompts/runs/2026-10-29-session_01AcxTtJRUvC2hAzUWoNWpkd.json",
            "research/marine-hull/experiments/results_solar_seastate_policy.txt",
            "research/marine-hull/experiments/run_solar_seastate_policy.py"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "a1cafa173163d47e9706acd8349980bd2ab67b40",
          "at": 1793316063000,
          "title": "research/marine-hull: milestone 6c, back-off policy under rough spells",
          "pr": 11502,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/marine-hull: milestone 6c, back-off policy under persistent rough spells and a small pack",
            "research/marine-hull: run record and post description fix",
            "prompts: run record for marine-hull 6c"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "marine-hull"
          },
          "files": 6,
          "lines_added": 241,
          "lines_removed": 1,
          "added_files": [
            "docs/posts/2026-10-29-rough-weeks-solar-boat-back-off.md",
            "prompts/runs/2026-10-29-session_01E5sJKjhfc6QtEU1rM3Z8Dd.json",
            "research/marine-hull/experiments/results_solar_seastate_spells.txt",
            "research/marine-hull/experiments/run_solar_seastate_spells.py"
          ],
          "revert": false,
          "fix_forward": false
        }
      ]
    },
    {
      "name": "lowcomm-training",
      "merges": [
        {
          "sha": "7c12870af1139735f9d7576391ac8026ff817ff9",
          "at": 1793239709000,
          "title": "research/lowcomm-training: 7b machine-checked citations + related work",
          "pr": 11263,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/lowcomm-training: 7b machine-checked citations, related work for the breakdown section"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "lowcomm-training"
          },
          "files": 4,
          "lines_added": 62,
          "lines_removed": 8,
          "added_files": [
            "prompts/runs/2026-10-29-session_01AcxTtK281iXTec3TKw2FrD.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "d576441c0249d231f156d8cd46c1d77901237320",
          "at": 1793248604000,
          "title": "research/lowcomm-training: 6a rand-k x H composition pilot (H6)",
          "pr": 11289,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/lowcomm-training: 6a plan, rand-k x H composition pilot (hypothesis before run)",
            "research/lowcomm-training: 6a runs in progress (partial jsonl)",
            "research/lowcomm-training: 6a partial results",
            "research/lowcomm-training: 6a partial results (8 of 12)",
            "research/lowcomm-training: 6a result, H6a-i refuted (rand-k x H cross term); run record"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "lowcomm-training"
          },
          "files": 6,
          "lines_added": 185,
          "lines_removed": 0,
          "added_files": [
            "prompts/runs/2026-10-29-session_01AcxTtGJ9q987LTDHP3N6jK.json",
            "research/lowcomm-training/experiments/gpt_composition/composition.jsonl",
            "research/lowcomm-training/experiments/gpt_composition/composition.py",
            "research/lowcomm-training/experiments/gpt_composition/composition_results.txt",
            "research/lowcomm-training/experiments/gpt_composition/run.out"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "049380c2abeadb805c2e635845a70c96097651a3",
          "at": 1793255880000,
          "title": "research/lowcomm-training: 6b held-out H test of a product composition rule",
          "pr": 11325,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/lowcomm-training: 6b plan, held-out H test of a product composition rule",
            "research/lowcomm-training: 6b report for held-out H",
            "research/lowcomm-training: 6b run log placeholder",
            "research/lowcomm-training: 6b outcome, separable rule predicts held-out H; post and run record",
            "docs: shorten post description"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "lowcomm-training"
          },
          "files": 7,
          "lines_added": 210,
          "lines_removed": 3,
          "added_files": [
            "docs/posts/2026-10-29-does-compression-cost-depend-on-sync-interval.md",
            "prompts/runs/2026-10-29-session_01AcxTtKPMTGVQoPxPsYQKeN.json",
            "research/lowcomm-training/experiments/gpt_composition/run8_32.out"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "f62bf1b3de8d750a1c1c15c5feba0484f813a0f9",
          "at": 1793285841000,
          "title": "research/lowcomm-training: milestone 6c, f(p) vs compressor variance omega",
          "pr": 11414,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/lowcomm-training: milestone 6c plan (f(p) vs omega) and run_p mode",
            "research/lowcomm-training: 6c report_p and partial run rows",
            "research/lowcomm-training: milestone 6c outcome (excess ~ omega), post",
            "post: shorten description",
            "prompts: run record for research/lowcomm-training 6c"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "lowcomm-training"
          },
          "files": 8,
          "lines_added": 219,
          "lines_removed": 2,
          "added_files": [
            "docs/posts/2026-10-29-compression-cost-scales-with-variance.md",
            "prompts/runs/2026-10-29-session_01AcxTtKmUxz3EnJBY4FFjev.json",
            "research/lowcomm-training/experiments/gpt_composition/composition_p_results.txt",
            "research/lowcomm-training/experiments/gpt_composition/run_p.out"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "8221416f874655ecb90e97f55f0b1b0aba41e74c",
          "at": 1793290702000,
          "title": "research/lowcomm-training: milestone 6d, compression cost tracks measured omega",
          "pr": 11430,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/lowcomm-training: milestone 6d plan (omega vs keep fraction, composed compressors), pre-registered",
            "research/lowcomm-training: milestone 6d outcome, extra loss tracks measured omega across compressors; post"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "lowcomm-training"
          },
          "files": 8,
          "lines_added": 295,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-lowcomm-compression-cost-is-omega.md",
            "prompts/runs/2026-10-29-session_01AcxTtJmfrVQwDEFcUz6mr4.json",
            "research/lowcomm-training/experiments/gpt_omega/omega.jsonl",
            "research/lowcomm-training/experiments/gpt_omega/omega.py",
            "research/lowcomm-training/experiments/gpt_omega/omega_probe.py",
            "research/lowcomm-training/experiments/gpt_omega/omega_results.txt",
            "research/lowcomm-training/experiments/gpt_omega/run.out"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "5f3ab894c17fc1d0bd64b12f342a8a3b99ca0f95",
          "at": 1793290935000,
          "title": "research/lowcomm-training: milestone 6d, top-k shares the H-shape of the compression excess",
          "pr": 11433,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/lowcomm-training: plan milestone 6d (top-k vs the H-shape of the compression excess)",
            "research/lowcomm-training: milestone 6d, top-k shares the H-shape of the compression excess",
            "post description length; run record for 6d"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "lowcomm-training"
          },
          "files": 8,
          "lines_added": 130,
          "lines_removed": 4,
          "added_files": [
            "docs/posts/2026-10-29-does-top-k-pay-the-same-delay-tax-as-random-sparsification.md",
            "docs/reports/lowcomm-training-milestone-6e.md",
            "prompts/runs/2026-10-29-session_01E5sJKkSvct5U2ZJXwLuJJU.json",
            "research/lowcomm-training/experiments/gpt_composition/run_topk.out",
            "research/lowcomm-training/experiments/gpt_composition/topk_composition.jsonl",
            "research/lowcomm-training/experiments/gpt_composition/topk_composition_results.txt"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "2ddad5d6baf90894039e8f2ad46daf5ae95c17f9",
          "at": 1793311682000,
          "title": "research/lowcomm-training: 6f composition rule vs fitted scaling law",
          "pr": 11489,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/lowcomm-training: 6f composition rule vs fitted additive scaling law on held-out cells"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "lowcomm-training"
          },
          "files": 4,
          "lines_added": 174,
          "lines_removed": 0,
          "added_files": [
            "prompts/runs/2026-10-29-session_01AcxTtHBgBaUz69VzJkxdgF.json",
            "research/lowcomm-training/experiments/gpt_composition/scaling_compare.py",
            "research/lowcomm-training/experiments/gpt_composition/scaling_compare_results.txt"
          ],
          "revert": false,
          "fix_forward": false
        }
      ]
    },
    {
      "name": "llm-coding-inference",
      "merges": [
        {
          "sha": "adba3afcb6c5703b982e85f065f4bd7273ad539c",
          "at": 1793251300000,
          "title": "research/llm-coding-inference: 6ae pooled audit strata for a rare category",
          "pr": 11310,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/llm-coding-inference: 6ae pooled audit strata for a rare category"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "llm-coding-inference"
          },
          "files": 6,
          "lines_added": 252,
          "lines_removed": 1,
          "added_files": [
            "docs/posts/2026-10-29-should-you-stratify-an-audit-for-a-rare-category.md",
            "prompts/runs/2026-10-29-session_01E5sJKjsvzyTjZZj3MxvfV7.json",
            "research/llm-coding-inference/experiments/h6ae_merge_strata.py",
            "research/llm-coding-inference/experiments/h6ae_merge_strata.txt"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "0ae938e56e5b2bbe3cd411b56ad66868cb47d426",
          "at": 1793260373000,
          "title": "research/llm-coding-inference: milestone 6af, stratifying the audit at common categories",
          "pr": 11348,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/llm-coding-inference: plan milestone 6af (common categories), coder prompts for admiration and neutral",
            "research/llm-coding-inference: partial cached coder scores (admiration, neutral; resumable, run in progress)",
            "research/llm-coding-inference: partial coder scores, run in progress",
            "research/llm-coding-inference: partial coder scores, run in progress",
            "research/llm-coding-inference: complete cached coder scores for admiration and neutral",
            "research/llm-coding-inference: milestone 6af, stratifying the audit at common categories (admiration, neutral)"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "llm-coding-inference"
          },
          "files": 9,
          "lines_added": 13685,
          "lines_removed": 2,
          "added_files": [
            "docs/posts/2026-10-29-does-stratifying-an-llm-audit-pay-at-common-categories.md",
            "prompts/runs/2026-10-29-session_01AcxTtHSfZwyJEfJFmCKWRz.json",
            "research/llm-coding-inference/experiments/gollm_admiration_Qwen2.5-1.5B-Instruct.tsv",
            "research/llm-coding-inference/experiments/gollm_neutral_Qwen2.5-1.5B-Instruct.tsv",
            "research/llm-coding-inference/experiments/h6af_common_category.py",
            "research/llm-coding-inference/experiments/h6af_common_category.txt"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "4713c8ed9dbe6f98e66ff412fd4add2dfe535076",
          "at": 1793273067000,
          "title": "research/llm-coding-inference: audit strata by the coder's own label (6ag)",
          "pr": 11388,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/llm-coding-inference: audit strata by the coder's own label (6ag)",
            "docs/posts: shorten description",
            "prompts: run record for research/llm-coding-inference 6ag"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "llm-coding-inference"
          },
          "files": 7,
          "lines_added": 427,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-audit-by-the-coders-own-label.md",
            "prompts/runs/2026-10-29-session_01AcxTtHJoJAhpKAXykNjZPv.json",
            "research/llm-coding-inference/experiments/h6ag_coder_strata.py",
            "research/llm-coding-inference/experiments/h6ag_coder_strata.txt"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "b623acb20c1180603403cf0a6d9e160b82e56979",
          "at": 1793279958000,
          "title": "research/llm-coding-inference: milestone 6ah, pilot-estimated coder-cell allocation (negative result)",
          "pr": 11406,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/llm-coding-inference: milestone 6ah, pilot-estimated coder-cell allocation (negative result)",
            "Shorten post description",
            "Fill in run record for 6ah"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "llm-coding-inference"
          },
          "files": 7,
          "lines_added": 463,
          "lines_removed": 2,
          "added_files": [
            "docs/posts/2026-10-29-a-pilot-allocated-llm-audit-looks-better-and-is-wrong.md",
            "prompts/runs/2026-10-29-session_01E5sJKj9iFGnC3bH5PyMPPX.json",
            "research/llm-coding-inference/experiments/h6ah_pilot_cells.py",
            "research/llm-coding-inference/experiments/h6ah_pilot_cells.txt"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "f8f2dcd51522adb22fdb282aa30c0c1aa89c85bc",
          "at": 1793288766000,
          "title": "research/llm-coding-inference: milestone 6ai, floor and independent pilot for coder-cell allocation",
          "pr": 11427,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/llm-coding-inference: milestone 6ai, floor and independent pilot for coder-cell allocation"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "llm-coding-inference"
          },
          "files": 6,
          "lines_added": 491,
          "lines_removed": 1,
          "added_files": [
            "docs/posts/2026-10-29-estimating-an-audit-allocation-from-a-pilot.md",
            "prompts/runs/2026-10-29-session_01E5sJKkyJj8BZk88AJH7amd.json",
            "research/llm-coding-inference/experiments/h6ai_floor_indep.py",
            "research/llm-coding-inference/experiments/h6ai_floor_indep.txt"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "40c45a74d026dc81b64185964556a54be78ee4e8",
          "at": 1793315636000,
          "title": "research/llm-coding-inference: milestone 6aj, coder-cell floor rule on NaijaSenti (null result)",
          "pr": 11501,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/llm-coding-inference: milestone 6aj, coder-cell floor rule on NaijaSenti (null: uninformative coders), post",
            "post: shorten description; run record",
            "prompts: complete run record"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "llm-coding-inference"
          },
          "files": 5,
          "lines_added": 299,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-does-a-coder-cell-audit-transfer-to-naijasenti.md",
            "prompts/runs/2026-10-29-session_01E5sJKmibyVH2oqPtrY4neM.json",
            "research/llm-coding-inference/experiments/h6aj_naija_floor.py",
            "research/llm-coding-inference/experiments/h6aj_naija_floor.txt"
          ],
          "revert": false,
          "fix_forward": false
        }
      ]
    },
    {
      "name": "aerolog-scaling",
      "merges": [
        {
          "sha": "73d80aec77c6914cc12fbe37343f3a4e5295ddac",
          "at": 1793254975000,
          "title": "research/aerolog-scaling: milestone 9d, adjustable tail area",
          "pr": 11330,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/aerolog-scaling: milestone 9d, adjustable tail area recovers modes for 76 of 78 designs",
            "post: shorten description"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "aerolog-scaling"
          },
          "files": 6,
          "lines_added": 288,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-adjustable-tail-recovers-scaled-uav-modes.md",
            "prompts/runs/2026-10-29-session_01E5sJKn7RAuwNDregUiFWky.json",
            "research/aerolog-scaling/experiments/adjustable_tail/results.txt",
            "research/aerolog-scaling/experiments/adjustable_tail/run.py"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "500b939a8f1cdae99e83b468395faa1df1e97562",
          "at": 1793262249000,
          "title": "research/aerolog-scaling: 9e adjustable tail recovers gust peaks",
          "pr": 11358,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/aerolog-scaling: 9e adjustable tail also recovers gust peaks (67 of 78 within 10%)",
            "prompts: run record for aerolog-scaling 9e"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "aerolog-scaling"
          },
          "files": 6,
          "lines_added": 290,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-adjustable-tail-gust-response.md",
            "prompts/runs/2026-10-29-session_01E5sJKkvjhVt4Uuu8fZLkYP.json",
            "research/aerolog-scaling/experiments/adjustable_gust/results.txt",
            "research/aerolog-scaling/experiments/adjustable_gust/run.py"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "44c6dcc35c7b60086a959f0ef6dc81e9c5721e39",
          "at": 1793294388000,
          "title": "research/aerolog-scaling: 9f noisy in-flight identification of the adjustable tail",
          "pr": 11443,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/aerolog-scaling: milestone 9f, noisy in-flight identification of the adjustable tail"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "aerolog-scaling"
          },
          "files": 5,
          "lines_added": 213,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-how-noisy-can-the-adjustable-tail-measurement-be.md",
            "prompts/runs/2026-10-29-session_01EhTJVNbmB3ZeMJW5Tej1uH.json",
            "research/aerolog-scaling/experiments/noisy_identification/results.txt",
            "research/aerolog-scaling/experiments/noisy_identification/run.py"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "7fb9e0b1c825402b00837b0d39d71d9d5c42e1a7",
          "at": 1793295664000,
          "title": "research/aerolog-scaling: milestone 9f, identification noise on the adjustable tail",
          "pr": 11447,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/aerolog-scaling: milestone 9f, identification noise on the adjustable tail"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "aerolog-scaling"
          },
          "files": 5,
          "lines_added": 267,
          "lines_removed": 0,
          "added_files": [
            "prompts/runs/2026-10-29-session_01AcxTtKAVJ7Vc7Cqj2oPj37.json",
            "research/aerolog-scaling/experiments/identification_noise/results.txt",
            "research/aerolog-scaling/experiments/identification_noise/run.py"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "0afd3598b3757cf64a39ddcf3f94d12df55d772d",
          "at": 1793317290000,
          "title": "research/aerolog-scaling: milestone 9h, least-squares fit of a noisy free response",
          "pr": 11505,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/aerolog-scaling: milestone 9h plan and doublet-fit script (results pending)",
            "research/aerolog-scaling: milestone 9h, least-squares fit of a noisy free response (longer records worse)",
            "post front matter fix; run record for aerolog-scaling 9h"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "aerolog-scaling"
          },
          "files": 6,
          "lines_added": 266,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-how-noisy-can-a-flight-test-be-for-an-adjustable-tail.md",
            "prompts/runs/2026-10-29-session_01E5sJKo1MKMan2s88d2g1VF.json",
            "research/aerolog-scaling/experiments/doublet_fit/results.txt",
            "research/aerolog-scaling/experiments/doublet_fit/run.py"
          ],
          "revert": false,
          "fix_forward": false
        }
      ]
    },
    {
      "name": "verifiable-training-mechanisms",
      "merges": [
        {
          "sha": "14823c00f25243d2e4085c66f754106fb9ddf7a1",
          "at": 1793233855000,
          "title": "research/verifiable-training-mechanisms: milestone 47, gradient-chosen plant under per-tensor bound",
          "pr": 11249,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/verifiable-training-mechanisms: milestone 47, gradient-chosen plant under the per-tensor bound finds no harm at K=4",
            "fill run record"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "verifiable-training-mechanisms"
          },
          "files": 10,
          "lines_added": 409,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-a-gradient-chosen-plant-under-a-per-tensor-bound.md",
            "prompts/runs/2026-10-29-session_01E5sJKknTNBYXJCKVhkSgTi.json",
            "research/verifiable-training-mechanisms/experiments/bit_flips_worst/results.json",
            "research/verifiable-training-mechanisms/experiments/bit_flips_worst/results.txt",
            "research/verifiable-training-mechanisms/experiments/bit_flips_worst/results_all.json",
            "research/verifiable-training-mechanisms/experiments/bit_flips_worst/results_all.txt",
            "research/verifiable-training-mechanisms/experiments/bit_flips_worst/run.out",
            "research/verifiable-training-mechanisms/experiments/bit_flips_worst/run.py",
            "research/verifiable-training-mechanisms/experiments/bit_flips_worst/run_all.out"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "325aa51ceae735e5ae800168ca37c647281b4355",
          "at": 1793313815000,
          "title": "research/verifiable-training-mechanisms: milestone 48, multi-weight plant under per-tensor bound",
          "pr": 11495,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/verifiable-training-mechanisms: milestone 48 pre-registration (multi-weight plant under per-tensor bound)",
            "research/verifiable-training-mechanisms: fix attack sign in milestone 47 script, add milestone 48 script (results pending)",
            "research/verifiable-training-mechanisms: milestone 48, multi-weight plant; corrects milestone 47 sign error",
            "docs: shorten post description"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "verifiable-training-mechanisms"
          },
          "files": 15,
          "lines_added": 495,
          "lines_removed": 18,
          "added_files": [
            "docs/posts/2026-10-29-a-sign-error-hid-an-attack-on-verifiable-training.md",
            "docs/reports/vtm-milestone-48.md",
            "prompts/runs/2026-10-29-session_01E5sJKnmepAehq9BhyqZDVn.json",
            "research/verifiable-training-mechanisms/experiments/bit_flips_multi/results.json",
            "research/verifiable-training-mechanisms/experiments/bit_flips_multi/results.txt",
            "research/verifiable-training-mechanisms/experiments/bit_flips_multi/run.out",
            "research/verifiable-training-mechanisms/experiments/bit_flips_multi/run.py",
            "research/verifiable-training-mechanisms/experiments/bit_flips_worst/wrong_sign/results.json",
            "research/verifiable-training-mechanisms/experiments/bit_flips_worst/wrong_sign/results.txt",
            "research/verifiable-training-mechanisms/experiments/run.out"
          ],
          "revert": false,
          "fix_forward": false
        }
      ]
    },
    {
      "name": "verified-dse",
      "merges": [
        {
          "sha": "9c50ae3f4499499cead6204119943c2dd95b49c8",
          "at": 1793290707000,
          "title": "research/verified-dse: sync paper open items with milestones 36 and 38",
          "pr": 11431,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/verified-dse: sync paper open items with milestones 36 and 38, log, post"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "verified-dse"
          },
          "files": 4,
          "lines_added": 67,
          "lines_removed": 1,
          "added_files": [
            "docs/posts/2026-10-29-chip-search-pilot-certificate-still-open.md",
            "prompts/runs/2026-10-29-session_01E5sJKisNEpS2C8GcBoVnDj.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "50609b319a8f2caa1be9a65356994e046271c340",
          "at": 1793311860000,
          "title": "research/verified-dse: milestone 40, fixed multiplier on pilot iota^(k) gives no bound",
          "pr": 11492,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/verified-dse: milestone 40, fixed multiplier on pilot iota^(k) does not give a bound"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "verified-dse"
          },
          "files": 5,
          "lines_added": 237,
          "lines_removed": 1,
          "added_files": [
            "prompts/runs/2026-10-29-session_01AcxTtGgaiJdy6kkSJLoUYj.json",
            "research/verified-dse/experiments/theory/kth_inflate.py",
            "research/verified-dse/experiments/theory/kth_inflate_results.txt"
          ],
          "revert": false,
          "fix_forward": false
        }
      ]
    },
    {
      "name": "buildbot-carrycop",
      "merges": [
        {
          "sha": "6666c507d062b4de7b3bee9df6ea1d426f0996af",
          "at": 1793305280000,
          "title": "research/buildbot-carrycop: time-varying CoP ramp (heel to toe) sweep",
          "pr": 11472,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/buildbot-carrycop: time-varying CoP ramp model and sweep (in progress)",
            "research/buildbot-carrycop: heel-to-toe CoP ramp results, post, run record"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "buildbot-carrycop"
          },
          "files": 8,
          "lines_added": 18958,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-does-a-heel-to-toe-cop-help-a-humanoid-carry-faster.md",
            "prompts/runs/2026-10-29-session_01E5sJKkLygaTbtc1FAcLXE9.json",
            "research/buildbot-carrycop/experiments/results_ramp.json",
            "research/buildbot-carrycop/experiments/results_ramp.txt",
            "research/buildbot-carrycop/experiments/run_ramp.py"
          ],
          "revert": false,
          "fix_forward": false
        }
      ]
    },
    {
      "name": "capture-trackprior",
      "merges": [
        {
          "sha": "d6e5314140b4dbddc29c14a7fb6bc29a7df76f4a",
          "at": 1793233297000,
          "title": "research/capture-trackprior: gated tracking with re-acquisition",
          "pr": 11248,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/capture-trackprior: gated tracking with re-acquisition cuts lock-loss 37% to 8-10% (+ post)",
            "fix post description length; run record"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "capture-trackprior"
          },
          "files": 11,
          "lines_added": 390,
          "lines_removed": 3,
          "added_files": [
            "docs/posts/2026-10-29-gated-audio-sync-tracking-lock-loss.md",
            "docs/reports/capture-trackprior-gated.md",
            "prompts/runs/2026-10-29-session_01E5sJKo2U3E4YTVWjKCrPV1.json",
            "research/capture-trackprior/LOG.md",
            "research/capture-trackprior/experiments/gated.py",
            "research/capture-trackprior/experiments/gated.txt",
            "research/capture-trackprior/src/capture_trackprior/gated.py"
          ],
          "revert": false,
          "fix_forward": false
        }
      ]
    },
    {
      "name": "hanger-3dradius",
      "merges": [
        {
          "sha": "2e071511981345e989d8f4723095b828a27cfb7d",
          "at": 1793290175000,
          "title": "research/hanger-3dradius: radius-cap sweep for 3D-designed hangers",
          "pr": 11421,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "research",
          "bullets": [
            "research/hanger-3dradius: start radius-cap sweep",
            "research/hanger-3dradius: lifting the radius cap to 10 and 15 cm does not lower drape error"
          ],
          "detail": null,
          "area": {
            "kind": "research",
            "name": "hanger-3dradius"
          },
          "files": 9,
          "lines_added": 288,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-hanger-end-radius-plateau.md",
            "prompts/runs/2026-10-29-session_01AcxTtKTTW1QKoErU1XyUR7.json",
            "research/hanger-3dradius/README.md",
            "research/hanger-3dradius/experiments/results.txt",
            "research/hanger-3dradius/experiments/run.py",
            "research/hanger-3dradius/project.json",
            "research/hanger-3dradius/src/hanger3dradius/__init__.py",
            "research/hanger-3dradius/tests/test_cap.py"
          ],
          "revert": false,
          "fix_forward": false
        }
      ]
    }
  ],
  "writing": [
    {
      "sha": "89be75fa7b237901f1df56902555970ca71973f2",
      "at": 1793240408000,
      "title": "redteam: platform/pages/rates.mjs 2026-10-29",
      "pr": 11269,
      "agent": "Claude Sonnet 5.5",
      "models": [
        "Claude Sonnet 5.5"
      ],
      "track": "redteam",
      "bullets": [
        "redteam: rates.mjs 2026-10-29, 5 tests close 4 escaped mutants",
        "redteam record: name PR 11269"
      ],
      "detail": null,
      "area": {
        "kind": "writing",
        "name": "posts"
      },
      "files": 3,
      "lines_added": 228,
      "lines_removed": 0,
      "added_files": [
        "docs/posts/2026-10-29-redteam-shop-rates-bar.md",
        "prompts/runs/2026-10-29-session_01E5sJKkhf92XgksGEudnTeK.json"
      ],
      "revert": false,
      "fix_forward": false
    },
    {
      "sha": "78b2ec211ef9d7853ad6296d1123036d50d00a55",
      "at": 1793241518000,
      "title": "photo-editing: shootflow cull, local burst grouping and keeper picking with XMP sidecars",
      "pr": 11262,
      "agent": "Claude Sonnet 5.5",
      "models": [
        "Claude Sonnet 5.5"
      ],
      "track": "creative",
      "bullets": [
        "photo-editing: shootflow cull, a local burst-grouping keeper picker with XMP sidecars",
        "Fix main's red validate and build: trim three flagship next: blocks, shorten post descriptions",
        "photo-editing: fix cull post front matter",
        "ai-bookkeeper: tab icon on tax-calendar.html (main's validate was red)",
        "Fill pr on the redteam share.mjs run record (main's validate was red)",
        "Fix main's red build and validate: ventures/ links in five posts, self-host dirs out of the share-link scan"
      ],
      "detail": null,
      "area": {
        "kind": "writing",
        "name": "posts"
      },
      "files": 15,
      "lines_added": 535,
      "lines_removed": 38,
      "added_files": [
        "docs/posts/2026-10-29-shootflow-cull-a-free-local-photo-culling-command.md",
        "prompts/runs/2026-10-29-session_01EhTJVKgyPD8hCGn4xF7ddW.json",
        "ventures/photo-editing/src/shootflow/cull.py",
        "ventures/photo-editing/tests/test_cull.py"
      ],
      "revert": false,
      "fix_forward": false
    },
    {
      "sha": "d82da3de7ac37b0cdafc48652a7b2c71e735f779",
      "at": 1793243236000,
      "title": "redteam: platform/pages/rates.mjs 2026-10-29",
      "pr": 11274,
      "agent": "Claude Sonnet 5.5",
      "models": [
        "Claude Sonnet 5.5"
      ],
      "track": "redteam",
      "bullets": [
        "redteam: rates.mjs 2026-10-29; fix S-corp post front matter that turned podcast suite red",
        "redteam record: name PR"
      ],
      "detail": null,
      "area": {
        "kind": "writing",
        "name": "posts"
      },
      "files": 2,
      "lines_added": 173,
      "lines_removed": 0,
      "added_files": [
        "prompts/runs/2026-10-29-session_01AcxTtLjatvhVgEfBufMdc2.json"
      ],
      "revert": false,
      "fix_forward": false
    },
    {
      "sha": "2b3106914aada748e28c686ad28786c5d1ec467b",
      "at": 1793246091000,
      "title": "Blog: three months, ten thousand PRs, development lessons from the repo",
      "pr": 11282,
      "agent": "Claude Opus 5.5",
      "models": [
        "Claude Opus 5.5"
      ],
      "track": "process",
      "bullets": [
        "Blog: three months, ten thousand PRs, development lessons from the repo"
      ],
      "detail": "A retrospective from the repo's creation (2026-07-28) to now: monthly merged-PR counts, the first measured page loads, and nine lessons drawn from docs/history and docs/reports.",
      "area": {
        "kind": "writing",
        "name": "posts"
      },
      "files": 2,
      "lines_added": 241,
      "lines_removed": 0,
      "added_files": [
        "docs/posts/2026-10-29-three-months-ten-thousand-prs-what-the-repo-taught.md",
        "prompts/runs/2026-10-29-session_01XpHqybrfUaeJKdryKKUeRK.json"
      ],
      "revert": false,
      "fix_forward": false
    },
    {
      "sha": "44c02890840cfc66c45ca7352610718614857391",
      "at": 1793248672000,
      "title": "Blog post + report: CI and application bloat, useful vs deadweight",
      "pr": 11296,
      "agent": "Claude Opus 5.5",
      "models": [
        "Claude Opus 5.5"
      ],
      "track": null,
      "bullets": [
        "Blog post and report: CI and application bloat, useful vs deadweight",
        "Correct the deploy-gap claim: deploy needs build, not test"
      ],
      "detail": "A week of Actions runs (58,776), a job-minute profile of 1,000 runs, and a byte count of ventures/: hetzner-gitops CI is 18.6% of job-minutes for a retired server, main was red on validate/Pages most of the week from metadata caps, 414 of 478 per-product…",
      "area": {
        "kind": "writing",
        "name": "posts"
      },
      "files": 2,
      "lines_added": 390,
      "lines_removed": 0,
      "added_files": [
        "docs/posts/2026-10-29-ci-and-application-bloat-useful-versus-deadweight.md",
        "docs/reports/2026-10-29-ci-and-app-bloat-audit.md"
      ],
      "revert": false,
      "fix_forward": false
    },
    {
      "sha": "07e77a8555466cc93d7b5d42a8f82ca4fd3b8d5b",
      "at": 1793248716000,
      "title": "Blog post: what TypeScript by default would look like in this repo",
      "pr": 11283,
      "agent": "Claude Opus 5.5",
      "models": [
        "Claude Opus 5.5"
      ],
      "track": "process",
      "bullets": [
        "Blog post: what TypeScript by default would look like in this repo",
        "Post: CI runs Node 22.23.4, not 22.22.0",
        "Fix main's red build test: third-party-font post names the placeholder host",
        "Fix two more main breakages blocking post PRs"
      ],
      "detail": "Measured costs and benefits of making TypeScript the default web language: file counts, Node 22.22 type stripping (runs .ts and .test.ts natively, rejects enums, node:module stripTypeScriptTypes keeps columns), and the blocker that platform/pages/build.mjs…",
      "area": {
        "kind": "writing",
        "name": "posts"
      },
      "files": 2,
      "lines_added": 157,
      "lines_removed": 0,
      "added_files": [
        "docs/posts/2026-10-29-what-typescript-by-default-would-look-like.md",
        "prompts/runs/2026-10-29-session_01XpHqyduBahfwCQ4XvVL8gK.json"
      ],
      "revert": false,
      "fix_forward": false
    },
    {
      "sha": "8ae651acd4fc077b533ae675ab80e139a8950781",
      "at": 1793257934000,
      "title": "polish: AI Bookkeeper first-screen CTA; fix post description that broke the site build",
      "pr": 11342,
      "agent": "Claude Sonnet 5.5",
      "models": [
        "Claude Sonnet 5.5"
      ],
      "track": "polish",
      "bullets": [
        "polish: AI Bookkeeper first-screen CTA; fix over-long post description that broke the site build"
      ],
      "detail": null,
      "area": {
        "kind": "writing",
        "name": "posts"
      },
      "files": 6,
      "lines_added": 100,
      "lines_removed": 1,
      "added_files": [
        "docs/posts/2026-10-29-first-screen-bookkeeper.md",
        "docs/reports/img/polish-ai-bookkeeper-cta-390.png",
        "docs/reports/polish-2026-10-29-bookkeeper-cta.md",
        "prompts/runs/2026-10-29-session_01AcxTtKwagGEa8tBmNpEHxt.json"
      ],
      "revert": false,
      "fix_forward": false
    },
    {
      "sha": "d1a457219b98e0654b3dc4c7eeb78a030df1953e",
      "at": 1793261603000,
      "title": "process: say how to wait on a long job with wait_for.py",
      "pr": 11355,
      "agent": "Claude Sonnet 5.5",
      "models": [
        "Claude Sonnet 5.5"
      ],
      "track": "process",
      "bullets": [
        "process: say how to wait on a long job with wait_for.py"
      ],
      "detail": null,
      "area": {
        "kind": "writing",
        "name": "posts"
      },
      "files": 4,
      "lines_added": 70,
      "lines_removed": 1,
      "added_files": [
        "docs/posts/2026-10-29-waiting-on-a-thirty-minute-job.md",
        "prompts/runs/2026-10-29-session_01AcxTtH6TPcvnsZdZExbiQE.json"
      ],
      "revert": false,
      "fix_forward": false
    },
    {
      "sha": "765a100ff8dab8d1dbfb36fd465e30bc403fb1df",
      "at": 1793273108000,
      "title": "polish: fix site build broken by a 161-character post description; test all posts load",
      "pr": 11390,
      "agent": "Claude Sonnet 5.5",
      "models": [
        "Claude Sonnet 5.5"
      ],
      "track": "polish",
      "bullets": [
        "polish: trim a 161-character post description that broke the site build; test that every post loads"
      ],
      "detail": null,
      "area": {
        "kind": "writing",
        "name": "posts"
      },
      "files": 3,
      "lines_added": 55,
      "lines_removed": 1,
      "added_files": [
        "prompts/runs/2026-10-29-session_01E5sJKjNq2sh5G8HSzrXg1k.json"
      ],
      "revert": false,
      "fix_forward": false
    },
    {
      "sha": "535d5f32e8b5102a3fcc360a035492d28afc025a",
      "at": 1793280053000,
      "title": "Fix airline-miles post description length; run record",
      "pr": 11408,
      "agent": "Claude Sonnet 5.5",
      "models": [
        "Claude Sonnet 5.5"
      ],
      "track": "ventures",
      "bullets": [
        "changepoint-detector: real airline-miles series, trend model gives one change at 1946",
        "post description under 160 chars; run record"
      ],
      "detail": null,
      "area": {
        "kind": "writing",
        "name": "posts"
      },
      "files": 2,
      "lines_added": 54,
      "lines_removed": 1,
      "added_files": [
        "prompts/runs/2026-10-29-session_01AcxTtGk9mhhvwJ4EyakYpJ.json"
      ],
      "revert": false,
      "fix_forward": false
    },
    {
      "sha": "f218741894986204cbb2515f5697fbcc5d89338a",
      "at": 1793294676000,
      "title": "polish: fix site build failing on over-budget post seo_titles and descriptions",
      "pr": 11445,
      "agent": "Claude Sonnet 5.5",
      "models": [
        "Claude Sonnet 5.5"
      ],
      "track": "polish",
      "bullets": [
        "polish: shorten over-budget post seo_titles and descriptions that broke the site build",
        "polish: run record"
      ],
      "detail": null,
      "area": {
        "kind": "writing",
        "name": "posts"
      },
      "files": 8,
      "lines_added": 149,
      "lines_removed": 6,
      "added_files": [
        "docs/reports/polish-2026-10-29-broken-build-seo-titles.md",
        "prompts/runs/2026-10-29-session_01E5sJKjPeeZfLHDfnd7DNZ5.json"
      ],
      "revert": false,
      "fix_forward": false
    },
    {
      "sha": "3f1aaea9c2d1c17516e4c18b22645cdd7d079e5a",
      "at": 1793304685000,
      "title": "polish: seo_title for 14 long post headlines",
      "pr": 11469,
      "agent": "Claude Sonnet 5.5",
      "models": [
        "Claude Sonnet 5.5"
      ],
      "track": "polish",
      "bullets": [
        "polish: seo_title for 14 long post headlines"
      ],
      "detail": null,
      "area": {
        "kind": "writing",
        "name": "posts"
      },
      "files": 16,
      "lines_added": 80,
      "lines_removed": 0,
      "added_files": [
        "docs/reports/polish-2026-10-29-post-seo-titles.md",
        "prompts/runs/2026-10-29-session_01AcxTtGtZXns29gJu4WJCDL.json"
      ],
      "revert": false,
      "fix_forward": false
    },
    {
      "sha": "3029710bcc1f801b8969a3dac9ffca06f98909df",
      "at": 1793308192000,
      "title": "polish: test that flagship tool pages keep a first-screen button",
      "pr": 11479,
      "agent": "Claude Sonnet 5.5",
      "models": [
        "Claude Sonnet 5.5"
      ],
      "track": "polish",
      "bullets": [
        "polish: test that flagship tool pages keep a first-screen button"
      ],
      "detail": null,
      "area": {
        "kind": "writing",
        "name": "posts"
      },
      "files": 4,
      "lines_added": 110,
      "lines_removed": 0,
      "added_files": [
        "docs/posts/2026-10-29-keeping-the-first-screen-button.md",
        "docs/reports/polish-2026-10-29-flagship-cta-check.md",
        "platform/pages/flagship-cta.test.mjs",
        "prompts/runs/2026-10-29-session_01AcxTtL7F7Lgs7xuh1WRcyM.json"
      ],
      "revert": false,
      "fix_forward": false
    },
    {
      "sha": "2946b7726055dd7f3a1cff9e40e1a7aa35f71243",
      "at": 1793308874000,
      "title": "polish: shorten post description so the site build stops throwing",
      "pr": 11483,
      "agent": "Claude Sonnet 5.5",
      "models": [
        "Claude Sonnet 5.5"
      ],
      "track": "polish",
      "bullets": [
        "polish: shorten post description so the site build stops throwing",
        "polish: run record"
      ],
      "detail": null,
      "area": {
        "kind": "writing",
        "name": "posts"
      },
      "files": 3,
      "lines_added": 69,
      "lines_removed": 1,
      "added_files": [
        "docs/reports/polish-2026-10-29-build-broke-on-post-description.md",
        "prompts/runs/2026-10-29-session_01E5sJKoAGLxLNxRLwuxyi1e.json"
      ],
      "revert": false,
      "fix_forward": false
    },
    {
      "sha": "d436e1253be3de26de0a9d831834fd8c551e8b9e",
      "at": 1793312389000,
      "title": "redteam: platform/pages/audiences 2026-10-29",
      "pr": 11493,
      "agent": "Claude Sonnet 5.5",
      "models": [
        "Claude Sonnet 5.5"
      ],
      "track": "redteam",
      "bullets": [
        "redteam: shorten two over-budget seo_title values that turned shorts tests red",
        "redteam: run record"
      ],
      "detail": null,
      "area": {
        "kind": "writing",
        "name": "posts"
      },
      "files": 3,
      "lines_added": 159,
      "lines_removed": 2,
      "added_files": [
        "prompts/runs/2026-10-29-session_01E5sJKkayouyZU82fWes6Xo.json"
      ],
      "revert": false,
      "fix_forward": false
    }
  ],
  "platform": [
    {
      "name": "ci",
      "merges": [
        {
          "sha": "b8989bfa7739cf81916e0a072183e147c4ef88ac",
          "at": 1793232494000,
          "title": "ci: third-party request check; drop Google Fonts from retail-pilot-intel portal",
          "pr": 11242,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "explore",
          "bullets": [
            "ci: check_third_party_requests, drop Google Fonts from retail-pilot-intel portal",
            "post: shorten description"
          ],
          "detail": null,
          "area": {
            "kind": "platform",
            "name": "ci"
          },
          "files": 7,
          "lines_added": 289,
          "lines_removed": 6,
          "added_files": [
            "docs/posts/2026-10-29-a-check-that-no-page-loads-a-third-party-font.md",
            "docs/reports/third-party-request-check.md",
            "platform/ci/check_third_party_requests.py",
            "platform/ci/test_check_third_party_requests.py",
            "prompts/runs/2026-10-29-session_01AcxTtHRGysb8UC1REc3F4L.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "10831ff82162aa746641dfc93d29955fc2c1b347",
          "at": 1793236243000,
          "title": "redteam: platform/ci 2026-10-29",
          "pr": 11256,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "redteam",
          "bullets": [
            "redteam: platform/ci guards for 4 escaped mutants 2026-10-29",
            "redteam: shorten post description, fill record",
            "redteam: record PR number"
          ],
          "detail": "Also shortens a post description from #11250 that broke the front-matter check.",
          "area": {
            "kind": "platform",
            "name": "ci"
          },
          "files": 3,
          "lines_added": 573,
          "lines_removed": 0,
          "added_files": [
            "prompts/runs/2026-10-29-session_01AcxTtGbvAs9CcW81uyT2XK.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "0a6a224eddb101dcb4cad7960fcb5a9c94f48b0c",
          "at": 1793240504000,
          "title": "redteam: platform/ci/wait_for.py 2026-10-29",
          "pr": 11270,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "redteam",
          "bullets": [
            "redteam: platform/ci/wait_for.py 2026-10-29 (guard deadline and shell path)",
            "redteam: record PR number"
          ],
          "detail": null,
          "area": {
            "kind": "platform",
            "name": "ci"
          },
          "files": 2,
          "lines_added": 310,
          "lines_removed": 0,
          "added_files": [
            "prompts/runs/2026-10-29-session_01E5sJKkZVkYbBQhSvh4vpsE.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "ce353e51db9d3c45aaae530aec23a4327d861272",
          "at": 1793265686000,
          "title": "redteam: check_markup_basics 2026-10-29",
          "pr": 11368,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "redteam",
          "bullets": [
            "redteam: check_markup_basics 2026-10-29 (signed tabindex fix, main() guards)",
            "redteam: run record"
          ],
          "detail": null,
          "area": {
            "kind": "platform",
            "name": "ci"
          },
          "files": 3,
          "lines_added": 267,
          "lines_removed": 1,
          "added_files": [
            "prompts/runs/2026-10-29-session_01E5sJKkSqvBHtCbp8iD1SSC.json"
          ],
          "revert": false,
          "fix_forward": true
        },
        {
          "sha": "6fb9a6118552e5f0677f98a86a1853e05db8092d",
          "at": 1793273645000,
          "title": "redteam: platform/ci checks 2026-10-29",
          "pr": 11391,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "redteam",
          "bullets": [
            "redteam: platform/ci checks 2026-10-29",
            "redteam: record PR number"
          ],
          "detail": null,
          "area": {
            "kind": "platform",
            "name": "ci"
          },
          "files": 3,
          "lines_added": 435,
          "lines_removed": 0,
          "added_files": [
            "prompts/runs/2026-10-29-session_01E5sJKjFG7U3iTZDvacBjiT.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "f11640c798041009df0fe2bff5e0823f85bbb841",
          "at": 1793283443000,
          "title": "redteam: check_table_headers 2026-10-29",
          "pr": 11413,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "redteam",
          "bullets": [
            "redteam: check_table_headers 2026-10-29 (catch rate 0.6 -> 1.0)",
            "redteam record: PR 11413"
          ],
          "detail": null,
          "area": {
            "kind": "platform",
            "name": "ci"
          },
          "files": 2,
          "lines_added": 130,
          "lines_removed": 0,
          "added_files": [
            "prompts/runs/2026-10-29-session_01EhTJVNb41qWx81BpTAf3eZ.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "71cf1eb8424411b3c3d2ca4163337d591e9df100",
          "at": 1793291167000,
          "title": "platform/ci: check_aria_refs fails label-for and ARIA references to missing ids",
          "pr": 11434,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "explore",
          "bullets": [
            "platform/ci: check_aria_refs fails label-for and ARIA references to missing ids",
            "prompts: run record for explore/0 aria refs"
          ],
          "detail": null,
          "area": {
            "kind": "platform",
            "name": "ci"
          },
          "files": 4,
          "lines_added": 178,
          "lines_removed": 0,
          "added_files": [
            "platform/ci/check_aria_refs.py",
            "platform/ci/test_check_aria_refs.py",
            "prompts/runs/2026-10-29-session_01AcxTtGXm8zmipvvAKDPjoV.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "39dfa00e4b3fd43e81aa327b87e038b38af44811",
          "at": 1793291438000,
          "title": "redteam: platform/ci id and html checks 2026-10-29",
          "pr": 11436,
          "agent": "Claude",
          "models": [],
          "track": "redteam",
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "platform",
            "name": "ci"
          },
          "files": 2,
          "lines_added": 461,
          "lines_removed": 0,
          "added_files": [
            "prompts/runs/2026-10-29-session_01AcxTtKzmfghAejZdXbCKce.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "e98be299332db4ae2e1523fb99d1658dccbb025f",
          "at": 1793304932000,
          "title": "explore: check_local_fetch, CI guard for fetch() of missing local files",
          "pr": 11473,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "explore",
          "bullets": [
            "explore: check_local_fetch, CI guard for fetch() of missing local files",
            "explore: run record"
          ],
          "detail": null,
          "area": {
            "kind": "platform",
            "name": "ci"
          },
          "files": 5,
          "lines_added": 155,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-do-the-pages-fetch-files-that-exist.md",
            "platform/ci/check_local_fetch.py",
            "platform/ci/test_check_local_fetch.py",
            "prompts/runs/2026-10-29-session_01AcxTtLHorJGvWfLjqL2jon.json"
          ],
          "revert": false,
          "fix_forward": false
        }
      ]
    },
    {
      "name": "pages",
      "merges": [
        {
          "sha": "b54ed1a90a876b587c67578d10078798aee702b6",
          "at": 1793250446000,
          "title": "polish: one-line breadcrumb on phones",
          "pr": 11302,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "polish",
          "bullets": [
            "polish: one-line breadcrumb on phones",
            "polish: run record"
          ],
          "detail": null,
          "area": {
            "kind": "platform",
            "name": "pages"
          },
          "files": 5,
          "lines_added": 88,
          "lines_removed": 0,
          "added_files": [
            "docs/posts/2026-10-29-one-line-breadcrumb-on-phones.md",
            "docs/reports/polish-2026-10-29-phone-breadcrumb.md",
            "prompts/runs/2026-10-29-session_01AcxTtHYyLj8Tu1YWCe6Qyi.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "7414f8e7707ba990ce5ba08c67f47038d522c7c6",
          "at": 1793257877000,
          "title": "polish: generated llms.txt states when its source last changed (AEO)",
          "pr": 11341,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "polish",
          "bullets": [
            "polish: generated llms.txt states when its source last changed (AEO)"
          ],
          "detail": null,
          "area": {
            "kind": "platform",
            "name": "pages"
          },
          "files": 4,
          "lines_added": 153,
          "lines_removed": 3,
          "added_files": [
            "docs/reports/polish-2026-10-29-llms-txt-as-of.md",
            "prompts/runs/2026-10-29-session_01E5sJKmoZsaxLJ7bwK3CV7T.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "f104962e1ae8c27cd1b6b65d2f338505bcd83678",
          "at": 1793272161000,
          "title": "polish: floating mic steps aside on scroll",
          "pr": 11385,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "polish",
          "bullets": [
            "polish: floating mic steps aside on scroll and pads the page on phones"
          ],
          "detail": null,
          "area": {
            "kind": "platform",
            "name": "pages"
          },
          "files": 5,
          "lines_added": 169,
          "lines_removed": 1,
          "added_files": [
            "docs/posts/2026-10-29-the-mic-button-that-got-out-of-the-way.md",
            "docs/reports/polish-2026-10-29-floating-mic.md",
            "prompts/runs/2026-10-29-session_01AcxTtJvyCG4AEUSkK7ftd4.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "e7c25e2ddab2e424b19e1378ad074b33d0e3f839",
          "at": 1793279815000,
          "title": "redteam: platform/pages/link.mjs 2026-10-29",
          "pr": 11404,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "redteam",
          "bullets": [
            "redteam: pin MAX_LINK_FIELDS in link.mjs tests (catch 0.75 -> 1.0 after fix)",
            "redteam: run record"
          ],
          "detail": null,
          "area": {
            "kind": "platform",
            "name": "pages"
          },
          "files": 2,
          "lines_added": 176,
          "lines_removed": 0,
          "added_files": [
            "prompts/runs/2026-10-29-session_01AcxTtLyPMeDWZVgPY3QnaA.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "d4b1a2e5d4066cbabe7bcded454a2248ee593f22",
          "at": 1793279884000,
          "title": "polish: optional seo_title front matter for blog post titles",
          "pr": 11405,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "polish",
          "bullets": [
            "polish: optional seo_title front matter for blog post titles"
          ],
          "detail": null,
          "area": {
            "kind": "platform",
            "name": "pages"
          },
          "files": 5,
          "lines_added": 76,
          "lines_removed": 1,
          "added_files": [
            "docs/reports/polish-2026-10-29-seo-title.md",
            "prompts/runs/2026-10-29-session_01AcxTtHCr7sQwgcMM1raNcx.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "b0a0c67bcc27d4921d940bd7f994bc5635bec206",
          "at": 1793288287000,
          "title": "polish: build stamps hand-written llms.txt with git as-of date",
          "pr": 11426,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "polish",
          "bullets": [
            "polish: build stamps hand-written llms.txt with git as-of date",
            "polish: run record"
          ],
          "detail": null,
          "area": {
            "kind": "platform",
            "name": "pages"
          },
          "files": 5,
          "lines_added": 190,
          "lines_removed": 3,
          "added_files": [
            "docs/posts/2026-10-29-llms-txt-dates.md",
            "docs/reports/polish-2026-10-29-own-llms-txt-date.md",
            "prompts/runs/2026-10-29-session_01E5sJKkjaEh6coJDL73L7Nu.json"
          ],
          "revert": false,
          "fix_forward": false
        },
        {
          "sha": "7d6644f18292034ac32020c4c41929d23c4f3893",
          "at": 1793291426000,
          "title": "polish: artifact check that every built product llms.txt states a date",
          "pr": 11435,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "polish",
          "bullets": [
            "polish: artifact check that every built product llms.txt states a date",
            "polish: run record"
          ],
          "detail": null,
          "area": {
            "kind": "platform",
            "name": "pages"
          },
          "files": 4,
          "lines_added": 102,
          "lines_removed": 0,
          "added_files": [
            "docs/reports/polish-2026-10-29-llms-date-check.md",
            "prompts/runs/2026-10-29-session_01E5sJKksxWfPS6Nj1STMJz8.json"
          ],
          "revert": false,
          "fix_forward": false
        }
      ]
    },
    {
      "name": "distribution",
      "merges": [
        {
          "sha": "f2e0284b7bd249beb10faa52a31fd372c4555703",
          "at": 1793254489000,
          "title": "redteam: platform/distribution/mcp.mjs 2026-10-29",
          "pr": 11328,
          "agent": "Claude Sonnet 5.5",
          "models": [
            "Claude Sonnet 5.5"
          ],
          "track": "redteam",
          "bullets": [
            "redteam: guard mcp.mjs pack mode, package name override and entry point",
            "redteam: run record"
          ],
          "detail": null,
          "area": {
            "kind": "platform",
            "name": "distribution"
          },
          "files": 2,
          "lines_added": 200,
          "lines_removed": 1,
          "added_files": [
            "prompts/runs/2026-10-29-session_01AcxTtK2Sc3N986ptzCcGMk.json"
          ],
          "revert": false,
          "fix_forward": false
        }
      ]
    },
    {
      "name": "privacy",
      "merges": [
        {
          "sha": "968883127b78166d9e9ffed8a077d2647a902025",
          "at": 1793233249000,
          "title": "redteam: browser-signals CLI exit-code tests 2026-10-29",
          "pr": 11247,
          "agent": "Claude",
          "models": [],
          "track": "redteam",
          "bullets": [],
          "detail": null,
          "area": {
            "kind": "platform",
            "name": "privacy"
          },
          "files": 3,
          "lines_added": 221,
          "lines_removed": 1,
          "added_files": [
            "prompts/runs/2026-10-29-session_01E5sJKn9VgXmteCrxVrpZrR.json"
          ],
          "revert": false,
          "fix_forward": false
        }
      ]
    }
  ],
  "ci": [
    {
      "sha": "1ed1c47bc2dd6144ce5553634806ac5c75abafa6",
      "at": 1793244080000,
      "title": "process: run conflict-marker check before pushing a main merge (#11273 leak)",
      "pr": 11278,
      "agent": "Claude Sonnet 5.5",
      "models": [
        "Claude Sonnet 5.5"
      ],
      "track": "process",
      "bullets": [
        "process: land-your-work, run the conflict-marker check before pushing a main merge (#11273 leak)"
      ],
      "detail": null,
      "area": {
        "kind": "ci",
        "name": "CI and automation"
      },
      "files": 2,
      "lines_added": 49,
      "lines_removed": 1,
      "added_files": [
        "prompts/runs/2026-10-29-session_01E5sJKjRo86dvLf8Emky7Hj.json"
      ],
      "revert": false,
      "fix_forward": false
    },
    {
      "sha": "0b80f7f9500913d2a3b29b50db4c3802f956d382",
      "at": 1793250533000,
      "title": "ci: one command for CI and local runs; drop 418 duplicate venture workflows",
      "pr": 11293,
      "agent": "Claude Opus 5.5",
      "models": [
        "Claude Opus 5.5"
      ],
      "track": "process",
      "bullets": [
        "ci: one command for CI and local runs; drop 418 duplicate venture workflows",
        "prompts: run record for the local-first CI pass",
        "ci: LocalContext test uses github.sha, which a depth-1 checkout can resolve",
        "Port main-red fixes from PR #11283: placeholder origin in a post, ai-bookkeeper FAQ JSON-LD",
        "gitops: regenerate the front-door shard count (55 -> 56 mounts)"
      ],
      "detail": "ventures-tests.yml now calls platform/ci/run_venture_tests.py, the same command a contributor runs (--changed locally, --since BASE in CI), instead of an inline shell loop.",
      "area": {
        "kind": "ci",
        "name": "CI and automation"
      },
      "files": 433,
      "lines_added": 918,
      "lines_removed": 20376,
      "added_files": [
        "docs/history/ci-local-first-2026-10-29.md",
        "docs/posts/2026-10-29-one-command-for-ci-and-your-laptop.md",
        "platform/ci/test_run_venture_tests.py",
        "prompts/runs/2026-10-29-session_01XpHqycYFxXKBVgZxGbJ3pU.json"
      ],
      "revert": false,
      "fix_forward": false
    },
    {
      "sha": "488f640852da678d96a55d8af09f0efe54f67c6f",
      "at": 1793309223000,
      "title": "polish: fix Pages build failing on a 170-char post description; check front matter before the build",
      "pr": 11485,
      "agent": "Claude Sonnet 5.5",
      "models": [
        "Claude Sonnet 5.5"
      ],
      "track": "polish",
      "bullets": [
        "polish: fix Pages build failing on a 170-char post description; check front matter before the build",
        "polish: run record"
      ],
      "detail": null,
      "area": {
        "kind": "ci",
        "name": "CI and automation"
      },
      "files": 3,
      "lines_added": 78,
      "lines_removed": 0,
      "added_files": [
        "docs/reports/polish-2026-10-29-pages-build-fail-fast.md",
        "prompts/runs/2026-10-29-session_01E5sJKo3HuVKT8uLkcsgDLE.json"
      ],
      "revert": false,
      "fix_forward": false
    }
  ],
  "process": [
    {
      "sha": "9a2b20a1713ed869eedca0e481766d8839a35f73",
      "at": 1793232784000,
      "title": "polish: whole-site structural scan report and next steps",
      "pr": 11245,
      "agent": "Claude",
      "models": [],
      "track": "polish",
      "bullets": [],
      "detail": null,
      "area": {
        "kind": "process",
        "name": "docs"
      },
      "files": 2,
      "lines_added": 89,
      "lines_removed": 0,
      "added_files": [
        "docs/reports/polish-2026-10-29-site-scan.md",
        "prompts/runs/2026-10-29-session_01AcxTtGmkzkq4CSEe9HVjFL.json"
      ],
      "revert": false,
      "fix_forward": false
    },
    {
      "sha": "67fe7e4c03bd38f764a91cadfdaca9dc6a44fae7",
      "at": 1793246412000,
      "title": "process: promptctl route --task picks the track a scheduled message names",
      "pr": 11288,
      "agent": "Claude Sonnet 5.5",
      "models": [
        "Claude Sonnet 5.5"
      ],
      "track": "process",
      "bullets": [
        "process: promptctl route --task picks the track a scheduled message names"
      ],
      "detail": null,
      "area": {
        "kind": "process",
        "name": "prompts"
      },
      "files": 5,
      "lines_added": 111,
      "lines_removed": 4,
      "added_files": [
        "docs/posts/2026-10-29-route-reads-the-task.md",
        "prompts/runs/2026-10-29-session_01EhTJVKs65zmeksERMjB7b1.json"
      ],
      "revert": false,
      "fix_forward": false
    },
    {
      "sha": "66bcd6d91f1f75530ee52e755ba6153aa1fb1b90",
      "at": 1793246450000,
      "title": "Static framework for an agent-written site: measurements, R&D note, blog post",
      "pr": 11284,
      "agent": "Claude Opus 5.5",
      "models": [
        "Claude Opus 5.5"
      ],
      "track": "explore",
      "bullets": [
        "Static framework for an agent-written site: measurements, R&D note, post"
      ],
      "detail": "Built the Pages site and weighed it: 5,344 pages, median 7.4 KB gzip, 61% of inline CSS/JS repeated across pages, /research/ at 240 KB gzip, 555 distinct :root token sets.",
      "area": {
        "kind": "process",
        "name": "docs"
      },
      "files": 6,
      "lines_added": 576,
      "lines_removed": 0,
      "added_files": [
        "docs/posts/2026-10-29-what-a-static-framework-for-an-agent-written-site-needs.md",
        "docs/reports/assets/static-framework/drift.mjs",
        "docs/reports/assets/static-framework/measure-2026-10-29.json",
        "docs/reports/assets/static-framework/measure.mjs",
        "docs/reports/static-framework-rd-2026-10-29.md",
        "prompts/runs/2026-10-29-session_01XpHqyfcjS4uehnNXURCmVz.json"
      ],
      "revert": false,
      "fix_forward": false
    },
    {
      "sha": "67b9bf512678c41057962ebd4e7d779554133b41",
      "at": 1793246960000,
      "title": "prompts: review 2026-10-29",
      "pr": 11290,
      "agent": "Claude Sonnet 5.5",
      "models": [
        "Claude Sonnet 5.5"
      ],
      "track": "review",
      "bullets": [
        "prompts: review 2026-10-29 (reduced pass)",
        "docs: shorten photographer post description under 160 chars",
        "prompts: run record",
        "prompts: fix run record writeups"
      ],
      "detail": null,
      "area": {
        "kind": "process",
        "name": "prompts"
      },
      "files": 4,
      "lines_added": 142,
      "lines_removed": 2,
      "added_files": [
        "prompts/runs/2026-10-29-session_01AcxTtJj2qypsLkR8QfAH5o.json"
      ],
      "revert": false,
      "fix_forward": false
    },
    {
      "sha": "4c2a61402fc34ebf93567756139d4624fa390445",
      "at": 1793247565000,
      "title": "process: push hook checks only posts this branch changed",
      "pr": 11297,
      "agent": "Claude Sonnet 5.5",
      "models": [
        "Claude Sonnet 5.5"
      ],
      "track": "process",
      "bullets": [
        "process: push hook checks only posts this branch changed (three-dot diff)"
      ],
      "detail": null,
      "area": {
        "kind": "process",
        "name": ".claude"
      },
      "files": 3,
      "lines_added": 64,
      "lines_removed": 2,
      "added_files": [
        "docs/reports/2026-10-29-push-hook-three-dot.md",
        "prompts/runs/2026-10-29-session_01E5sJKnc37pH6adQ7RTkbJn.json"
      ],
      "revert": false,
      "fix_forward": false
    },
    {
      "sha": "681c89ef3317ef7d082a227da7d20e87294810e6",
      "at": 1793247660000,
      "title": "process: polish build time note, P059 push-hook diff base",
      "pr": 11298,
      "agent": "Claude Sonnet 5.5",
      "models": [
        "Claude Sonnet 5.5"
      ],
      "track": "process",
      "bullets": [
        "process: polish build time note, P059 hook diff base, post"
      ],
      "detail": null,
      "area": {
        "kind": "process",
        "name": "prompts"
      },
      "files": 4,
      "lines_added": 96,
      "lines_removed": 1,
      "added_files": [
        "docs/posts/2026-10-29-polish-build-takes-twenty-minutes.md",
        "prompts/process/backlog/P059-push-hook-diff-base.json",
        "prompts/runs/2026-10-29-session_01E5sJKmPbUXigHSCjJndXXM.json"
      ],
      "revert": false,
      "fix_forward": false
    },
    {
      "sha": "49894784d5fbddfa2515696c31603c62af3d207e",
      "at": 1793248056000,
      "title": "Opinion: lean towards projects worth ~300 human hours; per-project hours in runcost report",
      "pr": 11280,
      "agent": "Claude Opus 5.5",
      "models": [
        "Claude Opus 5.5"
      ],
      "track": null,
      "bullets": [
        "Raise the project-size bar to 200 human hours; per-project hours in runcost report",
        "Make it about 300 hours, framed as a suggestion rather than a bar",
        "ai-bookkeeper: FAQPage JSON-LD matches the visible answers (main's pages test was red)",
        "posts: don't spell out the placeholder origin in the third-party-font post"
      ],
      "detail": "Owner, 2026-10-29: focus on projects estimated at 200+ human-equivalent hours.",
      "area": {
        "kind": "process",
        "name": "prompts"
      },
      "files": 9,
      "lines_added": 358,
      "lines_removed": 8,
      "added_files": [
        "docs/posts/2026-10-29-aim-at-projects-worth-three-hundred-hours.md",
        "prompts/runs/2026-10-29-session_01XpHqybsan53CqC4GNnvd1X.json"
      ],
      "revert": false,
      "fix_forward": false
    },
    {
      "sha": "6b84a10a636dc9611bceb43cbe5d59103340ae22",
      "at": 1793249295000,
      "title": "dupehound: a copy-paste detector in Rust (CLI + WebAssembly page), first of \"dev tools in Rust\"",
      "pr": 11285,
      "agent": "Claude Opus 5.5",
      "models": [
        "Claude Opus 5.5"
      ],
      "track": "ventures",
      "bullets": [],
      "detail": "First tool of the owner's direction \"dev tools in Rust, common and niche\" (2026-10-29).",
      "area": {
        "kind": "process",
        "name": "gitops"
      },
      "files": 120,
      "lines_added": 2721,
      "lines_removed": 42,
      "added_files": [
        ".github/workflows/dupehound-ci.yml",
        "docs/posts/2026-10-29-forty-percent-of-our-javascript-is-a-copy.md",
        "portfolio/opinions/2026-10-29-dev-tools-in-rust.md",
        "prompts/runs/2026-10-29-session_01XpHqybrr8TCMDDbRen5vrs.json",
        "ventures/dupehound/.gitignore",
        "ventures/dupehound/BENCHMARK.md",
        "ventures/dupehound/Cargo.lock",
        "ventures/dupehound/Cargo.toml",
        "ventures/dupehound/LICENSE",
        "ventures/dupehound/README.md",
        "ventures/dupehound/VENTURE.yaml",
        "ventures/dupehound/index.html",
        "ventures/dupehound/llms.txt",
        "ventures/dupehound/page.test.mjs",
        "ventures/dupehound/robots.txt",
        "ventures/dupehound/sitemap.xml",
        "ventures/dupehound/src/lib.rs",
        "ventures/dupehound/src/main.rs",
        "ventures/dupehound/src/wasm.rs",
        "ventures/dupehound/tests/bench/compare.py",
        "ventures/dupehound/tests/bench/rss.py",
        "ventures/dupehound/tests/bench/wasm_bench.mjs",
        "ventures/dupehound/tests/detect.rs",
        "ventures/dupehound/tests/fixtures/a.js",
        "ventures/dupehound/tests/fixtures/b.js",
        "ventures/dupehound/tests/fixtures/c.py",
        "ventures/dupehound/tests/fixtures/order/a-b/x.js",
        "ventures/dupehound/tests/fixtures/order/a/x.js",
        "ventures/dupehound/usage.mjs",
        "ventures/dupehound/usage.test.mjs",
        "ventures/dupehound/web/dupehound.mjs",
        "ventures/dupehound/web/dupehound.test.mjs",
        "ventures/dupehound/web/dupehound.wasm"
      ],
      "revert": false,
      "fix_forward": false
    },
    {
      "sha": "64ae4cc1184362b7528795f086917bfec2179c1c",
      "at": 1793251599000,
      "title": "usage: daily site page-load counts and feedback from platform/edge",
      "pr": null,
      "agent": null,
      "models": [],
      "track": null,
      "bullets": [],
      "detail": null,
      "area": {
        "kind": "process",
        "name": "portfolio"
      },
      "files": 1,
      "lines_added": 5,
      "lines_removed": 0,
      "added_files": [],
      "revert": false,
      "fix_forward": false
    },
    {
      "sha": "51c5fe439c997cc2a69cfe96eb6826d3a03ce398",
      "at": 1793253630000,
      "title": "process: P059 rewritten to its real remaining gap; run record",
      "pr": 11321,
      "agent": "Claude Sonnet 5.5",
      "models": [
        "Claude Sonnet 5.5"
      ],
      "track": "process",
      "bullets": [
        "process: P059 rewritten to the real remaining gap (compound command judged on pre-edit tree); run record"
      ],
      "detail": null,
      "area": {
        "kind": "process",
        "name": "prompts"
      },
      "files": 2,
      "lines_added": 49,
      "lines_removed": 4,
      "added_files": [
        "prompts/runs/2026-10-29-session_01EhTJVKgWqnCq3PphWqXoLr.json"
      ],
      "revert": false,
      "fix_forward": false
    },
    {
      "sha": "650873880a27bca12a8e9a9c2d2e54fa25a853db",
      "at": 1793255871000,
      "title": "lane 2 report: #11320, size-page drift, the shift-roster-builder red test",
      "pr": 11335,
      "agent": "Claude",
      "models": [],
      "track": "polish",
      "bullets": [],
      "detail": null,
      "area": {
        "kind": "process",
        "name": "docs"
      },
      "files": 1,
      "lines_added": 5,
      "lines_removed": 0,
      "added_files": [],
      "revert": false,
      "fix_forward": false
    },
    {
      "sha": "d2f3d329d39274d4681ca294794c1f2ec1ee5a43",
      "at": 1793261544000,
      "title": "prompts: review 2026-10-29",
      "pr": 11353,
      "agent": "Claude Sonnet 5.5",
      "models": [
        "Claude Sonnet 5.5"
      ],
      "track": "review",
      "bullets": [
        "prompts: review 2026-10-29 (reduced pass): wait_for exit-code note, derive refresh",
        "prompts: review run record",
        "prompts: review run record"
      ],
      "detail": null,
      "area": {
        "kind": "process",
        "name": "prompts"
      },
      "files": 5,
      "lines_added": 4235,
      "lines_removed": 75,
      "added_files": [
        "prompts/runs/2026-10-29-session_01AcxTtKcagG6tYRwUAjfSqK.json"
      ],
      "revert": false,
      "fix_forward": false
    },
    {
      "sha": "d73d7b7b39ce3b2e95a1d279767c06f84f40449f",
      "at": 1793277049000,
      "title": "prompts: fix three run records that turned promptctl validate red on main",
      "pr": 11397,
      "agent": "Claude",
      "models": [],
      "track": "process",
      "bullets": [],
      "detail": null,
      "area": {
        "kind": "process",
        "name": "prompts"
      },
      "files": 3,
      "lines_added": 17,
      "lines_removed": 8,
      "added_files": [],
      "revert": false,
      "fix_forward": true
    },
    {
      "sha": "8c2972be32d744209bb73e60801cdf2570f51fbe",
      "at": 1793280157000,
      "title": "prompts: review 2026-10-29",
      "pr": 11409,
      "agent": "Claude Sonnet 5.5",
      "models": [
        "Claude Sonnet 5.5"
      ],
      "track": "review",
      "bullets": [
        "prompts: review 2026-10-29 (reduced pass): redteam pyenv note",
        "prompts: run record for review 2026-10-29"
      ],
      "detail": null,
      "area": {
        "kind": "process",
        "name": "prompts"
      },
      "files": 3,
      "lines_added": 58,
      "lines_removed": 2,
      "added_files": [
        "prompts/runs/2026-10-29-session_01E5sJKm279eo8Ld1qqwvbb6.json"
      ],
      "revert": false,
      "fix_forward": false
    },
    {
      "sha": "95f9001de2c536c7c3b4b54fa3a749d9333be852",
      "at": 1793293888000,
      "title": "explore: three more clean sweeps noted in the skip list",
      "pr": 11440,
      "agent": "Claude Sonnet 5.5",
      "models": [
        "Claude Sonnet 5.5"
      ],
      "track": "explore",
      "bullets": [
        "explore: note three more clean sweeps (untyped buttons, href=#, rel=icon)"
      ],
      "detail": null,
      "area": {
        "kind": "process",
        "name": "prompts"
      },
      "files": 2,
      "lines_added": 47,
      "lines_removed": 0,
      "added_files": [
        "prompts/runs/2026-10-29-session_01AcxTtJSyxUYLLnDKMtDmWJ.json"
      ],
      "revert": false,
      "fix_forward": false
    },
    {
      "sha": "2a8f9643f98aa5b325630c598d433d28e16cb4b7",
      "at": 1793296780000,
      "title": "process: fix three run records failing promptctl validate on main",
      "pr": 11448,
      "agent": "Claude Sonnet 5.5",
      "models": [
        "Claude Sonnet 5.5"
      ],
      "track": "process",
      "bullets": [
        "process: fill pr/outcome on three run records that failed promptctl validate on main"
      ],
      "detail": null,
      "area": {
        "kind": "process",
        "name": "prompts"
      },
      "files": 4,
      "lines_added": 46,
      "lines_removed": 7,
      "added_files": [
        "prompts/runs/2026-10-29-session_01EhTJVNPh9GjdNX8JZhdFFq.json"
      ],
      "revert": false,
      "fix_forward": true
    },
    {
      "sha": "152c0a5dddde34624a074bff5fd0297a88e11d00",
      "at": 1793301099000,
      "title": "process: pick_track.py usage error on a non-numeric draw",
      "pr": 11461,
      "agent": "Claude Sonnet 5.5",
      "models": [
        "Claude Sonnet 5.5"
      ],
      "track": "process",
      "bullets": [
        "pick_track: usage error instead of traceback on a non-numeric draw"
      ],
      "detail": null,
      "area": {
        "kind": "process",
        "name": "research"
      },
      "files": 3,
      "lines_added": 136,
      "lines_removed": 1,
      "added_files": [
        "prompts/runs/2026-10-29-session_01AcxTtJ3anaF7aMxq23Hrd2.json"
      ],
      "revert": false,
      "fix_forward": false
    },
    {
      "sha": "ab66c907ffd2f7cd4a5b1be2c66feb8624704808",
      "at": 1793301346000,
      "title": "prompts: review 2026-10-29 (reduced pass)",
      "pr": 11462,
      "agent": "Claude Sonnet 5.5",
      "models": [
        "Claude Sonnet 5.5"
      ],
      "track": "review",
      "bullets": [
        "prompts: review 2026-10-29 (reduced pass): wait_for/measure note",
        "prompts: run record for review 2026-10-29",
        "prompts: run record for review 2026-10-29"
      ],
      "detail": null,
      "area": {
        "kind": "process",
        "name": "prompts"
      },
      "files": 3,
      "lines_added": 65,
      "lines_removed": 1,
      "added_files": [
        "prompts/runs/2026-10-29-session_01AcxTtLs5bcyzWW2EPf4MAC.json"
      ],
      "revert": false,
      "fix_forward": false
    },
    {
      "sha": "a760516849c398da41ca957429f9b042265ea236",
      "at": 1793304718000,
      "title": "redteam: check_code_refs 2026-10-29 run record",
      "pr": 11470,
      "agent": "Claude",
      "models": [],
      "track": "redteam",
      "bullets": [],
      "detail": null,
      "area": {
        "kind": "process",
        "name": "prompts"
      },
      "files": 1,
      "lines_added": 236,
      "lines_removed": 0,
      "added_files": [
        "prompts/runs/2026-10-29-session_01AcxTtJg51Ux3EfzcLRyoMS.json"
      ],
      "revert": false,
      "fix_forward": false
    },
    {
      "sha": "e4ddea2c8f0c85bf9a2a00ddea7050da05b2c2d6",
      "at": 1793305333000,
      "title": "redteam: check_post_frontmatter 2026-10-29 (8 seeded, 7 caught, 1 equivalent)",
      "pr": 11475,
      "agent": "Claude",
      "models": [],
      "track": "redteam",
      "bullets": [],
      "detail": null,
      "area": {
        "kind": "process",
        "name": "prompts"
      },
      "files": 1,
      "lines_added": 165,
      "lines_removed": 0,
      "added_files": [
        "prompts/runs/2026-10-29-session_01E5sJKjufgb2WoZssozCMTB.json"
      ],
      "revert": false,
      "fix_forward": false
    }
  ],
  "new_ventures": [
    "dupehound",
    "shed-designer"
  ],
  "new_research": [
    "hanger-3dradius"
  ],
  "new_posts": [
    "2026-10-28-reading-window-sills-from-a-real-ifc-file",
    "2026-10-29-a-check-that-no-page-loads-a-third-party-font",
    "2026-10-29-zita-and-the-bread-in-the-oven-bedtime-story",
    "2026-10-29-sales-agent-writes-replies-back-to-your-crm",
    "2026-10-29-solar-boat-surge-rule-mostly-a-speed-choice",
    "2026-10-29-gated-audio-sync-tracking-lock-loss",
    "2026-10-29-a-gradient-chosen-plant-under-a-per-tensor-bound",
    "2026-10-29-sales-agent-moves-the-deal-only-when-you-click",
    "2026-10-29-restaurant-bookkeeping-from-a-bank-statement",
    "2026-10-29-free-small-business-tax-calendar-ics",
    "2026-10-29-real-estate-agent-bookkeeping-from-a-bank-statement",
    "2026-10-29-boil-it-once-nitrate-boil-water-notice-story",
    "2026-10-29-state-income-tax-on-the-bookkeeper-page",
    "2026-10-29-the-warm-stack-hay-fire-story",
    "2026-10-29-shape-or-shock-a-negative-result",
    "2026-10-29-salon-and-barber-bookkeeping-page",
    "2026-10-29-cleaning-business-bookkeeping-from-a-bank-statement",
    "2026-10-29-shape-or-shock-second-try",
    "2026-10-29-fuzzing-the-bank-statement-reader",
    "2026-10-29-redteam-shop-rates-bar",
    "2026-10-29-shootflow-cull-a-free-local-photo-culling-command",
    "2026-10-29-would-an-s-corp-save-you-tax",
    "2026-10-29-landscaping-business-bookkeeping-from-a-bank-statement",
    "2026-10-29-personal-trainer-bookkeeping-page",
    "2026-10-29-shape-or-shock-third-try-log-refit",
    "2026-10-29-paul-shipwreck-malta-bedtime-story",
    "2026-10-29-three-months-ten-thousand-prs-what-the-repo-taught",
    "2026-10-29-does-the-photo-cull-pick-what-you-would-pick",
    "2026-10-29-photographer-bookkeeping-page",
    "2026-10-29-route-reads-the-task",
    "2026-10-29-what-a-static-framework-for-an-agent-written-site-needs",
    "2026-10-29-excavator-load-shape-vs-our-model",
    "2026-10-29-tutor-bookkeeping-page",
    "2026-10-29-idle-time-decides-load-sensing-vs-open-centre",
    "2026-10-29-polish-build-takes-twenty-minutes",
    "2026-10-29-red-team-fifteen-days-damage-and-repairs",
    "2026-10-29-aim-at-projects-worth-three-hundred-hours",
    "2026-10-29-ci-and-application-bloat-useful-versus-deadweight",
    "2026-10-29-what-typescript-by-default-would-look-like",
    "2026-10-29-forty-percent-of-our-javascript-is-a-copy",
    "2026-10-29-shootflow-blink-detector-opencv",
    "2026-10-29-dupehound-finds-renamed-copies",
    "2026-10-29-two-storeys-were-one-plan",
    "2026-10-29-one-line-breadcrumb-on-phones",
    "2026-10-29-one-command-for-ci-and-your-laptop",
    "2026-10-29-pet-sitter-bookkeeping-page",
    "2026-10-29-a-spreadsheet-that-stalled-the-bookkeeper",
    "2026-10-29-549-off-an-8x12-shed-with-stock-parts",
    "2026-10-29-an-8-ft-shed-peak-and-a-6-6-door",
    "2026-10-29-home-depot-or-lowes-for-an-8x12-shed",
    "2026-10-29-the-shed-walls-had-no-tops",
    "2026-10-29-what-a-shed-costs-past-the-lumber",
    "2026-10-29-does-an-excavators-idle-time-decide-its-hydraulic-circuit",
    "2026-10-29-the-drift-warning-and-9-11",
    "2026-10-29-should-you-stratify-an-audit-for-a-rare-category",
    "2026-10-29-four-framing-faults-the-shed-checks-missed",
    "2026-10-29-shed-designer-cut-list-proven-lower-bound",
    "2026-10-29-shed-designer-plans-checked-against-the-model",
    "2026-10-29-how-much-lumber-for-a-shed-by-size",
    "2026-10-29-when-only-a-few-can-close-fairness-has-limits",
    "2026-10-29-breaking-the-shed-designer-on-purpose",
    "2026-10-29-shed-designer-driven-like-a-first-time-visitor",
    "2026-10-29-a-seasonal-shock-warning-that-also-warns-on-nothing",
    "2026-10-29-how-many-nails-hold-a-shed-rafter-tie",
    "2026-10-29-1200-random-walls-and-no-gap-in-the-sheathing",
    "2026-10-29-adjustable-tail-recovers-scaled-uav-modes",
    "2026-10-29-does-compression-cost-depend-on-sync-interval",
    "2026-10-29-playwright-on-ubuntu-26-04",
    "2026-10-29-cull-a-shoot-offline-with-xmp-ratings",
    "2026-10-29-an-airline-strike-in-weekly-data",
    "2026-10-29-draw-your-house-get-a-framing-takeoff",
    "2026-10-29-first-screen-bookkeeper",
    "2026-10-29-drag-a-wall-framing-takeoff-sketch",
    "2026-10-29-where-the-pump-coughs-a-cistern-story",
    "2026-10-29-drag-a-door-along-the-wall",
    "2026-10-29-does-stratifying-an-llm-audit-pay-at-common-categories",
    "2026-10-29-sketch-survives-reload",
    "2026-10-29-trace-over-a-scanned-plan",
    "2026-10-29-waiting-on-a-thirty-minute-job",
    "2026-10-29-how-fast-should-a-solar-boat-cruise-hull-uncertainty",
    "2026-10-29-adjustable-tail-gust-response",
    "2026-10-29-straighten-a-crooked-plan-scan",
    "2026-10-29-trace-over-picture-survives-reload",
    "2026-10-29-farmers-market-vendor-bookkeeping-page",
    "2026-10-29-the-stack-that-sweats-a-hay-fire-story",
    "2026-10-29-home-daycare-bookkeeping-page",
    "2026-10-29-the-detector-and-the-hurricane",
    "2026-10-29-monica-and-the-window-at-ostia-saints-by-candlelight",
    "2026-10-29-referees-across-divisions",
    "2026-10-29-therapist-bookkeeping-page",
    "2026-10-29-does-a-longer-series-tell-a-shock-from-a-season-changepoint",
    "2026-10-29-bookkeeping-for-massage-therapists-and-estheticians",
    "2026-10-29-tattoo-artist-bookkeeping-page",
    "2026-10-29-league-schedule-google-calendar-csv",
    "2026-10-29-calendar-files-for-multi-division-leagues",
    "2026-10-29-baseboard-scarf-joints-cost-board",
    "2026-10-29-does-a-drift-warning-cry-wolf-on-a-clean-series",
    "2026-10-29-how-many-eave-baffles-for-an-attic",
    "2026-10-29-nested-cad-door-symbols-in-the-wall-framing-takeoff",
    "2026-10-29-first-screen-buttons-on-three-tools",
    "2026-10-29-the-mic-button-that-got-out-of-the-way",
    "2026-10-29-tennis-feeder-nip-needs-241-newtons",
    "2026-10-29-what-moves-a-solar-boats-range-most",
    "2026-10-29-mobile-detailer-bookkeeping-page",
    "2026-10-29-audit-by-the-coders-own-label",
    "2026-10-29-wedding-dj-planner-florist-bookkeeping-page",
    "2026-10-29-owner-operator-trucker-bookkeeping-page",
    "2026-10-29-home-inspector-bookkeeping-page",
    "2026-10-29-solar-boat-range-with-published-power-figures",
    "2026-10-29-when-noise-alone-looks-like-a-drifting-season",
    "2026-10-29-auto-repair-shop-bookkeeping-page",
    "2026-10-29-staggered-blocking-in-a-wall-takeoff",
    "2026-10-29-small-farm-csa-bookkeeping",
    "2026-10-29-a-pilot-allocated-llm-audit-looks-better-and-is-wrong",
    "2026-10-29-airline-miles-one-change-after-the-war",
    "2026-10-29-does-ar1-hide-a-drifting-season",
    "2026-10-29-shed-designer-numbers-that-drift",
    "2026-10-29-the-window-that-ate-the-stud",
    "2026-10-29-does-a-load-sensing-hydraulic-pump-pay-for-itself",
    "2026-10-29-a-wandering-series-is-not-a-staircase",
    "2026-10-29-how-far-does-a-solar-boat-go-per-day",
    "2026-10-29-how-much-can-an-excavator-boom-give-back",
    "2026-10-29-compression-cost-scales-with-variance",
    "2026-10-29-small-survey-boat-hull-ranking-robust-range-not",
    "2026-10-29-gable-wall-panels-get-a-weight",
    "2026-10-29-does-load-sensing-pay-on-a-small-excavator",
    "2026-10-29-llms-txt-dates",
    "2026-10-29-estimating-an-audit-allocation-from-a-pilot",
    "2026-10-29-the-stair-order-was-missing-its-risers",
    "2026-10-29-hanger-end-radius-plateau",
    "2026-10-29-israel-invoices-above-5000-shekels-need-an-allocation-number",
    "2026-10-29-lowcomm-compression-cost-is-omega",
    "2026-10-29-chip-search-pilot-certificate-still-open",
    "2026-10-29-foundation-takeoff-now-counts-piers",
    "2026-10-29-does-top-k-pay-the-same-delay-tax-as-random-sparsification",
    "2026-10-29-vending-route-bookkeeping",
    "2026-10-29-pier-footings-in-the-framing-takeoff-page",
    "2026-10-29-testing-the-s-corp-calculator-with-400-random-businesses",
    "2026-10-29-the-hall-with-the-doors-shut-smoke-story",
    "2026-10-29-stepped-footings-in-a-framing-takeoff",
    "2026-10-29-how-noisy-can-the-adjustable-tail-measurement-be",
    "2026-10-29-email-fields-that-autofill",
    "2026-10-29-22-pages-nobody-linked-to",
    "2026-10-29-mobile-notary-bookkeeping",
    "2026-10-29-wall-framing-schedule-holidays",
    "2026-10-29-ohio-sales-tax-discount-cap",
    "2026-10-29-shootflow-raw-review-proxies",
    "2026-10-29-do-the-league-calendar-files-hold-up",
    "2026-10-29-ohio-quarterly-sales-tax-due-dates",
    "2026-10-29-seeding-bugs-in-the-child-tax-credit-calculator",
    "2026-10-29-three-seller-fee-calculators-now-answer-assistants",
    "2026-10-29-roster-hub-alerts-to-your-own-slack",
    "2026-10-29-radon-in-a-granite-laundry",
    "2026-10-29-siding-takeoff-gable-ends",
    "2026-10-29-the-slowest-chair-on-the-hill-a-lightning-story",
    "2026-10-29-replies-to-cold-outreach-guide",
    "2026-10-29-food-truck-bookkeeping",
    "2026-10-29-advanced-framing-saves-a-quarter-of-the-lumber",
    "2026-10-29-referees-for-every-division-on-one-page",
    "2026-10-29-do-the-pages-fetch-files-that-exist",
    "2026-10-29-does-a-heel-to-toe-cop-help-a-humanoid-carry-faster",
    "2026-10-29-league-schedule-messages-for-every-team-and-official",
    "2026-10-29-the-error-message-script-nobody-ran",
    "2026-10-29-trim-take-off-shoe-moulding-and-scarf-joints",
    "2026-10-29-south-korea-electronic-tax-invoice",
    "2026-10-29-flagship-tools-now-open-on-a-button",
    "2026-10-29-keeping-the-first-screen-button",
    "2026-10-29-rough-water-solar-boat-speed",
    "2026-10-29-slow-down-on-rough-days-solar-boat",
    "2026-10-29-panelised-vs-stick-framing-piece-counts",
    "2026-10-29-does-the-schedule-checker-notice-a-planted-fault",
    "2026-10-29-do-your-stair-treads-span-too-far",
    "2026-10-29-first-fit-costs-9-percent-when-lumber-prices-by-length",
    "2026-10-29-a-quieter-airline-series-was-not-quiet",
    "2026-10-29-does-load-sensing-win-it-depends-on-one-number",
    "2026-10-29-sourced-neutral-pressure-flips-load-sensing-ranking",
    "2026-10-29-thirty-airline-series-none-quiet-changepoints",
    "2026-10-29-a-sign-error-hid-an-attack-on-verifiable-training",
    "2026-10-29-shootflow-cull-contact-sheet",
    "2026-10-29-rebuild-the-week-or-change-one-shift",
    "2026-10-29-shift-roster-builder-one-click-cover",
    "2026-10-29-real-dxf-files-wall-framing-layer-flags",
    "2026-10-29-load-sensing-margin-flips-excavator-ranking",
    "2026-10-29-does-a-coder-cell-audit-transfer-to-naijasenti",
    "2026-10-29-did-four-european-stock-markets-get-more-volatile-together",
    "2026-10-29-rough-weeks-solar-boat-back-off",
    "2026-10-29-how-noisy-can-a-flight-test-be-for-an-adjustable-tail"
  ],
  "reverts": [],
  "fix_forwards": [
    {
      "sha": "ed3132d0a5c8d84a335e7bea998b615e1bec2d71",
      "at": 1793243441000,
      "title": "process: fix unresolved merge conflicts on main (ai-bookkeeper) and S-corp post frontmatter",
      "pr": 11276,
      "agent": "Claude Sonnet 5.5",
      "models": [
        "Claude Sonnet 5.5"
      ],
      "track": "process",
      "bullets": [
        "Resolve unresolved merge conflicts on main (ai-bookkeeper index and README) and add missing S-corp post frontmatter"
      ],
      "detail": null,
      "area": {
        "kind": "product",
        "name": "ai-bookkeeper"
      },
      "files": 3,
      "lines_added": 47,
      "lines_removed": 8,
      "added_files": [
        "prompts/runs/2026-10-29-session_01AcxTtJH9cSVTgJxRf9LYX1.json"
      ],
      "revert": false,
      "fix_forward": true
    },
    {
      "sha": "ce353e51db9d3c45aaae530aec23a4327d861272",
      "at": 1793265686000,
      "title": "redteam: check_markup_basics 2026-10-29",
      "pr": 11368,
      "agent": "Claude Sonnet 5.5",
      "models": [
        "Claude Sonnet 5.5"
      ],
      "track": "redteam",
      "bullets": [
        "redteam: check_markup_basics 2026-10-29 (signed tabindex fix, main() guards)",
        "redteam: run record"
      ],
      "detail": null,
      "area": {
        "kind": "platform",
        "name": "ci"
      },
      "files": 3,
      "lines_added": 267,
      "lines_removed": 1,
      "added_files": [
        "prompts/runs/2026-10-29-session_01E5sJKkSqvBHtCbp8iD1SSC.json"
      ],
      "revert": false,
      "fix_forward": true
    },
    {
      "sha": "d73d7b7b39ce3b2e95a1d279767c06f84f40449f",
      "at": 1793277049000,
      "title": "prompts: fix three run records that turned promptctl validate red on main",
      "pr": 11397,
      "agent": "Claude",
      "models": [],
      "track": "process",
      "bullets": [],
      "detail": null,
      "area": {
        "kind": "process",
        "name": "prompts"
      },
      "files": 3,
      "lines_added": 17,
      "lines_removed": 8,
      "added_files": [],
      "revert": false,
      "fix_forward": true
    },
    {
      "sha": "d1ba074a51b3157dd5fff1ede8c59660b4e08358",
      "at": 1793282017000,
      "title": "main is red: flagships changepoint next: over the cap, a dead /ventures/ link, ai-bookkeeper title and FAQ divergences",
      "pr": 11411,
      "agent": "Claude Opus 5.5",
      "models": [
        "Claude Opus 5.5"
      ],
      "track": null,
      "bullets": [
        "flagships: changepoint-detector next: back under the 2,000-character cap",
        "pages build: a post's dead /ventures/ link and an ai-bookkeeper page with no <title>",
        "ai-bookkeeper: FAQ JSON-LD matches the visible answers; market-vendor page gets share tags and structured data"
      ],
      "detail": "PR #11410 took it to 2,101 characters, so portfolio/router/validate.py fails on main and on every open PR.",
      "area": {
        "kind": "product",
        "name": "ai-bookkeeper"
      },
      "files": 7,
      "lines_added": 16,
      "lines_removed": 10,
      "added_files": [],
      "revert": false,
      "fix_forward": true
    },
    {
      "sha": "2a8f9643f98aa5b325630c598d433d28e16cb4b7",
      "at": 1793296780000,
      "title": "process: fix three run records failing promptctl validate on main",
      "pr": 11448,
      "agent": "Claude Sonnet 5.5",
      "models": [
        "Claude Sonnet 5.5"
      ],
      "track": "process",
      "bullets": [
        "process: fill pr/outcome on three run records that failed promptctl validate on main"
      ],
      "detail": null,
      "area": {
        "kind": "process",
        "name": "prompts"
      },
      "files": 4,
      "lines_added": 46,
      "lines_removed": 7,
      "added_files": [
        "prompts/runs/2026-10-29-session_01EhTJVNPh9GjdNX8JZhdFFq.json"
      ],
      "revert": false,
      "fix_forward": true
    }
  ],
  "biggest": {
    "sha": "0b80f7f9500913d2a3b29b50db4c3802f956d382",
    "at": 1793250533000,
    "title": "ci: one command for CI and local runs; drop 418 duplicate venture workflows",
    "pr": 11293,
    "agent": "Claude Opus 5.5",
    "models": [
      "Claude Opus 5.5"
    ],
    "track": "process",
    "bullets": [
      "ci: one command for CI and local runs; drop 418 duplicate venture workflows",
      "prompts: run record for the local-first CI pass",
      "ci: LocalContext test uses github.sha, which a depth-1 checkout can resolve",
      "Port main-red fixes from PR #11283: placeholder origin in a post, ai-bookkeeper FAQ JSON-LD",
      "gitops: regenerate the front-door shard count (55 -> 56 mounts)"
    ],
    "detail": "ventures-tests.yml now calls platform/ci/run_venture_tests.py, the same command a contributor runs (--changed locally, --since BASE in CI), instead of an inline shell loop.",
    "area": {
      "kind": "ci",
      "name": "CI and automation"
    },
    "files": 433,
    "lines_added": 918,
    "lines_removed": 20376,
    "added_files": [
      "docs/history/ci-local-first-2026-10-29.md",
      "docs/posts/2026-10-29-one-command-for-ci-and-your-laptop.md",
      "platform/ci/test_run_venture_tests.py",
      "prompts/runs/2026-10-29-session_01XpHqycYFxXKBVgZxGbJ3pU.json"
    ],
    "revert": false,
    "fix_forward": false
  },
  "runs": {
    "runs": 200,
    "by_track": [
      [
        "ventures",
        73
      ],
      [
        "research",
        44
      ],
      [
        "redteam",
        22
      ],
      [
        "polish",
        18
      ],
      [
        "process",
        17
      ],
      [
        "creative",
        12
      ],
      [
        "explore",
        10
      ],
      [
        "review",
        4
      ]
    ],
    "by_outcome": [
      [
        "success",
        180
      ],
      [
        "partial",
        19
      ],
      [
        "failed",
        1
      ]
    ],
    "by_model": [
      [
        "claude-sonnet-5-5",
        177
      ],
      [
        "unrecorded",
        17
      ],
      [
        "claude-opus-5-5",
        6
      ]
    ],
    "measured": 50,
    "api_usd": 35.23,
    "active_minutes": 215,
    "errors": [
      "Off-by-one column index overwrote data/dax-returns.csv; restored from git and re-derived",
      "Overwrote tracked experiments/gpt_quant/quant.py and deleted run.out by reusing an existing directory name via mkdir -p; restored with git checkout and moved my experiment to gpt_omega before any commit.",
      "bare python3 lacked numpy; first background run failed until pyenv.py found /usr/bin/python3.13",
      "main site build threw on a 169-char post description (found, fixed)",
      "default python3 lacks torch; CPU wheel index returned no versions, plain pip pulled CUDA wheels (~25 min) into python3.13",
      "auto-mode classifier denied editing .claude/hooks/check_posts_before_push.py as self-modification",
      "First bisection had inverted sign; fixed before commit",
      "irs.gov and state tax hosts unresolvable in this session (ENOTFOUND), so the flagship's sourced items could not be advanced",
      "NASA POWER refused by egress proxy",
      "site build threw on a 170-char post description on main",
      "First jscpd timing used a pattern relative to the wrong root and matched nothing (0.7 s, no report); rerun with **/*.mjs.",
      "/usr/bin/time is not installed in the container; timed with a /proc poller and then getrusage (tests/bench/rss.py). The poller under-reports peak memory for sub-second runs, so dupehound's memory figures come from getrusage only.",
      "sibling-links: shipped the page with no sibling link (caught locally before CI); fixed in the second commit.",
      "First draft of the post's description was 169 chars (limit 160), the defect the post itself reports; check_post_frontmatter caught it before commit.",
      "Committed a merge-conflicted stash into a local scratch worktree while rebasing the patch onto the moving PR head; caught by grep for conflict markers and redone before anything was pushed.",
      "Went idle about 6.5 h with #11317 green and mergeable: the wake that should have triggered the merge was for an older head, and no check-in was armed for the current one. The parent session's check-in caught it.",
      "A `git checkout HEAD -- model.mjs` while comparing totals discarded an uncommitted fix; caught by the failing test and re-applied before push.",
      "#11315 merged after another lane added generated size pages; its nail change left size-pages.test.mjs red on main until the next PR regenerated them.",
      "Pinned Playwright 1.56.0 (copied from browser-checks-ci.yml) in the new workflow; it cannot install Chromium on Ubuntu 26.04 runners. One red CI cycle; fixed by pinning 1.63.0.",
      "First post description was 164 chars (limit 160); caught by build.test.mjs and fixed.",
      "actions-continue-on-error-check was missing from DOWNLOADABLE_CLI_FILES, so its curl snippet would have 404ed; added, and the new test asserts it."
    ],
    "friction": [
      {
        "file": "research/CLAUDE.md",
        "n": 12,
        "issue": "No numpy or scipy in the default python3; the milestone analysis had to be stdlib-only, which pyenv.py advice does not mention for pure-analysis steps."
      },
      {
        "file": "prompts/polish/prompt-0.md",
        "n": 10,
        "issue": "Full site build takes ~20 minutes, not just over 120 s; the first monitors expired before it finished."
      },
      {
        "file": ".claude/hooks/check_posts_before_push.py",
        "n": 10,
        "issue": "Blocked the whole compound command (commit+push), so the fix in the same command never ran; run the fix and the push as separate calls. Main also carried a post (s-corp) with missing description/tags."
      },
      {
        "file": "portfolio/flagships.yaml",
        "n": 10,
        "issue": "ai-bookkeeper next: items all need outside real data; a no-outside-data slice (trade page) is not listed as an option, so I followed recent runs' pattern."
      },
      {
        "file": "prompts/redteam/prompt-0.md",
        "n": 5,
        "issue": "campaign on ventures/changepoint-detector/engine.mjs hit the 300s baseline timeout (~5 min wasted); --probe did not prevent picking it when --target is passed explicitly."
      },
      {
        "file": "prompts/process/prompt-1.md",
        "n": 5,
        "issue": "Only P059 (needs .claude/ edit) is the open agent row; prompt does not say to skip such rows, so critique mode was chosen."
      },
      {
        "file": "prompt.md",
        "n": 5,
        "issue": "Router said 43 merged runs since last review although E108 review landed today."
      },
      {
        "file": "prompts/research/prompt-0.md",
        "n": 4,
        "issue": "Most open programmes had sibling PRs or runs the same hour; claim checking cost several reads."
      },
      {
        "file": "research/PROGRAMMES.md",
        "n": 4,
        "issue": "sim2real-inference is blocked on data and its LOG repeats 'next' items; the programme table does not mark blocked rows, so the draw sent me there first."
      },
      {
        "file": "prompts/review/prompt-1.md",
        "n": 4,
        "issue": "measure took ~2 min in a shallow clone; reduced-pass steps otherwise clear"
      },
      {
        "file": "CLAUDE.md",
        "n": 4,
        "issue": "git push --force-with-lease failed with stale info on a branch that does not exist on the remote; plain push worked."
      },
      {
        "file": "prompts/ventures/prompt-2.md",
        "n": 2,
        "issue": "flagship 1 next: list is mostly trade-keyword blocks needing real data; switched to flagship 4 where public data was reachable"
      },
      {
        "file": "prompts/creative/prompt-0.md",
        "n": 2,
        "issue": "Says Hearth & Horizon has no BIBLE.md; one exists. Cost a few minutes."
      },
      {
        "file": "research/heavy-hydraulics/LOG.md",
        "n": 2,
        "issue": "Datasheet hosts (walvoil.com) reset connections; no sourced neutral pressure drop obtainable"
      },
      {
        "file": "prompts/promptctl.py route",
        "n": 2,
        "issue": "bare route ignored a scheduled prompt asking for revenue products (8 reports in 3 days); fixed with --task"
      },
      {
        "file": "prompts/promptctl.py",
        "n": 2,
        "issue": "route without --track drew 'ventures' for a user-directed writing task; a retrospective has no obvious track, chose process."
      },
      {
        "file": "prompts/explore/prompt-0.md",
        "n": 1,
        "issue": "Audit list is long; nearly every static-HTML sweep I tried was already clean, so finding an open one took several probes."
      },
      {
        "file": "prompts/process/backlog/P059-push-hook-diff-base.json",
        "n": 1,
        "issue": "Only open agent row needs a .claude/ edit the classifier denies; prompt-1.md does not route such rows to the owner."
      },
      {
        "file": ".github/hooks stop-hook",
        "n": 1,
        "issue": "The stop hook demands a commit of untracked/modified cache files while a background job is still appending to them, forcing several WIP commits."
      },
      {
        "file": "prompts/promptctl.py record",
        "n": 1,
        "issue": "a session id reused by a scheduled routine collides with an earlier run's record file ('already exists'); wrote a -2 file by hand."
      },
      {
        "file": "docs/posts/2026-10-29-flagship-tools-now-open-on-a-button.md",
        "n": 1,
        "issue": "another run's post has a 170-character description; check_post_frontmatter.py fails on main."
      },
      {
        "file": "research/_shared/pick_track.py",
        "n": 1,
        "issue": "Passing the programme slug as an argument crashes with ValueError (it expects a float draw); the printed hint gives no usage."
      },
      {
        "file": "docs/reports/polish-2026-10-29-site-scan.md",
        "n": 1,
        "issue": "Next-run list named shift-roster-builder/changepoint-detector as lacking a first-screen button; both already had one, costing an audit."
      },
      {
        "file": "research/marine-hull/LOG.md",
        "n": 1,
        "issue": "milestone 3 blocked on tank data for many runs; each run restates it; needs a reachable source or an owner-supplied table"
      },
      {
        "file": "ventures/saints-by-candlelight/PRODUCTION.md",
        "n": 1,
        "issue": "Target 5,500+ words but the check-script minimum is lower (spoken words 5,056 pass); the two figures count differently and cost a re-read."
      },
      {
        "file": "research/llm-coding-inference/LOG.md",
        "n": 1,
        "issue": "6ai's Next step (second common category on another corpus) needs a torch+model LLM run unavailable here; used cached NaijaSenti scores instead. h3_llm_width imports numpy, absent from bare python3 (python3.13 has it)."
      },
      {
        "file": "ventures/*/llms.txt",
        "n": 1,
        "issue": "Several llms.txt files and ventures/README.md still name the retired monorepo-projects host; build.mjs rewrites it on publish, so the served files are fine, but writers copying links from source get the wrong host."
      },
      {
        "file": "ventures/wall-framing-takeoff/llms.txt",
        "n": 1,
        "issue": "Says 'no valleys' while the README describes valleys for cross wings."
      },
      {
        "file": "ventures/sales-agent/llms.txt",
        "n": 1,
        "issue": "40-reply set figures (24 named, 17 right) differ from the README table (23 named, 16 right)."
      },
      {
        "file": "platform/ci/check_post_frontmatter.py",
        "n": 1,
        "issue": "Did not check seo_title length, so three posts over the 70-char budget reached main and broke writing.mjs (every site build). Added the check."
      },
      {
        "file": "platform/pages/check.mjs",
        "n": 1,
        "issue": "The llms.txt date rule (6c847325) assumed 'no file dated' means 'no git history'; a partial (3,000-commit) history dates only some products, so every main deploy failed from the day it landed (109 problems on main). Fixed in build.mjs/lastmod.mjs: shallow builds stamp 'on or before <history start>'."
      },
      {
        "file": "research/aerolog-scaling/experiments/*/run.py",
        "n": 1,
        "issue": "scripts must run from research/aerolog-scaling (relative paths), not stated in the run header; first launch from repo root failed on import."
      },
      {
        "file": "prompts/ventures/prompt-1.md",
        "n": 1,
        "issue": "venture-preflight and run_venture_tests both exceed 120s; the output file of a background job mixed with an earlier command's output."
      },
      {
        "file": "platform/pages/check.test.mjs",
        "n": 1,
        "issue": "Tests used .wasm as the example of an extension nothing serves; adding the first WebAssembly asset broke three of them. Switched the example to .glb."
      },
      {
        "file": "prompts/runcost.py",
        "n": 1,
        "issue": "--human-hours is optional on attach; only 46 of 1,930 run records after 2026-10-20 carry an estimate, and none of ai-bookkeeper's 62, so project-size bars can't be measured from the records"
      },
      {
        "file": "platform/pages/writing.mjs",
        "n": 1,
        "issue": "Posts from other sessions with over-long descriptions turned every PR's Pages build red twice in one day; the pre-push hook catches only the pushing session's own posts."
      },
      {
        "file": "platform/privacy/browser-signals.mjs",
        "n": 1,
        "issue": "A usage recorder that needs an event argument reads as undrivable; the checker's call shapes are not documented next to the recorder pattern."
      },
      {
        "file": "platform/ci/validate_workflows.py",
        "n": 1,
        "issue": "Invariant 7's remedy said 'copy a sibling', which grew 802 per-venture copies of one node --test job that ventures-tests.yml already ran; now points at ventures-tests.yml and invariant 8 rejects copies."
      },
      {
        "file": "PRODUCT_PLAYBOOK.md",
        "n": 1,
        "issue": "Checklist said validate_workflows.py requires a <slug>-ci.yml for any venture with tests; untrue since ventures-tests.yml (2026-10-16). Rewritten."
      },
      {
        "file": "prompts/runs/*.json",
        "n": 1,
        "issue": "Redteam records leave merged, lines_added and tests_added null in nearly all 294 runs (merged true in 2), so blue-team output had to be derived from mutant triage rather than the summary fields."
      },
      {
        "file": "(overnight lane prompt)",
        "n": 1,
        "issue": "Lane coordination asked for read-only audit until PR #11268 merged; its branch got several commits while waiting, so the prepared patch needed two manual re-bases. Keeping the work as a patch in the scratchpad (not a pushed branch) worked."
      },
      {
        "file": "ventures/shed-designer/README.md",
        "n": 1,
        "issue": "Stated totals and piece counts (and shed-plans-with-cut-list.html's '144 pieces from 93 boards, $2,166.66') drift from the model on every pricing change; nothing pins them to estimate()."
      },
      {
        "file": "platform/ci/run_workflow_locally.py",
        "n": 1,
        "issue": "--for-changes diffs against a newer origin/main in a shallow clone, selecting 94 workflows for a one-file docs change; not usable to verify a small PR."
      },
      {
        "file": "portfolio/usage/README.md",
        "n": 1,
        "issue": "Gave the dead /monorepo-projects/ site URL; fixed."
      },
      {
        "file": "portfolio/ledger/decision_queue.py",
        "n": 1,
        "issue": "Row pages-custom-domain still cites /monorepo-projects/; left for the ledger owner."
      }
    ],
    "notes": [
      "heavy-hydraulics milestone 5a. One prediction refuted narrowly (10.01% vs 10%). No agent doc written.",
      "Sales-agent M8a CRM write-back; agent test 12/12 locally. Endpoint shapes from memory, flagged as unverified. venture-preflight not run (no new venture; self-host module only).",
      "Idea: sweep venture HTML for unlisted defect classes. Clean: href=# handlers, form buttons without type, relative imports (10,427), label/ARIA refs (13,258). Shipped check_aria_refs.py as a CI guard.",
      "; also shortened a 178-char post description from #11250 that failed check_post_frontmatter and blocked pushes",
      "Local checks: kth_inflate.py ran, research/_homepage/build.py ok. Predictions were not pre-registered (stated as exploratory).",
      "Merged PR #11407 with a post description of 162 chars (limit 160) because the merge call ran in parallel with a push the hook blocked; fixed in follow-up PR.",
      "Scanned 3,490 built pages (title, description, h1, canonical, og, alt) and screenshotted hub and ai-bookkeeper at phone and desktop. Only finding: flagship first-screen lacks a CTA at 390px.",
      "No new blog post: small SEO-metadata change, report written instead.",
      "Flagship 4 changepoint-detector: log refit tested as shape-vs-shock; negative result, test passes (node --test drift-warning-log.test.mjs). Full venture-preflight not run (no page change).",
      "Critique mode from friction table; main_health 27/27 green. Backlog ids touched: none (P059 blocked on .claude/ edit).",
      "Campaign on changepoint-detector baseline timed out (no mutants). Campaigns on wash-sale-checker/calc.mjs and etsy-profit-calculator/calc.mjs: 16 seeded, 9 caught (56%), 7 gaps closed with tests, 100% after fix. No real defects found.",
      "Project hearth-and-horizon; piece where-the-pump-coughs (text only, audio 423 MB over cap). Caught and fixed date/arithmetic slips in own draft on re-read (weekdays, years, level timeline).",
      "Analysis-only milestone 6f; no new training. Checks run: research/_homepage/build.py ok, check_md_links ok. Deviation from the 'post per PR' default: none written.",
      "Record never filled in (4.6 min run, no PR, no writeups); outcome set to failed by a process run on 2026-10-29 so validate passes.",
      "Explore idea: CI sweep for third-party resource loads in venture pages; 1 hit (Google Fonts, retail-pilot-intel portal), fixed. Local: 5 unit tests pass, check exits 0 on tree.",
      "Project saints-by-candlelight, episode 54 monica-and-the-window-at-ostia, text only (audio 423 MB over 400 MB cap). Episode tests 10/10.",
      "Ran h6af locally (stdlib, ~minutes) after coding two categories with Qwen2.5-1.5B (about 31 min each). Two of five predictions refuted narrowly; logged.",
      "Fixed the previous polish run's top item (3-line breadcrumb on phones). CTA on flagship first screen still open.",
      "Small flagship slice (league-schedule-generator calendar CSV). calc+page tests 217 pass locally. Did not rewrite flagships next: (its open item needs a real league's travel times). No agent doc written.",
      "share.mjs campaign: 8 mutants, 7 caught, 1 equivalent. Red baseline of sync_tree_counts.py traced to sales-agent dead link; fixed with a page test. Catch rate 7/8 before, 8/8 after triage.",
      "Drew free-choice; advanced heavy-hydraulics milestone 2e. Ran 6 project tests, programme_check ok, homepage build ok. Cloud run, did not run full CI locally.",
      "Ran cad params unit tests only; build123d absent so CAD tests skipped.",
      "Full ai-bookkeeper node suite 1926 pass 0 fail. Tattoo fixture 5/13 suggested before rules, 13/13 after; tuned on fixture. Did not rewrite flagship next:, run venture-preflight or runcost attach.",
      "Full ai-bookkeeper node suite 1889 pass 0 fail. Daycare fixture 7/14 suggested before rules, 14/14 after; tuned on fixture. Did not rewrite flagship next:. Did not run venture-preflight or runcost attach.",
      "Flagship 4 slice: drift warning hints --ar1; 124 local tests pass, new eval reproduces. No agent doc in docs/reports (nothing the next run needs beyond flagships next:).",
      "Backlog ids touched: none (P059 skipped: needs .claude/ self-modification). main_health 29/29 pass. Fixed pick_track.py ValueError on non-numeric draw.",
      "Ran only the new node test locally; CI not awaited. Initial miscount of null cells (2 vs 3 of 4) caught by the test and fixed.",
      "Local: node --test fuzz-build.test.mjs 6/6 pass. No agent doc written.",
      "Added figure.py and paper/check_numbers.py to heavy-hydraulics; homepage build ok, md links ok. No new experiment.",
      "Exploratory, no pre-registered predictions; pytest unavailable so unit tests not run; 25 bar row reproduces 2i.",
      "main_health.py found 3 red checks (conflict markers in ai-bookkeeper index.html and README.md, S-corp post missing description/tags); fixed keeping both sides; checks and 29 node tests pass. No backlog ids touched. Cause: unresolved conflicts merged by overlapping ai-bookkeeper PRs; the conflict-marker check is not blocking merges.",
      "Local: eu-markets.test.mjs 3 pass. Wikimedia pageviews API 429 and out of range for 2012; closure-series item stays open.",
      "Milestone 6b of marine-hull; one of three predictions refuted. Cost attach skipped.",
      "Idea: sweep for untyped buttons, href=#, missing rel=icon. All clean; only a skip-list line shipped. No build found in this run; explore skip list is long, next run should build.",
      "Target platform/ci/check_code_refs.py: 8 seeded, 6 caught, 2 escaped both equivalent (maxsplit with [0] index). No real defects found in a short hunt. Record-only PR; no code change.",
      "Also shortened another run's over-length post description so validate passes.",
      "Project: hearth-and-horizon, piece: boil-it-once (Hearth & Horizon, text only; audio 423 MB over cap).",
      "Milestone 6d of lowcomm-training: 12 runs; omega prediction within 0.005 nats vs p-only 0.017-0.112. Homepage build ok, md link check ok. No agent doc in docs/reports (nothing new for the next run beyond the LOG).",
      "Officials box on multi-division page; not click-tested in a browser.",
      "marine-hull milestone 6a; homepage build ok, md links ok. CI not awaited locally beyond these.",
      "Creative track, hearth-and-horizon, slug the-detector-in-the-laundry (radon, text only; audio 423 MB over the 400 MB cap). No agent doc written.",
      "Scheduled run; drew lowcomm-training. Chose a short no-training step (cite_check all 16 proposal ids + 6 robust-aggregation ids; related work paragraph) rather than a 45-minute training run. Milestone 6 scale-up remains.",
      "Milestone 9f: noise in identified short-period frequency. Predictions 1,3 held, 2 refuted. Paper draft not yet updated for 9c-9f. Homepage build ok.",
      "Local checks: research homepage build ok, md link check ok. No pytest run (experiment script reuses tested modules).",
      "Milestone 6b of lowcomm-training: 12 GPT runs, H6b-i and H6b-ii supported, caveat that additive rule is also within 0.02. Homepage build ok.",
      "Ran scorp-property.test.mjs locally (2 pass). Did not run full venture suite or venture-preflight (test-only change).",
      "hanger-3dradius: radius caps 10/15 cm, 8 seeds, no gain over 6 cm. Tests, homepage build, programme_check pass locally.",
      "divisions.test.mjs 52/52, page.test and usage.test pass locally. flagship next: unchanged (still a real league's travel times).",
      "Flagship 2 (wall-framing-takeoff): Move tool in plan sketch. node --test page/sketch/usage: 46 pass; eval-sketch-click.mjs all ok.",
      "Ran node --test realtor.test.mjs restaurant.test.mjs (4 pass). venture-preflight not run.",
      "Reduced pass: steps 1 (derive fetch/build, friction section), 7, 8 and one step-5 fix. No audit or drift report. validate ok.",
      "Hearth & Horizon, slug the-candles-breathe; text only (audio 423 MB > 400 MB cap). CO2 model checked in a script.",
      "Negative result: multiplicative refit separates only UK gas. CI not waited on; local eval run only.",
      "Programme heavy-hydraulics milestone 6: first paper draft from landed results, no new experiment. Checks: homepage build ok, md links ok.",
      "Milestone 6c: 12 runs; H6c-i and H6c-ii supported. Local check: research/_homepage/build.py ok.",
      "Creative track, Hearth & Horizon, slug the-hall-with-the-doors-shut. Text only: audio 423 MB over the 400 MB cap. Fixed own weekday and sum errors before commit.",
      "4 campaigns (check_duplicate_ids, check_duplicate_symbols, slug_dupe, check_html_is_html), 26 mutants, 25 caught; 1 gap (default --root of check_html_is_html) guarded. Hunted check_duplicate_ids: ids inside <template> are flagged as duplicates (arguably a false positive, left as is). No blog post: small run.",
      "Slice: OH vendor discount preset. tax.ohio.gov 404s through proxy; figures from search excerpts. Local: node --test salestaxreturn.test.mjs 49 pass. venture-preflight not run (small change to existing code).",
      "wall-framing-takeoff schedule: holidays and weatherDays. schedule.test.mjs 8 pass; page.test and cli.test 57 pass. venture-preflight not run (engine-only change).",
      "Ran cli.test.mjs (26 pass). Did not run venture-preflight or the full suite, and did not rewrite flagships next:. Merged on local checks only.",
      "Idea: sweep for relative fetch() of missing local files; tree clean, shipped as CI guard check_local_fetch.py with tests. No agent doc written.",
      "ai-bookkeeper niche page slice; full node suite 1864 pass. Rules tuned on a made-up fixture. Skipped venture-preflight and the run-workflow-locally check; CI is the check.",
      "Explore idea: ai-bookkeeper home-inspector page and payee rules. Venture suite passes locally.",
      "Milestone 3 retried: eprints.soton.ac.uk 401, jtse.utm.my reset. Paper skeleton from logged results, no new numbers. build.py ok, md links ok.",
      "Milestone 5k; local checks: research homepage build ok, check_md_links ok. Plan sentence reworded after run, disclosed in LOG.",
      "Little Lamps story zita-and-the-bread-in-the-oven; text only, audio 423 MB over the 400 MB cap. node --test 11/11 in hearth-and-horizon.",
      "Creative track, hearth-and-horizon, slug the-stack-that-sweats; text only (audio 423 MB > 400 MB cap). Shelf tests 11 pass. Note: a freezer-outage story already existed, so topic changed to hay self-heating.",
      "Ran divisions.test.mjs only (about 100 s); venture-preflight and full CI not run locally.",
      "creative: hearth-and-horizon, slug the-warm-stack; text only, audio over cap",
      "Milestone 2f; ran script and tests locally, build.py ok, link check ok. Experiment was not pre-registered (said so in LOG).",
      "Record left unfilled when #11398 merged; outcome and pr filled in by a later run (session 01E5sJKkKmkfNAD4mmYgswCg) from the commit on main so promptctl validate is green. Other fields not known.",
      "Flagship 2 slice: sketch openings move/resize. sketch+page tests 41 pass; eval-sketch-click.mjs all ok. No separate agent doc; README holds the detail. venture-preflight not run.",
      "Creative track; Saints by Candlelight episode 53, paul-and-the-fourteen-nights-before-malta, text only (audio 423 MB, over the 400 MB line). Checks: generate.mjs --check-script ok, node --test 12 pass.",
      "Milestone 6ah: pilot-estimated allocation over coder cells; negative result (coverage 49-84% at n=400). Local checks: homepage build ok, md links ok, live links ok, 15 tests pass.",
      "3 campaigns on platform/ci checks (social_proof, inline_scripts, heading_order). 21/24 pre-fix catch; 2 gap tests added, 1 equivalent. No real defects found. No blog post: small run.",
      "Build broke on main from therapist-bookkeeping post. Full build and visual pass not completed this run.",
      "marine-hull 5j: 3 predictions committed to LOG before run; 1 held, 2 refuted. build.py ok, md links ok.",
      "Critique mode (no agent-owned open backlog item). main_health 27/27 pass. #11273 check runs: validate and check failure at merge; one-line guard added to land-your-work.md. Backlog ids touched: none.",
      "Flagship 4 (changepoint-detector): swept all 30 Ansett series; node --test ansett-sweep.test.mjs passes.",
      "Negative result on changepoint-detector drift warning; no code change to the engine. Only the eval script ran locally; CI not run.",
      "marine-hull 6c; plan mislabelled spell=1 as iid, corrected in the log. Local checks: homepage build and md-link check.",
      "Fuzzed xls/xlsx/pdf readers; fixed .xls OLE stall; test fails without fix. CI not awaited; xls/xlsx tests run locally 14/14. No agent doc written: nothing the next run needs beyond README Next.",
      "Milestone 6ae; predictions logged before run; all held. Did not run claim check/pick_track CLAIM CHECK or cite_check (no new citations). Initially created a local branch by mistake, deleted it, used the designated branch.",
      "journey check needs network (tunnel blocked); other checks ok. Also fixed over-long seo_title on main.",
      "Targeted platform/ci/check_post_frontmatter.py; 8 mutants, 7 caught, 1 equivalent (bad counter only tested for truthiness). No real defects found; no code change.",
      "Project: hearth-and-horizon; slug the-slowest-chair-on-the-hill; text only (audio 423 MB).",
      "Picked league-schedule-generator (flagships 1-5 had heavy same-day activity). node --test fuzz-build.test.mjs 7/7; mutation run 3 seeds 0 missed. Preflight not run (no page change).",
      "Small slice: Ohio quarterly due-date test in ai-bookkeeper; state table already complete; node --test salestaxreturn.test.mjs 50/50 pass. Did not rewrite flagship next: (no item replaced).",
      "Local checks: autorepair, probe-trades3, page tests pass. Venture preflight not run.",
      "A parallel run landed a different 6d during mine; renamed mine to 6e at merge.",
      "post_rate.py 8/8 caught, no real defects (--days 0 empty table is pinned by an existing test). wait_for.py 6/8 caught; 2 gaps fixed, rerun 8/8.",
      "Red baseline on shorts.mjs traced to two research posts merged with over-long seo_title; shortened both. Campaign on platform/pages/audiences.mjs: 7/7 mutants caught. loadPosts strict path already guards this class in PR CI.",
      "Target platform/pages/rates.mjs, 8 mutants, 4 escaped, all triaged gap, 5 behavioural tests added; rates.test.mjs 56/56 pass; catch rate 0.5 -> 1.0. No real defects found. No agent doc: nothing the next run needs beyond the record.",
      "Small slice: a test pinning the year-boundary due-date roll and a no-weekend sweep over every state, frequency and year 2026-2028. No code change. State tax sites (revenue.pa.gov) returned 403 through the proxy, so no new preset could be read from a primary source. flagships.yaml next: left unchanged.",
      "aerolog-scaling 9e: predictions logged first, all held. Local checks: homepage build ok, check_md_links ok. Tests not rerun (no source change).",
      "Milestone 6ai of llm-coding-inference: floor and independent pilot for coder-cell allocation; two of four predictions refuted. Ran research/_homepage/build.py (ok). No separate agent doc; LOG.md carries the outcome.",
      "Reduced pass: steps 1 (measure only, no derive), 3, 7 and one step-5 fix. No blog post: process-only review; owner-facing writeup not warranted.",
      "ledger.mjs campaign: 8 mutants, 4 escaped (3 gaps closed by one cashFlowByMonth test, 1 equivalent). No real defects found.",
      "Backlog ids: P059 filed (open). main_health 27/27. validate and unittest pass.",
      "Idea: unlisted accessibility sweep over 1,328 venture pages; four email inputs fixed, rest clean. Small payoff; sweep kinds now known clean. Pre-existing 161-char descriptions in two other posts fail check_post_frontmatter (not mine).",
      "Owner-directed run: a 16-post 'Start here' onboarding series (hub, a 'bring an idea' pitch: free AI development, MIT, run it for profit, honest limits; one post per flagship and per audience). New blog topic 'start' (tag start-here). $8,000/month compute is the owner's figure from the session message, not in any repo file. Checks run here: check_post_frontmatter.py exit 0; post_similarity.py --min 0.25 no start-here pair; check_md_links.py no dead links in 4948 files; node --test platform/pages/writing.test.mjs 21/21; test_check_post_frontmatter 17/17; writing.mjs build wrote 1173 pages with a 'Start here' chip of 16. Also fixed main's broken deploy: 4 overlong seo_titles (one merged mid-run) and the llms.txt date rule on shallow history. Local proof: depth-60 clone, node build.mjs + node check.mjs went from 1,311 problems to 'looks publishable: 1320 products, 5567 pages, no dead links'; full platform/pages suite 1334/1334.",
      "Synthetic 195-month null, 40 seeds. node --test drift-warning-null195.test.mjs passes (74 s). No agent doc: the README section carries the finding. Real-data items in flagships need blocked hosts or owner data, so took the synthetic-null item.",
      "Milestone 9d; pyenv install took ~6 min; homepage build ok; check_numbers ok.",
      "Explore idea: orphan-page sweep of the built site (pages with no inbound internal link). Found 22, linked them from product indexes, added platform/ci/check_orphan_pages.py. JSON-LD validity and relative-link sweeps were clean first.",
      "Target platform/privacy/browser-signals.mjs: catch rate 3/8 -> 7/8 after adding CLI exit-code tests (root via argv[2]). One escape (entry guard inversion) is undetectable in-file.",
      "sketch.test.mjs and page.test.mjs 44/44 locally; full CI not run here.",
      "No agent doc written; nothing the next run needs beyond the README Next entry.",
      "Full ai-bookkeeper suite 1938 pass locally. Did not rewrite flagships next:; venture-preflight not run (page-only addition).",
      "Explore idea: seeded property/fuzz test of wall-framing-takeoff sheathing tiling. 1,200 layouts, no bug found. In-page anchor/duplicate-id sweep over 3,194 html files also clean (not shipped). No agent doc written: nothing for the next run.",
      "Target seller-net-sheet/transfer-tax.mjs; catch rate 3/8 -> 8/8 after two added tests. No real defects found in a short read (hunt was brief). No blog post: small hardening run. The targets --probe listing showed two research files with a red baseline (surface.py, widerweb.py), probably missing deps, not investigated.",
      "marine-hull 5m; predictions logged before run; build and link checks ok; CI not waited on.",
      "Critique mode (only owner rows and blocked P056 open). Fixed push-hook false positive via three-dot diff. No backlog ids touched.",
      "Neutral result: drift warning fires 7/8 on trending real series; flagship next: updated.",
      "Target sep-ira-vs-solo-401k-calculator/calc.mjs. 8 mutants, 3 caught (37.5%); added 4 tests, 4 gaps now caught, 1 equivalent (age default 0->1). Catch rate after fix 87.5%. No real defects found. No blog post: small guard-only run.",
      "wall-framing-takeoff: levelTrace/traceCorners, Straighten/Plumb buttons. sketch.test 15/15, eval-sketch-click ok, run_venture_tests wall-framing-takeoff passed (191s). Venture-preflight not run.",
      "league-schedule-generator flagship slice; divisions.test.mjs+page.test.mjs 100 pass; venture-preflight and CI-equivalent local checks not run; no agent doc written.",
      "Flagship 2 slice: scarf allowance in trim.mjs; trim/cli/page tests 62 pass. Two of my own hand-arithmetic test expectations were wrong first and corrected.",
      "cite_check DOI failure was a proxy 403, not a bad reference. Build ok, md links ok.",
      "No new blog post: a one-line build fix; no reader-facing finding. Local check.mjs not conclusive (shallow clone dates).",
      "Full ai-bookkeeper node suite 1902 pass 0 fail. Therapist fixture 6/14 suggested before rules, 13/14 after (Amazon blank by design); tuned on the fixture. See PR for suite output.",
      "Process draw. main_health 27/27 green. P059 was half-stale (three-dot diff already landed in #11297); rewrote it to the real remaining gap (hook judges the pre-edit tree of an edit&&commit&&push command). Editing .claude/hooks was denied by the auto-mode classifier as self-modification, so the fix is specified in the backlog item, not shipped. All 10 flagships' open items wait on real-world data, so no product slice was reachable offline in this run.",
      "shootflow cull (folder cull, XMP sidecars, HTML/JSON report). Also fixed main's red validate/build: 3 flagship next: blocks over 2000 chars, a 172-char post description, a missing tab icon on ai-bookkeeper/tax-calendar.html. Pre-existing local failure: test_workspace_health unreadable_render_input (fails on clean checkout as root).",
      "main_health 27/27 green; promptctl unittest 68 OK; validate OK. Added route --task keyword inference.",
      "Campaign on client-concentration-risk-analyzer/cli.mjs: 4/8 caught; added tests for usage exit codes, --months 121, percent 100.5 and JSON 4-decimal rounding; rerun 8/8. quote-margin-check probe 'red' was missing pytest, not a defect. No real defects found.",
      "Full ai-bookkeeper suite 1998 pass locally. Niche page on a synthetic fixture, same pattern as prior runs; no real farm export.",
      "landscaping.test.mjs 2/2, page.test.mjs and cleaning.test.mjs pass (29 total); JSON-LD parses.",
      "Tests: run_venture_tests ai-bookkeeper 0 failed; headless Chromium check. State sites blocked by proxy; 2027 rev proc not out.",
      "main_health 27/27; page+sketch tests 41/41; eval-sketch-click.mjs passes incl. reload checks.",
      "Unit tests tests.test_cull: 7 pass. Not run on a real shoot.",
      "wall-framing-takeoff plan sketch editor. Checks run locally: sketch.test.mjs 6/6, run_venture_tests.py wall-framing-takeoff pass, eval-sketch-click.mjs 6/6 in Chromium. venture-preflight not run.",
      "Added optional webhook alerts (Slack/Discord/ntfy/json) to the shift-roster-builder self-hosted hub. server.test.mjs 15/15 pass (2 new, injected fetch; no live webhook). venture-preflight and the full workflow set were not run here.",
      "Tested wall-framing-takeoff's IFC reader on KIT FZK-Haus (downloaded from a public GitHub raw URL, not committed, licence unclear). Found multi-storey merge bug, fixed per storey. Venture suite via run_venture_tests.py passes (36 ifc/cli tests). venture-preflight not run.",
      "Wedding DJ/planner/florist page, 2 rules, fixture, test. ai-bookkeeper suite run locally. Venture-preflight not run (page-only addition). Did not rewrite flagships next:.",
      "Niche page on a synthetic fixture, same pattern as prior runs; no real notary export. Fixed an older bare 'notary' rule filing dues, E&O, stamp and commission as legal fees. Routed to creative; deviated to a revenue product per the scheduled prompt.",
      "node --test on korea, the new page and the hub test: 17 pass. Page is written from memory of secondary summaries and says so; NTS sources unread (not fetched).",
      "wall-framing-takeoff: attic eave baffle count; node --test insulation+cli tests pass (33).",
      "Ran main_health.py: 28/29 ok; fixed the one red check (three run records with null pr/outcome from other sessions). Small fix only; no venture work this run.",
      "Added make-size-pages.mjs (13 SEO pages + index, numbers from buildShed/estimate), size-pages.test.mjs drift test, sitemap/llms/README/index links and a blog post. Chose this over single-slope roofs (about 150 gable-specific sites across model/drawings/render/checks) as a bounded slice; single-slope roof remains the biggest consumer gap.",
      "Trace-over picture with two-click scale for wall-framing-takeoff: fitTrace and rescaleTrace, page controls, README, flagships next trimmed to cap, blog post. main_health 27/27. Duplicate persistence work found at merge time; branch rebuilt on main.",
      "redteam on platform/ci/check_table_headers.py: 5 mutants, 3 caught (0.6); 2 gaps (wrong ROOT depth, clean exit code) closed with 2 tests, rerun 1.0. No real defects found.",
      "aerolog-scaling milestone 9f: Monte Carlo of noisy mode identification; python3 needed /usr/bin/python3 for aerosandbox; research homepage build ok.",
      "Fixture sweeps for ai-bookkeeper and other flagships were saturated (README says so), so took flagship 7. Added tools/opencv_face_detector.py (OpenCV 4.x Haar; 5.x has no CascadeClassifier). Checked on skimage astronaut/coffee/camera/chelsea and a blurred eye-band proxy; no real blink photos. Unit tests: test_faces + test_opencv_face_detector pass (cv2 test run under python3.13).",
      "Landed a call-out churn bench, a guide page and a blog post. Ran only the new page test (passes, 30 s). Full venture suite and venture-preflight not run. Did not touch the flagship's open solver milestone (branch-and-price), so outcome is partial. flagships.yaml next: unchanged.",
      "main_health 27/27 before change; local html/jsonld/llms/md/post checks pass; cleaning.test.mjs 2/2.",
      "195-month euro factory-orders series: warning fires 4/4 with 16-22 steps; length did not help; README, SOURCE.md, test, post. Full changepoint suite ran in background.",
      "Playwright 390px check over http; league tests 173 pass; shift-roster and sales-agent have no deploy/calc test files; full site build not run.",
      "Niche page on a synthetic fixture, same pattern as prior runs; no real vending export. Fixed an older rule filing machine parts as meals.",
      "Another session landed sketch persistence (#11350) while this one built it; rebased onto main and kept only restoreSketch validation of stored data. sketch.test.mjs 11/11, eval-sketch-click.mjs all ok.",
      "dupehound --normalize (CLI, wasm, page). cargo fmt/clippy/test and node tests pass; venture-preflight and CI not run locally. Whole-tree 40.55% -> 60.41% duplicated, unlabelled.",
      "Targets terms.mjs (6/8 caught) and invalid.mjs (0/8: the shipped browser script was never executed by a test). Added a fake-DOM harness running the module in vm; found and fixed a real bug: row-scope matching ignored abbreviation expansion (ft vs feet).",
      "Small trade-vertical slice following the notary pattern; rules tuned on a made-up fixture, no real export. Ran foodtruck.test.mjs and page.test.mjs (27 pass). Own arithmetic slip in costs caught by the test.",
      "Explore: niche page + BUILT_IN rule for wholesale food stores/ingredients/packaging, fixture, test, post. Full ai-bookkeeper suite 1877 pass. Rules tuned on one made-up fixture; no real export.",
      "Counts from GitHub search on 2026-10-29: 9,783 merged PRs (Aug 2,125, Sep 2,763, Oct 4,895), 1,057 closed unmerged; repo created 2026-07-28. Usage from portfolio/usage/site-visits.json (two days). Other figures cite docs/history, docs/reports, docs/parallel-agents.md. check_post_frontmatter.py and post_similarity.py clean for the new post. No code changed, so no CI-reachable tests beyond post checks.",
      "Local checks before push: cargo fmt --check, cargo clippy -D warnings (native and wasm32), cargo test (12, incl. brute-force cross-check run at 400 rounds once), node --test web/dupehound.test.mjs page.test.mjs usage.test.mjs (14 pass), node --test platform/pages/check.test.mjs (99 pass), validate_workflows.py, publish_surface.py --write, router validate, decision_queue --check, clauses.mjs dupehound, check_post_frontmatter, check_md_links. Page exercised in headless Chromium: example and a real folder pick, no console errors, only same-origin requests, no horizontal scroll at 375 px. After the first push: sibling-links-ci failed locally (dupehound was a crawlable orphan); paired it with npm-lockfile-duplicates-check both ways, with tests. readme_titles flagged the bare-slug README title; fixed. Ran check_md_links, check_code_refs, checklist_coverage, research/venture live links, readme_titles, conflict markers, prompts validate: all exit 0.",
      "Local checks: every prompts/test_*.py passes under unittest (pytest absent). Figures in the post come from `python3 prompts/runcost.py report` on 2026-10-29. CI `test` (platform/pages) was red on main's content: faq-visible found FAQPage JSON-LD answers on ai-bookkeeper/tax-calendar.html and trainer-bookkeeping.html that differed from the visible copy (arrived with #11274/#11276). Fixed here by setting the JSON-LD to the visible text; faq-visible.test.mjs 4/4 and ventures/ai-bookkeeper/page.test.mjs 25/25 pass locally.",
      "New venture shed-designer, built and reworked over many owner feedback rounds in one session. Verification: 78 node tests in the venture; typecheck 0; every page-level step of portfolio-validate.yml run locally; gitops tests 603 pass locally; Pages site build ok locally; driven in headless Chromium at 1300 and 390 px with no console errors or horizontal scroll. CI green on 8011b086 and 05563c9c before the last main merge. Main was red twice from other sessions' post descriptions; fixed forward once (main later fixed it too and its version was kept). Next directions from the owner: truss roof vs ridge beam, usable volume vs cost, Colorado snow loads vs code minimum, decks/gazebos/coops on the same engine.",
      "PR #11311: cut optimizer solves the cutting-stock LP by column generation; over 51 designs / 257 cut lists orders fall $36,041.76 -> $35,766.03 and the shown bound rises $33,648.81 -> $35,614.35 (gap 7.1% -> 0.4%; 171 proven optimal). Brute force on 60 small cases: new optimal 60/60, old 55/60, bound never above optimum. Side effect: default auto overhang 9\" -> 6\" (9\" now costs $2.87 more in 2x6). Summary now compares cut-sheet cost, not lumber with spares, with the bound. Checks: run_venture_tests shed-designer pass; typecheck 0 diagnostics; check_post_frontmatter pass. Audit (read-only, before #11268 merged) also found: plans/cut sheet/build prints were blank (print CSS hid <main>), overall wall dims under the title block, rafter cut-length dim drawn 1.8\" short, roof line wrong on connector seats, only 11/33 marks lettered on sheets; fixes follow in later PRs. ezdxf 1.4.5 audit of the DXF from all 7 presets: 0 errors. run_workflow_locally --for-changes: all run: steps passed except pages.yml's two built-site checks, which fail locally only because its 'Build the site' step is skipped there (no _site); GitHub CI is the check of record for those. Second PR #11314 (plans fixes + plans.test.mjs) opened alongside. PR #11311 merged. PR #11314: plans print (was blank), fit the page, rafter long-point dim, connector-seat roof line, every mark lettered; plans.test.mjs 7 tests, 6 fail on main; venture tests 97 pass after merging main. PR #11314 merged. Third PR: cut sheet groups identical boards (printed cut sheet 6 -> 2 pages, checked by PDF page count in headless Chromium), cut colours print, trim offcut allows kerf, CSV grouped, site-built door step names its marks; lane report docs/reports/shed-designer-overnight-lane2.md. Tried iterated LP rounding: $32 over 257 lists at up to 240 ms each, not shipped. PR #11319 merged. Fourth PR: floor and roof sheet counts rip narrow rows (last floor row, ridge course) into strips from shared sheets (sheetCount2d); default roof 6 -> 4 sheets, 8x12 classic roof 6 -> 5, 10x12 floor 5 -> 4, never below area; marketing page table and README figures refreshed against the tool. Merged main into #11320 (llms.txt conflict with the size-pages lane; kept both lines); regenerated the 13 size pages with make-size-pages.mjs; the sheet count takes the lower of strip ripping and 1-D length packing (both cuttable), so no size's total rises.",
      "549 -> 131 workflows (418 node --test-only per-venture copies removed; invariant 8 blocks regrowth). ventures-tests.yml now runs run_venture_tests.py, the same command used locally; run_workflow_locally.py resolves PR base/sha/workspace/runner.temp, so ventures-tests.yml runs 4/4 steps locally (0 before). Full venture sweep 1,315 suites in 12m53s; own-workflow ventures keep *.test.mjs-only to avoid their TS/npm suites. shift-roster-builder already red on main (5 runs). Local verification: see the history doc; run_workflow_locally --for-changes output summarised in the PR.",
      "User-directed: audit red-team activity (how destructive) and contrast with blue-team output, as a blog post. Read all 294 redteam run records; rebuilt each of 3,429 seeded mutant lines and searched current files: 0 present on main. Blue team: 864/904 gaps guarded, 89/92 defects patched (one patched here: ai-bookkeeper unclosed CSV quote, open since 2026-10-21). First-pass catch rate flat 63-77%; boundary mutants escape ~50%. Checks: formats.test.mjs 18/18 (2 new fail without fix); run_venture_tests ai-bookkeeper 0 failed; check_post_frontmatter OK; writing/hub/podcast 28/28.",
      "Fuzz baseline on PR #11268 head: 135/1000 random designs failed (all geometry clashes); junk state threw ~400/3000 and NaN-priced 145. After fixes: 2000 designs (seed 5) and 1500 (seed 11) clean; junk sweep 3000 clean. node --test *.test.mjs in ventures/shed-designer: 89 pass, 0 fail. typecheck.mjs shed-designer: 0 diagnostics. run_workflow_locally.py --for-changes: pages.yml 'check hub links' and 'no example.invalid' fail locally only because the build step (a ${{ }} expression) is skipped, so _site does not exist; see PR CI for the real run. Not a bug: 8x8 preset walls 108->114 in is ~$30 cheaper (siding switches to two rows of 4x8). Later PRs in this session: #11317 (sheathing joints on rafters, a regression from #11312 found by requiring every connection check; connector wording; ported the money-sign and size-index JSON-LD fixes for main's red validate and Pages test), #11334 (the same main fixes, closed as superseded per supersede_check.py), #11326 (siding nailers: 70/1500 designs had a bare siding joint beside an opening, now 0/1500; no preset or size page moves). Full venture suite on each merged head: 135+ pass, 0 fail.",
      "Local verification: node --test in ventures/shed-designer 87 pass on fresh main + these commits; typecheck.mjs shed-designer 0 diagnostics. Pages build + check.mjs passed (1319 products, no dead links) on a local merge of main into #11268 at 04:32. Hand-calcs: header, stud (NDS 3.9-3), floor joist, rafter, ridge beam all match structure.mjs. Open: cap-plate joints within 4 ft of top-plate joints with 8-10 ft stock (needs joint choice across both plates); README totals stale. Later PRs in the same session: #11313 (plate joints chosen together, IRC 24\" offset), #11315 (rafter-tie heel joint nailed for thrust), and the gable-header + lane report PR, which also regenerates the size pages #11315 left stale.",
      "Docs-only PR (one blog post). Facts verified locally on Node v22.22.0: node runs .ts and node --test .test.ts; enum fails ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX; stripTypeScriptTypes 352k chars ~100ms; ./x.js specifier for x.ts fails ERR_MODULE_NOT_FOUND. Counts from git ls-files at branch base. run_workflow_locally --for-changes output summarised in PR. CI then showed main itself red in three places, none caused by this PR, each fixed here (fix forward; no fix PR existed): (1) the third-party-font post (#11242) quoted the placeholder origin, failing build.test.mjs 'no page still points at the placeholder origin'; (2) the photographer-bookkeeping post (#11287) had a 178-char description (limit 160); (3) #11274 changed visible FAQ answers on ai-bookkeeper tax-calendar.html and trainer-bookkeeping.html without the FAQPage JSON-LD, failing faq-visible.test.mjs. After merging main: platform/pages node --test '*.test.mjs' 1309 pass 0 fail; run_venture_tests.py ai-bookkeeper 0 failed; promptctl validate ok; check_post_frontmatter ok. Update: main fixed all three itself before this merged (#11295, #11297, #11298 era); merging main took main's versions, so the final diff is the post and this record only.",
      "Verification: node --test *.test.mjs in ventures/shed-designer: 96 pass (new: marketing.test.mjs 2, prices-honesty.test.mjs 4); the new store-comparison tests fail on main's catalog.mjs and pass with the fix. Page driven in headless Chromium: gravel line reads '(estimate)', 'Not in the total' row and summary line render, no console errors on index.html or the marketing page. Price re-check 2026-10-29: homedepot.com product pages load but the pricing value is null until a store is chosen; lowes.com and hellogravel.com 403. Shed Windows and More (4) and Shed Repair (3) match their own pages. Menards schema.org Offer price is the after-11%-rebate value; shelf price is salePrice: 9 unchanged, 4 appeared moved (2x10x12 25.99->24.63, PT 4x4x12 25.72->24.58, PT 2x6x8 12.52->12.19, 7/16 OSB 13.48->14.51). NOT committed: later Menards requests got an Imperva bot challenge and big-box terms forbid scraping (README already says so), so retailer pages are left to a person in a browser; the next PR's re-check script reads only sellers whose robots.txt allows product pages. Hemlock drywall tape 7.49->9.49 (allowed host). Follow-ups in this session: PR #11411 fixed main's red validate and Pages build/test (flagships next: cap, a dead /ventures/ link, ai-bookkeeper title, share tags and FAQ JSON-LD drift), ported into #11318 and both merged on green CI. A second PR adds recheck_prices.py (reads only sellers whose robots.txt allows product pages: Shed Windows and More, Shed Repair, Hemlock Hardware; 9 of 9 match), updates the Hemlock drywall tape price 7.49->9.49, links Shed Designer from the shed-install-bid-calculator article, and writes docs/reports/shed-designer-overnight-lane4.md. The marketing drift test caught a real change after other lanes merged (whole-shed total 3,284.59 -> 3,272.91).",
      "Audit before #11268 merged (read-only): Playwright drive at 1366x900 and Pixel 7 found the end view drawing raw instead of auto-resolved pitch/overhang (5/12, 12\" vs built 4/12, 7\"), eave drag overridden by autoOverhang, handles with role=button but no key handlers, Ctrl+Shift+Z broken (e.key 'Z'), every keystroke committing (\"\" and \"1\" built 4 ft sheds, several undo steps), phone handles 12-19 px, 3D labels overlapping on phone. Latency, median of six pitch edits, sync handler time, headless swiftshader: before 85 ms (12x8) / 175 ms (40x20); after 26 / 50. Local verification: node --test 100 pass 0 fail (browser tests with Playwright 1.63 + axe-core 4.13.0); typecheck 0 diagnostics; clauses pass; validate_workflows all valid; sync_tree_counts --check agrees; gitops/tests/test_ci_runner.py 24 pass after sync_readme_counts.py. The browser tests were written after the fixes; their failures on the old code are shown by the audit script output, not by running the test file against it (it relies on data-key hooks the fix adds). | Follow-up PR (end view sizing): the end view reserved 14/12 of headroom in a fixed 2:1 box, so on a Pixel 7 the 8 ft gable end was 76 px wide in a 344 px box (22%); now 144 px (desktop 119 -> 207 px), with the wall label kept inside. New browser test fails on the old layout. node --test: 131 pass, 0 fail (with Playwright 1.63 + axe). CI on #11316: browser-test first failed because Playwright 1.56.0 cannot install Chromium on ubuntu-latest (Ubuntu 26.04); pinned 1.63.0, then green. validate failed once for the new workflow missing from publish-surface.yaml; fixed with publish_surface.py --write. The PR conflicted with main twice (llms.txt, then the cut-sheet code in app.mjs) and was merged with main each time.",
      "Findings (2026-10-29): 33 channels all at rung artifact, 0 live; counter /counts shows ~24 loads across 3 days, none on a tool page; host-root robots.txt 404; web search returns repo PRs, not site pages. Shipped CI install snippets on the 20 linter entry pages. Verification: node --test platform/pages/ci-install.test.mjs 3/3 pass; full platform/pages suite and platform/marketing/front-door-tools.test.mjs run locally, result in the PR.",
      "Built the site at main 65032126 (2m56s, 5,344 HTML pages, 403 MB) and weighed it with docs/reports/assets/static-framework/measure.mjs and drift.mjs: median page 7.4 KB gzip; 61% of inline CSS/JS bytes repeated across pages; /research/ 240 KB gzip live; 555 :root token sets; GitHub Pages sends max-age=600, gzip only. No code change to the build; the note proposes stages A-F with A (shard indexes) first."
    ]
  },
  "asks": null,
  "snapshot": null
}
