# Project Roblox — Journey chat log
# Append-only timeline rendered at https://roblox.stackhousebuilds.com/journey/
#
# Roles: dad | claude | crew (Researcher | Engineer | Reviewer | Writer) | notice
# Status: done | active | upcoming
# Schema: see ../JOURNEY-SPEC.md
#
# turns[].text is an object with THREE voice layers (OD-009):
#   twins:  fourth-grade reading, 8-12 word sentences, no jargon
#   parent: friendly-explainer, ≤35 words/sentence, no insider acronyms
#   tech:   raw operator/agent voice, receipts, no lint
#
# EACH BUBBLE IS THE SPEAKER'S OWN VOICE (1st person — "I", "we").
# Never narrate the speaker in 3rd person inside their own bubble. Enforced
# by tools/voice_canon_lint.py (per_speaker rules).
#
# role: notice is a system message ("X joined the chat") — renders as a pill,
# not a bubble. Its `text` is a single string (no voice layers). Insert one
# ahead of any entry's first crew appearance so the helper is introduced.
#
# Drafts are entries the agent writes; operator skims weekly and flips draft:false.

meta:
  title: "The Journey"
  subtitle: "How two 10-year-old twins, their dad, and an AI crew are building Roblox games — in public, one decision at a time."
  invitation: "Read it like a text thread. Dad asks. Claude answers. Helpers join the chat when they're needed. Stuff ships."
  last_updated: "2026-05-17T02:00:00Z"
  started: "2026-05-16T13:15:00Z"

entries:

  # ─────────────────────────────────────────────────────────────
  - id: 2026-05-16-kickoff
    date: 2026-05-16T13:15:00Z
    phase: phase_0
    phase_label: "Phase 0 · Kickoff"
    status: done
    draft: false
    turns:
      - role: dad
        text:
          twins:  "Boys — want to build real Roblox games together? For real this time?"
          parent: "I'm telling the AI helper: the boys want to build real Roblox games. Let's actually do it — with a budget, a plan, and a public site so other parents can follow along."
          tech:   "The twins want to build Roblox games together. Let's actually do it — for real, with a budget, a plan, and a public website so other parents can follow along."
      - role: claude
        text:
          twins:  "Yes! I'll write down every step. From your first idea all the way to making a real ad for the best game!"
          parent: "Got it. I'll draft a one-page contract: nine workstreams from research through commercial, a $200 budget, and five points where you sign off before each next step."
          tech:   "Got it. I drafted a charter: nine phases, $200 budget, a mini-site, a sales deck, and a commercial video for whichever idea wins. Five hard decision gates so you stay in the driver's seat. Ready when you sign it."
    twins_summary: "We want to build real Roblox games. Dad said yes! Claude wrote down every step. From our first idea all the way to a real ad for the best one!"
    parent_summary: "We kicked off on a tight budget — $200, about what a Switch costs — and the AI drafted a one-page contract that pinned down 15 decisions up front. Things like 'we're building in real Roblox, not a copy', 'family-friendly only', and 'voice clones for the characters using the twins' own voices'. Nine workstreams from research to launch, with four decision moments where I personally have to say go."
    tech_layer:
      skills_run: ["bmad-create-charter"]
      agents: ["HQ CEO"]
      issues: ["HQ-382"]
      artifacts:
        - { label: "CHARTER.md (46KB)", href: "../CHARTER.md" }
        - { label: "PLAN.md", href: "../PLAN.md" }
        - { label: "STATE.yaml", href: "../STATE.yaml" }
      models: ["claude-opus-4-7"]
    outcome:
      label: "Read the charter"
      href: "../CHARTER.md"
      summary: "The signed v5 charter is the contract everything else runs against."
    tags: ["meta", "decision-gate"]

  # ─────────────────────────────────────────────────────────────
  - id: 2026-05-16-phase-1-research-fire
    date: 2026-05-16T13:23:00Z
    phase: phase_1
    phase_label: "Phase 1 · Research"
    status: done
    draft: false
    turns:
      - role: dad
        text:
          twins:  "Before we have any opinions — what works on Roblox right now?"
          parent: "Before we have any opinions, I want to know what's actually working on Roblox today. What games people play, what tools developers use, what AI art looks like."
          tech:   "Before we have any opinions, I want to know what's actually working on Roblox today. Market, dev tools, AI asset pipelines — all of it."
      - role: claude
        text:
          twins:  "On it! I'll bring in seven AI helpers. Each one reads up on one big topic."
          parent: "On it. I'm splitting this into seven parallel research tracks, each handed to a different helper. Topics: games market, dev tools, technical feasibility, AI art, patterns from other platforms, video tooling, and lessons from a past video project."
          tech:   "I split it into seven parallel research tracks: market landscape, dev domain, tech feasibility, AI asset pipeline, cross-industry patterns, asset-gen tools, and lessons we already learned from the Quarion video project. Researcher is on it."
    twins_summary: "Claude split into seven helpers. Each one read up on one big thing. What games are hot. What tools make Roblox games. How AI can draw people. All seven worked at the same time."
    parent_summary: "Claude broke the research into seven workstreams that ran in parallel — market trends, dev tools, technical feasibility, AI-generated art, what other gaming platforms got right, video tooling, and lessons from a past video project. Each track was double-checked by a separate reviewing agent before being trusted. About two and a half hours from kickoff to everything checked."
    tech_layer:
      skills_run: ["bmad-research"]
      agents: ["HQ Researcher", "HQ Reviewer"]
      issues: ["HQ-383", "HQ-384", "HQ-385", "HQ-386", "HQ-387", "HQ-388", "HQ-389"]
      review_rounds: 7
      models: ["claude-opus-4-7"]
    outcome:
      label: "Open the research room"
      href: "../research/"
      summary: "All eight research files (market → dev → tech → assets → patterns → tooling → video-lessons → compositor) are browsable here."
    tags: ["research"]

  # ─────────────────────────────────────────────────────────────
  - id: 2026-05-16-od-002-learning-first
    date: 2026-05-16T15:05:00Z
    phase: phase_1
    phase_label: "Phase 1 · Research"
    status: done
    draft: false
    turns:
      - role: dad
        text:
          twins:  "Quick fix. This is for fun and learning. Money isn't the goal!"
          parent: "Quick course-correct. Don't pick winners by which one makes the most money. Pick the ones the boys will learn the most from. Money is just a bonus."
          tech:   "Quick course-correct. Don't optimize the ranking for revenue. This is LEARNING-first — the twins should pick what's most fun and most teachable. Money is an excitement signal, not a success metric. I'm OK losing money on this."
      - role: claude
        text:
          twins:  "Got it! Changing how I score the games right now."
          parent: "Got it. I'm updating the scoring rule on the spot — twin learning value and fun-to-build now dominate. Money becomes a tiebreaker instead of the goal."
          tech:   "Resetting the lens. I'll rewrite the ranking rubric so 'twin learning value' and 'fun-to-build' dominate, and revenue ceiling becomes a tiebreaker. Reviewer will regrade the research files against the new lens too."
    twins_summary: "This is for fun and learning. Making money is just a bonus. After this, all choices had to follow the rule."
    parent_summary: "The single most important call I made: this is about the boys learning and shipping something real. Making money is a bonus, not the goal. Every later choice — especially the ranking of game ideas — ran through that lens. Which game teaches the most, not which earns the most. This is the kind of framing decision an AI can't make for you. It has to come from the parent."
    tech_layer:
      decision_id: "OD-002"
      timestamp: "2026-05-16T15:05:00Z"
      affects:
        - "Phase 3 ranking rubric"
        - "Reviewer adversarial passes on research/01..07"
        - "Idea selection lens (LEARNING-first, not ROI-first)"
      models: []
    outcome:
      label: "See where this lens decided everything"
      href: "../#decision"
      summary: "The LEARNING-first frame is why the Five look the way they look."
    tags: ["decision-gate", "meta"]

  # ─────────────────────────────────────────────────────────────
  - id: 2026-05-16-phase-1-close
    date: 2026-05-16T15:43:00Z
    phase: phase_1
    phase_label: "Phase 1 · Research"
    status: done
    draft: false
    turns:
      - role: notice
        text: "Researcher and Reviewer joined the chat · Researcher reads up on stuff, Reviewer double-checks the work"
      - role: crew
        crew_role: Researcher
        text:
          twins:  "All eight research notes — done!"
          parent: "All eight files in — the games market, developer tools, technical feasibility, AI art, patterns from other platforms, video tooling, and a deep dive on a video-compositing tool."
          tech:   "All eight research files landed. Market, dev domain, tech feasibility, AI asset pipeline, cross-industry patterns, asset-gen tools, video-lessons-applied, plus a deep-dive on the HeyGen Hyperframes compositor."
      - role: crew
        crew_role: Reviewer
        text:
          twins:  "Checked every file. They all pass!"
          parent: "Went through every file looking for over-claims and missing sources. All clean — nothing waving its hands at you."
          tech:   "Seven adversarial passes complete. Every file is approved — no overclaiming, no hand-waving, sources hold up."
      - role: dad
        text:
          twins:  "Beautiful. Light the brainstorm fuse!"
          parent: "Perfect. Move us on to the brainstorm."
          tech:   "Beautiful. Light the brainstorm fuse."
    twins_summary: "Eight giant research notes — done, checked twice. Now we can stop reading and start dreaming up games."
    parent_summary: "Two and a half hours of reading later: eight finished research files, every claim sourced, every recommendation challengeable. Roughly the equivalent of a short paperback across the seven topics. This is the foundation everything else stands on — if it's wrong here, every later decision inherits the mistake."
    tech_layer:
      skills_run: ["bmad-research", "bmad-review-adversarial"]
      agents: ["HQ Researcher", "HQ Reviewer"]
      issues: ["HQ-383..HQ-389 (all done)"]
      duration_min: 140
      artifacts:
        - { label: "01 · market landscape", href: "../research/01-roblox-market-landscape.md" }
        - { label: "02 · dev domain", href: "../research/02-roblox-dev-domain.md" }
        - { label: "03 · tech feasibility", href: "../research/03-tech-feasibility.md" }
        - { label: "04 · AI asset pipeline", href: "../research/04-ai-asset-pipeline.md" }
        - { label: "05 · cross-industry patterns", href: "../research/05-cross-industry-patterns.md" }
        - { label: "06a · asset-gen tools", href: "../research/06a-asset-gen-tools.md" }
        - { label: "06b · Hyperframes compositor", href: "../research/06b-hyperframes-compositor.md" }
        - { label: "07 · video lessons applied", href: "../research/07-quarion-video-lessons-applied.md" }
      models: ["claude-opus-4-7"]
    outcome:
      label: "Open the research room"
      href: "../research/"
      summary: "Eight files. Every recommendation in the rest of the project traces back to here."
    tags: ["research"]

  # ─────────────────────────────────────────────────────────────
  - id: 2026-05-16-phase-2-brainstorm
    date: 2026-05-16T16:38:00Z
    phase: phase_2
    phase_label: "Phase 2 · Brainstorm"
    status: done
    draft: false
    turns:
      - role: dad
        text:
          twins:  "Now I want lots of ideas! 40 to 60. No filtering yet."
          parent: "Now I want lots of ideas — 40 to 60. Wide net, no filtering yet. Use every brainstorming trick, and keep twin learning first."
          tech:   "Now I want 40 to 60 ideas. Wide net. Don't filter. Run the full brainstorming menu — SCAMPER, Crazy 8s, Worst-Idea, Reverse, all of it. Twin learning first. Gacha-without-the-tag is fine."
      - role: notice
        text: "Researcher and Reviewer joined the chat"
      - role: crew
        crew_role: Researcher
        text:
          twins:  "55 game ideas! Grouped by theme."
          parent: "Delivered 55, grouped into themes — tycoons, mystery, social, horror, creator-themed. Each one has a one-line pitch and a quick guess at how it would make money."
          tech:   "Delivered 55 ideas grouped by cluster — tycoons, mystery, social, horror, creator-themed. Each has a one-line pitch, category, monetization hypothesis, and a time-to-first-dollar guess."
      - role: dad
        text:
          twins:  "Add these two from the boys' breakfast! They count too."
          parent: "Adding two more the boys came up with at breakfast. They count just as much as the AI's."
          tech:   "Add these two the twins came up with at breakfast. They count."
      - role: crew
        crew_role: Reviewer
        text:
          twins:  "57 total. All checked. Ready to pick favourites!"
          parent: "All 57 in the corpus, all checked. Ready for the ranking step."
          tech:   "All 57 now in the corpus and adversarially passed. Ready to rank."
    twins_summary: "Brainstorm time! 55 game ideas came in. Plus two you thought up at breakfast — Schoolyard Manhunt and Creator Tower Defence. That makes 57 ideas to pick from."
    parent_summary: "A wide brainstorm using eight different idea-generation techniques. One was 'worst idea' — force the bad ones onto the page first so you can see the good ones clearly. Another was 'analogy' — steal patterns from other platforms and remix them for Roblox. The AI generated 55. Two more came from the twins after I relayed their breakfast-table ideas — those got added with a fairness rule so they couldn't be quietly cut later. 57 in total, all reviewed and signed off."
    tech_layer:
      skills_run: ["bmad-brainstorming", "bmad-party-mode", "bmad-cis-innovation-strategy", "bmad-review-adversarial"]
      agents: ["HQ Researcher", "HQ Engineer", "HQ CEO", "HQ Reviewer"]
      issues: ["HQ-391", "HQ-392"]
      review_rounds: 1
      idea_count: 57
      operator_injected: 2
      artifacts:
        - { label: "research/08-brainstorm-raw-ideas.md (57 ideas)", href: "../research/08-brainstorm-raw-ideas.md" }
      models: ["claude-opus-4-7"]
    outcome:
      label: "Browse all 57 ideas"
      href: "../research/08-brainstorm-raw-ideas.md"
      summary: "The raw idea vault, before ranking. Tier-2 and tier-3 will all get mini-pages on this site too."
    tags: ["brainstorm"]

  # ─────────────────────────────────────────────────────────────
  - id: 2026-05-16-phase-3-ranking
    date: 2026-05-16T20:06:00Z
    phase: phase_3
    phase_label: "Phase 3 · Ranking"
    status: done
    draft: false
    turns:
      - role: dad
        text:
          twins:  "57 ideas! Score every one and pick the best 5."
          parent: "Score all 57 under the fun-and-learning rule. Pick the five worth actually building."
          tech:   "57 ideas. Score them under the LEARNING-first rubric. Pick the 5 we should actually build."
      - role: notice
        text: "Engineer joined the chat · Engineer plans the games and figures out the rules"
      - role: crew
        crew_role: Engineer
        text:
          twins:  "Top 5: a pet shop, a mystery, a tower-defence, a horror mansion, a memory game!"
          parent: "Ranking matrix run. Top five: a pet salon tycoon, a mystery game, a tower-defence themed around YouTubers, a horror mansion, and a memory-based social game. Three merger pairs reduce to five clean slots."
          tech:   "Ranking matrix run. Top five: Pet Salon Tycoon, a mystery game, a tower-defence-with-creator-theme, a horror mansion, and a memory-themed social game. Three merger pairs reduce to five slots. Recommended sequence: 1→2→3→4→5."
      - role: crew
        crew_role: Reviewer
        text:
          twins:  "Pushed back four times until the list was honest. That's the safety check!"
          parent: "I pushed back four separate times. Once for typos. Once because a strong candidate was being dropped too aggressively. Once for a column drift. Once a final all-clear."
          tech:   "Four rounds. Round 1 caught clerical typos. Round 2 reinstated a tier-1 candidate I'd dropped too aggressively (M1). Round 3 fixed a tier-column drift in §2. Round 4 cleared for the gate."
      - role: dad
        text:
          twins:  "Send it to me!"
          parent: "Send it over."
          tech:   "Send it to me."
    twins_summary: "Every idea got a score for fun and learning. The best 5 came out on top. A second helper made the list get redone four times. That's how we know it's honest."
    parent_summary: "The planning agent scored all 57 ideas on the fun-and-learning scale I set. The reviewing agent pushed back four times — most importantly catching one idea that was getting dropped too quickly. This is the whole point of running an independent reviewer: it stops the obvious winner from quietly steamrolling the close calls."
    tech_layer:
      skills_run: ["bmad-ranking-matrix", "bmad-review-adversarial"]
      agents: ["HQ Engineer", "HQ Reviewer"]
      issues: ["HQ-396"]
      review_rounds: 4
      ideas_evaluated: 57
      finalists_selected: 5
      artifacts:
        - { label: "research/09-ranking.md", href: "../research/09-ranking.md" }
      models: ["claude-opus-4-7"]
    outcome:
      label: "Meet The Five"
      href: "../#finalists"
      summary: "The five finalists are the centerpiece of the homepage."
    tags: ["ranking", "decision-gate"]

  # ─────────────────────────────────────────────────────────────
  - id: 2026-05-16-g1-signed
    date: 2026-05-16T20:42:00Z
    phase: g1_gate
    phase_label: "G1 · Hard Gate"
    status: done
    draft: false
    turns:
      - role: dad
        text:
          twins:  "I pick the 5! Pet Salon Tycoon goes in the big ad."
          parent: "I accept the five. Overriding the ad pick from the tower-defence to Pet Salon Tycoon — it ships first, so the commercial rides a real game, not a slot-4 promise. Family lineup, yes voice pre-record. And I want the shared art-and-sound kit treated as a first-class part of the plan, not an afterthought."
          tech:   "G1 decided. I accept the slate. I'm overriding the video pick from the tower-defence to Pet Salon Tycoon — it'll ship first, so the commercial should ride the actual hero build, not a slot-4 vapourware. Family lineup, voice pre-record yes. And I want family shared infra — art kit, voice library, UGC wallet, plugin chain — treated as a first-class deliverable, not an afterthought."
      - role: claude
        text:
          twins:  "Got it! Switching the ad plan to a Pet Salon style."
          parent: "Done. I'm rewriting the commercial brief — the ad now follows a tycoon-style montage instead of a tower-defence one. I'll warn the storyboard writer in advance so they don't pattern-match to the wrong genre."
          tech:   "Signed and locked. The video grammar changes — Pet Salon Tycoon needs tycoon montage, before-after pet glow-up, customer-reaction cuts, Suno build-to-payoff. Storyboard writer in Phase 7 has been warned: this is NOT a build-to-drop tower-defence treatment."
    twins_summary: "I picked the 5 games! Pet Salon Tycoon goes in the big ad. The five games will share art, voices, and items. That way we don't build the same stuff five times."
    parent_summary: "My first big decision moment. I had to confirm which five of the 57 ideas actually get built, in what order, and which one becomes the commercial. The most interesting call was overriding the AI's video pick. It suggested using the most-polished game as the commercial subject; I caught that this would force the commercial to rely on fake footage when the actual game wasn't built yet. Switching the commercial to game #1 means whatever's filmed is real. I also made shared art, voices, and items a first-class part of the plan — so the five games compound on each other instead of starting from scratch every time."
    tech_layer:
      decision_id: "OD-005"
      timestamp: "2026-05-16T20:42:00Z"
      decisions:
        - "ACCEPT Engineer's tier-1 slate (5 finalists)"
        - "ACCEPT default sequence 1→2→3→4→5"
        - "OVERRIDE #1-for-video from slot-4 → slot-1 (Pet Salon Tycoon)"
        - "ACCEPT 'family' lineup (twin-studio brand wrapper)"
        - "ACCEPT yes-voice-pre-record (single Phase-4 session, ~120 lines, ~$25 cap)"
        - "ADD-ON: family shared infra plan as first-class Phase-4 deliverable"
      models: []
    outcome:
      label: "See the G1 decision pack"
      href: "../#decision"
      summary: "The full G1 callout block on the homepage covers all of these picks."
    tags: ["decision-gate", "ship"]

  # ─────────────────────────────────────────────────────────────
  - id: 2026-05-16-phase-4-fire
    date: 2026-05-16T20:45:00Z
    phase: phase_4
    phase_label: "Phase 4 · Build-out"
    status: active
    draft: false
    turns:
      - role: dad
        text:
          twins:  "Now write the deep plan for all 5 games — all at the same time!"
          parent: "Every finalist needs a deep plan — how it plays, how it makes money, what the hero moment for the ad looks like. Plus the voice-recording shopping list. Plus the shared art-and-sound kit. Fan it out — work in parallel."
          tech:   "Phase 4. Each finalist gets a feasibility brief with hero demo moments. Plus the voice pre-record spec, plus the family shared infra plan. Fan it out — let everyone work in parallel."
      - role: notice
        text: "Engineer and Researcher joined the chat"
      - role: crew
        crew_role: Engineer
        text:
          twins:  "Got three jobs! The pet-salon plan, the tower-defence plan, and the shared art kit."
          parent: "Picking up the pet-salon plan, the tower-defence plan, and the shared art-and-sound kit. Three workstreams in parallel."
          tech:   "Picked up slot 1, slot 4, and family infra. Three issues, parallel."
      - role: crew
        crew_role: Researcher
        text:
          twins:  "I've got four more jobs! Plans coming soon."
          parent: "Taking the other three game plans and the voice-recording shopping list. Four more workstreams running at the same time. Drafts incoming."
          tech:   "I've got slot 2, slot 3, slot 5, and voice spec. Four issues, parallel. Drafts incoming."
    twins_summary: "Right now the crew is writing the deep plan for all 5 games. At the same time! Plus the voice lines we'll record. Plus the shared art kit for the whole set."
    parent_summary: "Seven workstreams now running in parallel. Five of them are the deep plans for each of the five games — what's the loop, how does it make money, what's the risk, what's the hero shot for the commercial. One is the shopping list for the day the twins record their characters' voices (about 120 lines, one production day). One is the shared kit so the five games don't get built from scratch five times. The reviewing agent will check everything before my next decision moment."
    tech_layer:
      skills_run: ["bmad-feasibility-brief", "bmad-spec-author"]
      agents: ["HQ Engineer", "HQ Researcher"]
      issues: ["HQ-401", "HQ-402", "HQ-403", "HQ-404", "HQ-405", "HQ-406", "HQ-407"]
      parent_issue: "HQ-382"
      status_note: "In flight. ETA G2 hard gate within the working week."
      models: ["claude-opus-4-7"]
    outcome:
      label: "Track build-out state"
      href: "../STATE.yaml"
      summary: "STATE.yaml shows phase_4 with all seven sub-issues live. The homepage finalists each get a deeper page when their feasibility brief lands."
    tags: ["build"]

  # ─────────────────────────────────────────────────────────────
  - id: 2026-05-16-mini-site-spec-locked
    date: 2026-05-16T20:55:00Z
    phase: phase_4
    phase_label: "Phase 4 · Build-out (Phase 5 spec pre-locked)"
    status: done
    draft: false
    turns:
      - role: dad
        text:
          twins:  "Listen — this website (the one you're reading now!) has to be fun for YOU first. Grown-up details are one click away."
          parent: "Setting the rules for the public site before the deep planning even finishes. Kids see the fun parts first as game cards. Grown-ups click to expand the details. Coders click again for the technical receipts. The deeper game plans stay the master document — the site quotes from them, not the other way around."
          tech:   "Before Phase 5 starts: I want the mini-site dual-audience. Twins get a hero card per finalist. I get a collapsible operator explainer underneath. Canonical briefs stay as the source of truth — the site quotes them, doesn't replace them. Use the frontend-design skill, no exceptions."
      - role: claude
        text:
          twins:  "Yes! I'll update every plan so the site can pull the kid-friendly bits straight from it."
          parent: "Done. I'm updating every game-plan workstream. Each one now ends with a four-field summary the site can lift directly: a one-liner for kids, a quick mechanic description, a short grown-up explainer, and one signature picture."
          tech:   "OD-006 locked. Pushing a §9 'site-extractable summary' requirement into each of the five feasibility-brief issues now — one-line twin pitch, three-or-four-sentence twin mechanic, two-or-three-sentence operator one-pager, one signature visual. Voice spec and family-infra plan are exempt."
    twins_summary: "I set the rules for what this site looks like. Kids see the fun parts first. Grown-ups can click to see the deeper details. Coders can click again for the receipts."
    parent_summary: "I pinned down the design rules for the public site while the deep planning was already running. Two reading levels on every page — kids see the fun parts as cards; grown-ups click to expand the details; coders click again to see the technical receipts. The runner-up ideas don't get rough sketches — they get nearly-polished mini-pages too, so nothing the twins thought of feels thrown away. This is the design DNA the rest of the site inherits, including the page you're reading right now."
    tech_layer:
      decision_id: "OD-006"
      timestamp: "2026-05-16T20:55:00Z"
      cascades_to:
        - "HQ-401..HQ-405 — added §9 site-extractable summary requirement"
        - "Phase 5 mini-site build (this site you're reading)"
        - "Idea Vault tier-2/3 entries (same pattern, lighter polish)"
      models: []
    outcome:
      label: "Read the full design spec"
      href: "../JOURNEY-SPEC.md"
      summary: "The spec for THIS journey page is one of the first descendants of OD-006."
    tags: ["decision-gate", "meta"]

  # ─────────────────────────────────────────────────────────────
  - id: 2026-05-16-public-url-launch
    date: 2026-05-16T22:55:00Z
    phase: phase_5
    phase_label: "Phase 5 · Mini-site goes public"
    status: done
    draft: false
    turns:
      - role: dad
        text:
          twins:  "I set up our real web address — roblox.stackhousebuilds.com!"
          parent: "Standing up roblox.stackhousebuilds.com as the public gateway. The DNS record's already made — wire up the rest."
          tech:   "Stand up roblox.stackhousebuilds.com as the public gateway. I made the DNS record already."
      - role: claude
        text:
          twins:  "Live! Now you can show your friends at school."
          parent: "Live. Secure HTTPS that renews itself, automatic redirect from old links. The private internal version still runs as a backup. Anyone with the URL can read this story now."
          tech:   "Live. Nginx vhost, Let's Encrypt cert valid until August 14, HTTP-to-HTTPS redirect with HSTS. Now anyone can read this story without needing the Tailscale network."
    twins_summary: "The website is on the real internet now! roblox.stackhousebuilds.com — you can share it with your friends at school."
    parent_summary: "The site went public on its own friendly URL — roblox.stackhousebuilds.com — joining the family of project sites under stackhousebuilds.com. HTTPS certificate set up to renew itself automatically. The private internal version stays running as a backup. This public URL is the one you can text to friends."
    tech_layer:
      skills_run: ["nginx-vhost", "certbot-nginx"]
      agents: ["operator (direct)"]
      cert_expiry: "2026-08-14"
      cert_name: "roblox.stackhousebuilds.com"
      files_touched:
        - "/etc/nginx/sites-available/roblox.stackhousebuilds.com.conf"
        - "/etc/nginx/sites-enabled/roblox.stackhousebuilds.com.conf"
        - "/etc/letsencrypt/live/roblox.stackhousebuilds.com/"
      verified:
        - "HTTP → 301 → HTTPS"
        - "HTTPS → 200, serves G1 finalist review"
        - "CSS + SVG assets serve with right MIME types"
      models: ["claude-opus-4-7"]
    outcome:
      label: "Visit the homepage"
      href: "../"
      summary: "The G1 finalist review is what visitors land on. This journey page is the second surface."
    tags: ["ship", "meta"]

  # ─────────────────────────────────────────────────────────────
  - id: 2026-05-16-journey-page-live
    date: 2026-05-16T23:30:00Z
    phase: phase_5
    phase_label: "Phase 5 · Journey page added"
    status: done
    draft: false
    turns:
      - role: dad
        text:
          twins:  "I want a chat-history page so the whole story is easy to follow!"
          parent: "I want a chat-history view of the whole project — for the twins to follow along, for other parents to copy the process, for the curious to drill into the technical detail. Self-updating as we advance."
          tech:   "I want a chat-history view of the whole project — for the twins to follow along, for other parents to copy the process, for the curious to drill into the technical detail. Self-updating as we advance. The chat metaphor is the spine."
      - role: claude
        text:
          twins:  "Built it! Three reading modes per entry."
          parent: "Built. Every entry has three reading levels — kids on top, grown-ups one click in, technical receipts two clicks in. Every entry links out to wherever its work actually lives on the rest of the site."
          tech:   "Built. Three layers per entry — twins, parents, tech. Chat bubbles render from a YAML log; agents draft new entries on phase events; you skim weekly. Every entry links out to wherever its work lives on the portal, so chat → artifact is one click."
    twins_summary: "This is the page you're on right now! It's like a long text thread. Every big moment gets a new text added here."
    parent_summary: "The journey page launched with 10 seed entries covering the project from kickoff through today. It updates itself — every time the AI crew finishes a chunk of work, a new chat-message lands here automatically. I skim the new entries weekly and sign off before they appear. No daily check-ins needed."
    tech_layer:
      skills_run: ["frontend-design"]
      agents: ["Claude Code (this session)"]
      files_created:
        - "site/journey/index.html"
        - "site/assets/journey.css"
        - "site/assets/journey.js"
        - "site/assets/vendor/js-yaml.min.js"
        - "site/data/chat-log.yaml"
        - "site/JOURNEY-SPEC.md"
      schema_doc: "../JOURNEY-SPEC.md"
      models: ["claude-opus-4-7"]
    outcome:
      label: "Read the design spec"
      href: "../JOURNEY-SPEC.md"
      summary: "Full design + data-model + auto-maintenance spec, including the 'fork this for your own family' appendix."
    tags: ["ship", "meta"]

  # ─────────────────────────────────────────────────────────────
  - id: 2026-05-17-journey-skill-live
    date: 2026-05-17T00:35:00Z
    phase: phase_5
    phase_label: "Phase 5 · Auto-maintenance wired"
    status: done
    draft: true
    turns:
      - role: dad
        text:
          twins:  "Now make this page update itself when stuff happens!"
          parent: "Make this page actually self-update. Every time something real happens — a step closes, a decision lands, something ships — I want a draft entry to appear automatically. I'll skim once a week and promote the ones that read right."
          tech:   "Now make the journey page actually self-update. Every time a real thing happens — a phase closes, I make a decision, something ships — I want a draft entry to appear automatically. I'll skim once a week and promote the ones that read right."
      - role: claude
        text:
          twins:  "Done! I built a helper that writes new chapters all by itself."
          parent: "Done. The new helper watches for meaningful project events and pulls the relevant facts from the state files. Then it drafts a three-layer entry in your voice, marks it as a draft, and drops a one-liner into your inbox to skim. The entry you're reading is the first one drafted that way."
          tech:   "Done. New `/hq-journey-entry` skill — fires on phase transitions, new operator decisions, or ship events; pulls the data via a helper that reads STATE.yaml + decisions-log + recent issues; drafts the three-layer entry in your voice; appends here as `draft: true`; drops a one-liner into INBOX. Weekly skim is the only manual step. This entry you're reading is the first one drafted that way."
    twins_summary: "Now a new chapter of this story gets written all by itself whenever something important happens. I just have to read it once a week and say it sounds right."
    parent_summary: "The journey log just became self-maintaining. A new helper script watches for meaningful project events and drafts entries in real time. My role shrinks from 'write the entry' to 'approve the entry' — about five minutes of editing per week instead of a fresh write per event. The helper is project-aware (today it serves Project Roblox; the same plumbing handles BFA / Quarion / MineFin once they grow their own journey surface)."
    tech_layer:
      skills_run: ["skill-creator"]
      agents: ["Claude Code (this session)"]
      files_created:
        - "/mnt/HC_Volume_105638276/http/.claude/skills/hq-journey-entry/SKILL.md"
        - "/srv/http/_hq/bin/journey_entry_context.py"
      trigger_events:
        - "STATE.yaml phase transitions"
        - "new operator_decisions[OD-NNN]"
        - "ship events (public artifact landings)"
        - "manual /hq-journey-entry invocation"
      governance: "Drafts always land as draft:true. Operator weekly skim flips to draft:false. ~5 min/week."
      models: ["claude-opus-4-7"]
    outcome:
      label: "Read the spec"
      href: "../JOURNEY-SPEC.md"
      summary: "JOURNEY-SPEC.md describes the full auto-maintenance protocol the skill follows."
    tags: ["meta", "ship"]

  # ─────────────────────────────────────────────────────────────
  - id: 2026-05-17-voice-canon-enforced
    date: 2026-05-17T01:25:00Z
    phase: phase_5
    phase_label: "Phase 5 · Voice canon now enforced"
    status: done
    draft: true
    turns:
      - role: dad
        text:
          twins:  "The site has to be easy for kids to read. No grown-up words!"
          parent: "Some entries here are reading like operator notes — insider acronyms, code symbols, jargon. Fails the kid-friendly bar. Enforce the writing rules with a tool, not just good intentions. Wire it to every public surface."
          tech:   "The OD-006 entry on the site reads like operator notes — 'OD-006 locked', '§9 site-extractable summary', 'canonical briefs', 'voice spec exempt'. Fails the 10yo standard. The voice canon is documented but nothing enforces it. Fix the renderer AND build the enforcement so this can't happen again. Wire it to every public surface per OD-009."
      - role: claude
        text:
          twins:  "Done! Every chat bubble got rewritten. And a robot checker won't let grown-up words sneak back in."
          parent: "Done. Every chat bubble got rewritten in three voices — kid, grown-up, and technical — so the right one shows depending on the reading mode. I also built a checker that scans every kid-visible and grown-up-visible field against a banned-word list, refuses to save the file if anything slips through, and runs before every commit."
          tech:   "Three changes shipped together. (1) Turn schema migrated: turns[].text → {twins,parent,tech} object; renderer picks by mode. (2) voice_canon_lint.py + voice_canon_rules.yaml under site/tools/ — Python lint, exit 1 on any banned-term hit, runs in the hq-journey-entry skill as a self-test and as a git pre-commit hook. (3) All 16 prior entries (48 turns) backfilled through the canon. Same lint will gate Phase 6 deck + Phase 7 video script per OD-009."
    twins_summary: "The site now has a robot helper. It makes sure every chat bubble sounds right for whoever is reading. No grown-up jargon in the kid mode!"
    parent_summary: "What used to be a written voice rule is now an enforced one. A new tool scans every kid-facing and grown-up-facing chat bubble against a banned-word list — bare project codes, insider jargon, technical symbols. It refuses to save the file if anything slips through. Every previous chat entry got rewritten through this same checker. The same tool will guard the sales deck and the video script when those land."
    tech_layer:
      skills_run: ["hq-journey-entry (amend)", "frontend-design"]
      agents: ["Claude Code (this session)"]
      files_created:
        - "site/tools/voice_canon_lint.py"
        - "site/tools/voice_canon_rules.yaml"
      files_touched:
        - "site/assets/journey.js (per-mode bubble text)"
        - "site/assets/journey.css (.j-bubble__layer / .j-bubble__draft)"
        - "site/data/chat-log.yaml (all 16 entries backfilled, schema migrated)"
        - "site/JOURNEY-SPEC.md (schema + enforcement docs)"
        - "/mnt/HC_Volume_105638276/http/.claude/skills/hq-journey-entry/SKILL.md (lint self-test, 3-layer authoring)"
        - "_hq pre-commit hook (chat-log.yaml + site HTML scope)"
      decision_id: "OD-010 (implied — enforcement of OD-009)"
      models: ["claude-opus-4-7"]
    outcome:
      label: "Read the copy canon"
      href: "../COPY-VOICE.md"
      summary: "COPY-VOICE.md is the narrative spec. voice_canon_rules.yaml is the executable mirror the tool reads."
    tags: ["meta", "build"]

  # ─────────────────────────────────────────────────────────────
  - id: 2026-05-17-voice-pov-and-animation
    date: 2026-05-17T02:00:00Z
    phase: phase_5
    phase_label: "Phase 5 · Chat reads like a chat"
    status: done
    draft: true
    turns:
      - role: dad
        text:
          twins:  "The chat sounded weird! Like a robot was talking ABOUT us instead of TO us. Fix it!"
          parent: "These rewrites are talking about me and the AI in the third person — but each bubble is supposed to BE the sender talking. Fix the voice. Also, helpers like Researcher and Reviewer just appear out of nowhere — give them a 'joined the chat' notice. And can messages fade in as I scroll, like real iMessages, with typing dots?"
          tech:   "Dad's bubble said 'Dad wanted lots of ideas' — should be 1st person from Dad. Same for Claude. Research and Reviewer drop in without setup — needs a system 'X joined the chat' message. Bonus: scroll-reveal animation with typing dots, variable delay by message length. Outcome chips slide in from the side so they don't read as bubbles. Update the skill + lint so this can't recur."
      - role: claude
        text:
          twins:  "Fixed! Every bubble now sounds like the person sending it. The helpers say hi when they show up. And the page feels alive as you scroll!"
          parent: "Fixed. Every chat bubble now reads as the sender speaking in first person. Helpers like Researcher and Reviewer get a 'joined the chat' notice when they first show up in a conversation. Bubbles fade in with typing dots as you scroll, varied by message length. The 'more detail' chips slide in from the side so they read as separate things, not text messages. The checker now also catches third-person self-narration so the same drift can't sneak back in."
          tech:   "Five changes shipped. (1) All twin+parent turn text rewritten in first-person speaker POV across every entry. (2) New `notice` role + renderer treatment (centered pill, not a bubble); inserted ahead of any entry's first crew appearance. (3) IntersectionObserver scroll-reveal — typing dots 300-1400ms variable by message length, bubble fades in, outcome chips slide in from the side; respects prefers-reduced-motion and stops on second visit via sessionStorage. (4) Added per_speaker rule block in voice_canon_rules.yaml (dad/claude/crew 3rd-person-self-narration); lint engine threads speaker context through. (5) hq-journey-entry SKILL.md amended with speaker-POV mandate + notice-turn rule."
    twins_summary: "Every chat bubble now sounds like the right person talking. Helpers say hi when they show up. And the page feels alive as you scroll!"
    parent_summary: "Three problems fixed together. The chat now reads as the actual sender of each message — first person, not narrator-style. Helper agents (Researcher, Reviewer, Engineer, Writer) get a 'joined the chat' notice when they first appear in a conversation, so they don't just materialise. And the page now animates as you scroll: bubbles fade in with typing dots, outcome chips slide in from the side. The motion respects the reduced-motion accessibility setting, and skips on repeat visits."
    tech_layer:
      skills_run: ["hq-journey-entry (amend)"]
      agents: ["Claude Code (this session)"]
      files_touched:
        - "site/data/chat-log.yaml (all turns rewritten 1st-person + notice turns added)"
        - "site/assets/journey.js (notice render, IntersectionObserver scroll-reveal)"
        - "site/assets/journey.css (notice pill style, fade-in + slide-in keyframes)"
        - "site/tools/voice_canon_rules.yaml (per_speaker rules added)"
        - "site/tools/voice_canon_lint.py (speaker-aware lint engine)"
        - "/mnt/HC_Volume_105638276/http/.claude/skills/hq-journey-entry/SKILL.md (speaker POV + notice mandate)"
      affects:
        - "Every existing chat-log entry"
        - "Every future hq-journey-entry skill run"
        - "Phase 6 deck + Phase 7 video script (same speaker-POV rules apply)"
      models: ["claude-opus-4-7"]
    outcome:
      label: "Read the copy canon"
      href: "../COPY-VOICE.md"
      summary: "Speaker-POV mandate slots in under the existing voice canon as an enforcement detail."
    tags: ["meta", "build"]

  # ═════════════════════════════════════════════════════════════
  # UPCOMING (ghost bubbles — the roadmap forward)
  # ═════════════════════════════════════════════════════════════

  - id: upcoming-phase-4-close
    date: 2026-05-19T00:00:00Z
    phase: phase_4
    phase_label: "Phase 4 · Build-out close"
    status: upcoming
    expected_by: "Within the working week"
    draft: false
    turns:
      - role: claude
        text:
          twins:  "When all 5 game plans are done, you get to pick again!"
          parent: "Once all five deep plans plus the voice-recording list plus the shared art-kit plan are signed off, your second big decision moment opens. Which finalists actually move into polish, in what order."
          tech:   "Five feasibility briefs + voice spec + family shared infra plan all Reviewer-approved. G2 hard gate awaits operator pick on which finalists to sustain into Phase 5."
    twins_summary: "When all five plans are done, I get to pick. Which games do we build first?"
    parent_summary: "My second decision moment. With all five game plans on the desk, I can confirm the lineup, cut one if it turns out to be too risky, or shuffle the build order. From there, the public site moves into proper polish and the sales deck starts coming together."
    outcome:
      label: "Decision happens at G2"
      href: "../STATE.yaml"
      summary: "Watch STATE.yaml for the state: phase_4 → g2_gate transition."
    tags: ["build", "decision-gate"]

  - id: upcoming-phase-7-storyboard
    date: 2026-05-30T00:00:00Z
    phase: phase_7
    phase_label: "Phase 7 · Video pre-prod"
    status: upcoming
    expected_by: "Late May 2026"
    draft: false
    turns:
      - role: dad
        text:
          twins:  "Now plan the Pet Salon Tycoon ad — shot by shot!"
          parent: "Storyboard the pet-salon commercial. Tycoon-style montage with before-and-after pet glow-ups, customer reactions, music-led build to a payoff moment. Specifically NOT a tower-defence treatment."
          tech:   "Storyboard the Pet Salon Tycoon commercial. Tycoon montage, before-after pet glow-up, customer reactions, Suno build-to-payoff. NOT a tower-defence treatment."
      - role: notice
        text: "Writer joined the chat · Writer drafts the storyboard for the ad"
      - role: crew
        crew_role: Writer
        text:
          twins:  "I'll draft every shot. Every beat. All timed to the music!"
          parent: "Storyboard draft coming, with every shot timed to the music. You sign off before any expensive image-generation runs."
          tech:   "Storyboard draft + music-first beat-sync plan. G3 gate before any render spend."
    twins_summary: "The crew will plan the Pet Salon Tycoon ad. Every shot. Every cut. All timed to the music."
    parent_summary: "The commercial gets planned around the music first — every visual lands on a beat. The shot-by-shot storyboard has to be approved by me before any expensive AI image-generation runs. This is where the video budget — about a hundred dollars — actually gets spent."
    tags: ["video", "decision-gate"]

  - id: upcoming-phase-8-video-ship
    date: 2026-06-10T00:00:00Z
    phase: phase_8
    phase_label: "Phase 8 · Video ships"
    status: upcoming
    expected_by: "Early June 2026"
    draft: false
    turns:
      - role: notice
        text: "Engineer joined the chat"
      - role: crew
        crew_role: Engineer
        text:
          twins:  "I'll make the final ad come together!"
          parent: "Generating all the AI shots, weaving them together with a video-compositing tool, baking the final commercial. You sign off one last time before the video goes public."
          tech:   "Parallel asset-gen → HeyGen Hyperframes compositor → final render. G4 gate before publishing."
      - role: dad
        text:
          twins:  "Embed it right at the top of the homepage!"
          parent: "Embed the finished ad right at the top of the homepage when it lands."
          tech:   "Embed it on the homepage when it lands."
    twins_summary: "When the ad is done, it lands right at the top of the site. Anyone with the link can watch it!"
    parent_summary: "All the AI-generated shots get composed into the final commercial. I have to sign off one last time before it goes public. The journey page entry for this moment will embed the finished video right inline in the chat thread."
    outcome:
      label: "Watch this space"
      href: "../"
      summary: "When the video ships, it embeds inline above the finalists on the homepage."
    tags: ["video", "ship"]

  - id: upcoming-phase-9-closure
    date: 2026-06-20T00:00:00Z
    phase: phase_9
    phase_label: "Phase 9 · Closure"
    status: upcoming
    expected_by: "Mid-June 2026"
    draft: false
    turns:
      - role: notice
        text: "Writer joined the chat"
      - role: crew
        crew_role: Writer
        text:
          twins:  "I'll write the closing note and pack everything up!"
          parent: "Closing note for the planning project, building the indexes, capturing the lessons learned. The project graduates into its own slot, ready for actual game-building to start."
          tech:   "Closing note + indexes + lessons learned. The project graduates from HQ into its own slot at /srv/http/roblox/ post-G1 inheritance."
      - role: dad
        text:
          twins:  "And this page keeps going as we build the real games!"
          parent: "And this page keeps going — it stops being a planning blog and becomes a build blog, with no seam between the two."
          tech:   "And the journey page keeps running as we build the actual games."
    twins_summary: "When the planning is done, we start building the games. This story keeps going as we go."
    parent_summary: "The planning project officially wraps and the build phase starts. This page doesn't end though — it keeps appending entries as the actual game development unfolds. From planning blog to build blog with no seam."
    tags: ["meta", "ship"]
