99 tasks · 72 done · 7 phases · 2026-09-12

Ventures Workspace — Merging VentureRaven into CodeRaven

VentureRaven becomes a third workspace kind inside CodeRaven, following the pattern Personal established. The fork is a stale copy carrying roughly 900 lines of genuinely venture-specific work; the merge moves that content behind a ProjectKind.venture case and retires the repo.

~900Lines to port
72of 99 done
7Phases
5Phases complete
89Confidence
The gist

VentureRaven is not a different application. It is a stale copy of CodeRaven carrying roughly 900 lines of genuinely venture-specific work. The merge moves that content into CodeRaven behind a ProjectKind.venture case and retires the fork. Phases 1–4 produce a usable Ventures workspace. Phases 5–7 close the gap on studios, experts and data.

The problem

The fork is diverging in one direction, and the direction is not “venture versus code.” VentureRaven has taken 47 commits since the fork baseline. Two of those are the mass rebrand (565e8e4, 1,099 Swift files; 946e169, 78 files) and carry no content. Eleven more are a window-sizing fix cycle on 2026-06-26 that ends in 6cf4077 revert: remove all window-sizing hacks; match CodeRaven baseline, netting to zero. One (7833639) is explicitly a port from CodeRaven. The substantive surface is about 33 commits, nearly all of them ideation copy and the 14-layer cascade.

CodeRaven meanwhile has 183 Swift files that VentureRaven has never seen, and has retired whole subsystems VentureRaven still carries. The 44 files that exist only in VentureRaven total 15,473 lines, and spot-checking their history shows why: ToDoStore.swift, MenuBarController.swift, QuickVerifyStore.swift and FeatureLabDeepDiveView.swift all entered VentureRaven at the fork baseline commit 0bd4fc4 itself. VentureRaven did not write them. CodeRaven deleted or rewrote them afterwards, and VentureRaven is simply holding the old copies. CodeRaven's current FeatureLab is a different set of files (FeatureLabRuntime, FeatureLabMiraEngine, FeatureLabFirstPassService) built after the fork.

The sync tax is recurring and already visible in the Chronicle: “Synced VentureRaven to CodeRaven” a month ago, “Fixed Silent Task-Classification and Global-Plan Path Bugs” three weeks ago, the second of which was a blueprint audit finding bugs that had run quietly since the fork.

Approach

A content migration, and almost none of VentureRaven's Swift should move

The genuinely venture-only Swift is three files totalling 444 lines: BusinessPlan.swift (148), BusinessPlanStore.swift (61), CapabilityConstraintsView.swift (235). Two more support the new Foundation layers: EditGenericLayerView.swift (154) and the GenericLayerContext struct at FoundationModels.swift:2092. Add the five layer definitions, the founder-facing prompt copy, and the .capabilityConstraints ideation phase, and the payload is roughly 900 lines. Framing the merge as a port of two codebases makes it a month of refactoring. Framing it as moving 900 lines of content makes it a week.

A mechanical rule decides what is stale

Any VentureRaven file whose history begins at 0bd4fc4 and has not been touched since is a fork-time copy of a CodeRaven file, and CodeRaven's version wins by definition. Only files touched in 0bd4fc4..HEAD are audit surface. That rule collapses the audit from 1,196 differing files to a few dozen and removes the judgment call from most of it.

Ventures follow the Personal pattern exactly, because it works

ProjectKind is already the seam (Models/Project.swift:390). Personal proved the pattern across ProjectTabBar, ProjectOverviewView, AppMainView, ScratchpadView and the git/analysis guards. Adding .venture reuses all of it. A parallel VentureOverviewView would duplicate the tab bar, context row, meeting sheets, deep-link handlers and per-project tab persistence for no gain.

The Foundation layer rawValue has to be fixed before anything else moves

VentureRaven did not add layers to FoundationLayer; it rebranded the existing ones in place. case personas = "Customers", case features = "Offerings", case code = "Operations", plus five genuinely new cases. VentureRaven's own source comments say “identifier kept; label rebranded,” but the identifier it kept is the Swift case name; the rawValue moved. That rawValue is a display string and a persistence key (commitsSinceLayerUpdate[layer.rawValue] in SmartTrigger.swift:448). Merging the two enums naively either breaks CodeRaven's stored trigger state or renames every layer in every codebase project. Splitting identity from label is a prerequisite, and it is a clean standalone refactor with no behavior change.

Ventures keep plans and the pipeline

This is where Ventures differ from Personal. A venture has real sequenced work — sourcing, pricing, a storefront, a launch — and the plan pipeline is verb-appropriate. Personal dropped the pipeline because there was nothing to sequence. Ventures drop the git, build and code-analysis surfaces instead.

Decisions made for you

Corrected after implementation

Studio session type is chosen in the studio and stored on the session

You proposed a simple toggle. I argued inference from project.kind was better, because a toggle asks a question whose answer is already known. The answer is not known: Ideation Studio is not project-scoped. It is the app's home screen, and every entry point clears the selected project before opening it.

So the inference read ProjectManager.currentProject — whatever was last clicked in the sidebar, invisible at that moment — and resumeSession re-inferred the same way, so resuming a venture session while a codebase project was selected would have flipped it mid-session.

The toggle was right. The lens is picked on the welcome screen and stored as IdeationSessionV2.studioKind, which makes resume correct by construction. Worth keeping from the original argument is the concern it raised: founder ideation inside a codebase project produces a business plan with nowhere to land. That is now possible, and the Business Plan capstone should check the lens before offering to seed a Foundation.

Judgment call

rawValue becomes a stable identifier; the label moves to displayName(for:)

CodeRaven's current rawValues stay as the identifiers so no stored data migrates on the CodeRaven side. The venture labels become a lookup keyed on kind. The alternative, two parallel enums, would fork FoundationHealthModel, SmartTriggerService, IdeationFoundationBridge and every layer-selection UI.

Judgment call

The five venture layers live in the same enum, hidden for .project

allCases and displayOrder get replaced at their 63 call sites by cases(for: kind). A separate VentureFoundationLayer enum would need its own health model, its own generation pipeline and its own cascade ordering, all of which already exist.

Revised

The five new layers share one Codable model rather than five

VentureRaven already solved this: GenericLayerContext (FoundationModels.swift:2092) is a summary plus titled sections, and all five new layers are optional properties of that type on the context. EditGenericLayerView edits any of them. CodeRaven has zero references to it, so this arrives as new code rather than a merge. The first draft of this plan called for five bespoke structs.

Judgment call

The vr-* commands are retired rather than renamed back

The eight cr-* commands are the single prefix. CodeRaven already carries eight bundled commands to VentureRaven's seven; cr-corpus is one VentureRaven never received. Venture-specific content, where it differs, folds into the cr-* command as a kind-conditional section.

Scope

The VentureRaven repo is archived rather than deleted

git remote and history stay intact on disk and on origin. Nothing in this plan removes it. VentureRaven's own .claude/context/ has no layer JSON at all, so there is no Foundation migration for the project itself; live venture data is Phase 7.

The work

Phase 1 — Salvage audit: what VentureRaven knows that CodeRaven doesn't

16 tasks COMPLETE. Four VentureRaven-forward fixes found and ported; CodeRaven builds. One item flagged for a decision.
  • Fork point identified: 0bd4fc4 (2026-06-25), which supersedes the earlier guess of 946e169
  • Post-fork commit surface computed: 47 commits, two mass renames, eleven window-sizing commits netting to zero, one port from CodeRaven
  • VentureRaven-only file list computed: 44 files / 15,473 lines, verified stale by their history beginning at 0bd4fc4
  • Tooling commits confirmed already present in CodeRaven: hooks session signals, checkin retirement, review-copy HTML plan scanning
  • Confirmed the deep-dive session-leak guard at IdeationStudioContainerView.swift:399 is absent from CodeRaven
  • Port that session-leak guard into CodeRaven's IdeationStudioContainerView.swift
  • Classify the remaining ideation-content commits as port / discard / already-present
  • Check whether the Spark Inbox commits add anything CodeRaven lacks — they do not
  • Check the two Silent Task-Classification bugs landed in CodeRaven — they originated there
  • Port the retired-.interview stepper fix from faa37b2
  • Port the duplicate route-picker fix from d93f75f
  • Port the route-selection layout fix from d93f75f
  • Write the result to docs/reviews/2026-09-08-ventureraven-salvage.md
  • Verify CodeRaven builds with all four ported fixes
  • Decide whether to port RegenerateButton from 50593bcyou
  • Sarah reviews the salvage list before Phase 2 beginsyou

Phase 2 — Split FoundationLayer identity from label

11 tasks COMPLETE. The deferred threading landed later, once the venture layers made it necessary.
  • Add displayName(for kind:) plus a displayName convenience, returning the current rawValue strings
  • Enumerate every layer.rawValue occurrence and classify as display or storage before changing any — 210 found, not the 168 estimated
  • Replace every terminal-render use with .displayName — 61 conversions across 22 files
  • Leave persistence uses on rawValue — dict keys, populatedLayerNames, sanitized file names, session ids, telemetry, action payloads
  • Decide whether CompactFoundationWidget.swift:280 is identity or display — identity; the three sanitizers stay on rawValue
  • Add static func cases(for kind: ProjectKind) returning today's nine for every kind
  • Add static func displayOrder(for kind:), keeping generation and display order distinct
  • Verify no remaining rawValue use is ambiguous between display and storage
  • Verify CodeRaven builds and the refactor is a runtime no-op
  • Thread the project kind through the allCases/displayOrder call sites — via currentCases/currentDisplayOrder resolved from a didSet, not plumbed through 63 signatures. 53 sites moved
  • Fix the regression the deferral caused — allCases went from nine to fourteen, so a codebase project was listing five layers it can never generate

Phase 3 — The .venture kind, registration and routing

16 tasks COMPLETE. A framed-out idea becomes a venture at the Business Plan.
  • Add case venture with displayName, isVenture and a hasRepository helper, decoded with the .project default
  • Add ventureProjects; narrow codeProjects and sidebarProjects to .project
  • Skip getGitRemote in addProject for any kind without a repository
  • Add a Ventures section to the sidebar below Projects
  • Suppress the git and stale badges for .venture; keep the foundation and plan-count badges
  • Split the row context menu — LAN Sync needs a repository; Reset Foundation and Remove apply to ventures
  • Filter ProjectTabBar — the real gated surfaces are Reports, Feature Lab and git sync, not the tab list the plan named
  • Guard GitCommitWatcher, SmartTriggerService and ProjectGitCache against .venture
  • Guard FindingsIngestor too — findings carry file:line anchors pointing at nothing in a venture
  • Leave MiraDriftScanner on the .personal guard deliberately — a venture Foundation can drift
  • Add a New Venture entry seeding .claude/, docs/plans/ and a starter CLAUDE.md
  • Give New Venture two doors — select a folder, or frame it out in Ideation Studio under the founder lens
  • Let the venture picker create a folder — it demanded one that already existed
  • Wire the Business Plan to seed a venture Foundation, and ask for the folder there — synthesis, review, and handoff
  • Seed only the five venture-only layers, leaving the nine typed ones to the cascade with the plan as context
  • Verify CodeRaven builds with the .venture kind in place

Phase 4 — The venture Foundation cascade

13 tasks Core COMPLETE and building. Grew well beyond its plan: five enum cases touched 53 switches.
  • Add the five new cases with stable rawValues and VentureRaven's SF Symbols
  • Extend displayName to return the founder labels for .venture
  • Extend cases(for:) and displayOrder(for:) via projectCascade (9) and ventureCascade (14)
  • Make fileName kind-aware — NOT in the original plan; porting VentureRaven's renames wholesale would have made every existing project's Foundation read as empty
  • Port GenericLayerContext and GenericLayerSection with tolerant decoders, plus five optional properties on FoundationV2
  • Carry over usesGenericModel
  • Port the venture layer questions as description(for:)
  • Port the generation prompts — instructions, JSON schema and parseGenericLayer
  • Wire the five through the pipeline: storage, save/load, settings, cascade context, status, impact, staleness, export
  • Verify FoundationHealthModel — it iterated allCases, now 14, so every codebase project would have been scored against layers it never generates
  • Verify CodeRaven builds with the 14-layer cascade in place
  • Port EditGenericLayerView so venture layers have an editor — the Foundation tab renders nothing for them today
  • Replace the neutral fallbacks in the ~30 secondary display switches with venture-appropriate values

Phase 5 — Business Plan capstone and the studios

20 tasks COMPLETE. One task discarded on measurement; the founder’s constraints now shape what gets generated.
  • Port BusinessPlan.swift (13 sections) and BusinessPlanStore.swift, retargeting the store's path from VentureRaven's container
  • Port CapabilityConstraintsView.swift and add .capabilityConstraints to IdeationSessionPhase
  • Port BusinessExclusion and ProductionRoute, which the plan had not listed
  • Add four capability fields to IdeationProfileData with decodeIfPresent defaults
  • Map .capabilityConstraints onto .creativeDial's ordinal so no SessionFork cutoff shifts
  • Make IdeationStageGrouping.stages kind-aware
  • Keep CodeRaven's fast-track depth parameter on the kind-aware signature
  • Add the lens chooser on the welcome screen and store it as IdeationSessionV2.studioKind
  • Correct the plan’s premise — the studio is not project-scoped, so the lens cannot be inferred
  • Measure the founder-facing copy in the Beat views — their divergence was almost entirely the RegenerateButton feature, with only 8 string-bearing lines differing across four files. This was first recorded as porting the founder copy, which was wrong: the Beat views were not where it lived
  • Reframe the ideation prompts for a founder — most of the founder copy lived in IdeationPromptLibrary, which the first measurement missed by searching two words instead of diffing the file (708 differing lines). baseIdentity now switches on the lens and 111 substitutions run through StudioVocabulary. Until this landed, a venture session asked business questions and generated apps
  • Add StudioVocabulary so the Threads → Offerings relabel lives in one seam rather than ~60 conditionals
  • Discard the Design Studio port — of 842 differing lines, 114 are the rename and 709 are CodeRaven being ahead in two Mockups files. No venture copy exists therediscarded
  • Verify CodeRaven builds with the venture ideation route and vocabulary in place
  • Port the reframed question bank as per-question variants, app/code/dev questions replaced outright — 125 of 130 carry venture wording; 57 replace the subject, 68 reword it
  • Add the six venture-only questions and the .assetsOutputs facet, with founder-facing labels for every facet
  • Add StudioLens so the non-isolated question selectors can read the lens without reaching into ProjectManager
  • Verify the wiring — 130 questions for a project, 136 for a venture, matching VentureRaven, no orphans or collisions
  • Wire business exclusions into thread generation — identity-level refusals hard-gate, logistics-level ones soft-demote and rank last; tools and routes enter as enablers, never seeds
  • Verify the chain end to end — Setup writes, triage reads, service forwards, prompt gates, schema asks, parser decodes, model carries, triage demotes

Phase 6 — Venture experts, prompts and commands

8 tasks Four bugs Sarah found were fixed ahead of this phase; two remain in it.
  • Diff the two AgentPrompts/ directories and port the seven venture-tuned prompt bodies as kind-conditional variants
  • Scope the default expert roster by kind so ventures get the founder experts primary
  • Fold venture-specific content from the seven vr-* commands into their cr-* equivalents
  • Delete the seven vr-* files from Resources/Commands/
  • Update .claude/settings.json in both repos so the bundled-command list matches
  • Give /cr-entry and /cr-complete a non-git path — both exit 128 in a venture folder, and /cr-entry is what the app auto-launches headlessly at 100%
  • Guard the Blueprints widget by kind — it offers Scan & Generate against a folder with no source
  • Decide what a venture’s Chronicle uses for evidence in place of commits

Phase 7 — Data migration and retiring the repo

7 tasks May move ahead of Phases 5 and 6 if the salvage audit comes back empty, which it is trending toward.
  • Register the venture(s) VentureRaven was being used for as .venture projects in CodeRaven
  • Copy IdeationV2/ — 18 sessions plus phases files and 1 elaboration — checking each decodes against CodeRaven's current IdeationSession shape
  • Check whether stored venture data keys on the rebranded layer rawValues; map them to CodeRaven's identifiers during the copy
  • Copy IdeaVault/idea-bank.json (7 notes) and the 3 SparkInbox/ entries
  • Copy Scratchpad/, Workbench/, PlanTasks/ and Blueprints/ if the salvage audit marks any worth keeping
  • Archive the VentureRaven repo — stop committing, leave history on origin, add a README note pointing at CodeRaven
  • Move this plan and its review copy into CodeRaven so the tracked artifact outlives the repo

Verification

8 tasks Yours to run. Each one is a checkbox in the markdown too.
  • Verify existing projects open with unchanged Foundation labels, plan counts and trigger state after Phase 2you
  • Verify a new venture creates, appears under Ventures, and shows no git badgeyou
  • Verify the venture Foundation shows 14 founder-labelled layers and a codebase project still shows 9you
  • Verify the Foundation health score reads sensibly on a 14-layer venture rather than capping or overflowingyou
  • Verify a venture ideation session reaches a business plan and seeds the Foundationyou
  • Verify a codebase project's ideation session is unchanged, including fast-track depthyou
  • Spot-check five migrated ideation sessions for phase state, brief content and deep-dive attachmentyou
  • Verify the deep-dive session-leak guard by opening a second session after a deep diveyou

Risks & edge cases

Most breakable

rawValue doubles as a storage key in SmartTrigger

If Phase 2 is done carelessly, by changing rawValues rather than adding displayName, every existing project silently loses its commits-since-layer-update counts and the smart triggers go quiet without an error. The 168 occurrences make a careless pass more likely than the original five-site estimate suggested, which is why Phase 2 now enumerates before it edits.

Edge case

MilestoneContextSourcesView uses rawValue for both roles four lines apart

Lines 153, 155 and 164 match against populatedLayerNames (storage) while line 162 renders it (display). A find-and-replace over that file breaks the checkmarks without breaking the build.

Confirmed, unmeasured

14-layer Foundation health scoring needs work of unknown size

FoundationHealthModel's header comment says “all 9 Foundation layers” and it iterates allCases in at least two places. The cascade ordering, the next-layer-to-generate logic and the completeness thresholds all assume nine. I have not traced the scoring math deeply enough to promise it is a denominator change.

Edge case

Migrated ideation sessions may not decode

VentureRaven's IdeationSession has .capabilityConstraints in its phase enum and CodeRaven does not until Phase 5; CodeRaven has fastTrackDepth fields VentureRaven never wrote. Ordering Phase 7 after Phase 5 is the mitigation. A session that fails to decode is a visible failure rather than silent data loss.

New in this revision

Venture data may carry the rebranded layer names as keys

VentureRaven has been persisting with personas serialized as “Customers” and code as “Operations.” Any stored venture Foundation selection or trigger state uses those strings, and CodeRaven will not recognize them. Phase 7 has a task for this, but the size is unknown until the container is inspected.

Softest task

The Design Studio copy port

842 lines across 57 files. I sampled the Ideation divergence in detail without doing the same for this one. It could be label text throughout, or it could hide a structural difference I have not seen. It is placed last within Phase 5 so it can slip without blocking.

Transition

Two prefixes during the window between Phase 6 and the archive

Both cr-* and vr-* exist on disk in different repos. Short window, but a command run from the wrong project during it writes to the wrong place.

Out of scope

Final review

What this plan does well. It refuses the framing that made the merge look enormous. Two 1,400-file codebases sounds like a month; 900 lines of venture content plus one enum refactor is a week, and the measurements support the second reading. The salvage audit now has a mechanical rule — history beginning at 0bd4fc4 means stale — which turns the largest unbounded task into a filter. Phases 1 and 2 are independent and carry no risk to existing work.

What changed since the first draft. Phase 1 has since run to completion: four VentureRaven-forward bugs were found, ported, and verified building in CodeRaven, and the full result is in the salvage audit. Before that, four things were measured rather than estimated. The fork point is 0bd4fc4 rather than the guessed 946e169. Phase 2 is roughly three times the size first stated, at 168 rawValue occurrences and 63 enumeration sites rather than five and forty, and it now needs displayOrder handling that the first draft missed. Phase 4 got simpler: the five new layers share one GenericLayerContext model rather than needing five bespoke Codable structs. Every VentureRaven tooling commit already existed in CodeRaven under a matching commit message, but the ideation commits had never been checked, and four bugs were hiding there.

Where it is weakest. FoundationHealthModel is confirmed to assume nine layers without the extent being known, which is the one place the plan says “verify” where it should eventually say “change these lines.” The Design Studio copy port stays an estimate, and fc85606 is the one VentureRaven commit the audit could not conclusively place in CodeRaven.

What I would adjust if pushed. Nothing, now that the audit has run. The earlier draft held a contingency: if the salvage audit came back nearly empty, Phase 7 should move ahead of Phases 5 and 6 to get the 18 ideation sessions somewhere safe earlier. That contingency is withdrawn. The audit found four real bugs that had accumulated unnoticed since the fork, which argues for finishing the port before archiving anything. The ordering stands as written.

89/100

Up from 87 because Phase 1 is now done rather than estimated, and its result — four ported fixes, CodeRaven building — removed the largest unknown in the plan. The remaining deduction is for FoundationHealthModel's unmeasured scoring math, the unsampled Design Studio divergence, and the venture data's rebranded storage keys.