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
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.
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.
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.
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.
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.
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 of946e169 - 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:399is 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-
.interviewstepper fix fromfaa37b2 - 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
RegenerateButtonfrom50593bcyou - 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 adisplayNameconvenience, returning the current rawValue strings - Enumerate every
layer.rawValueoccurrence 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:280is identity or display — identity; the three sanitizers stay onrawValue - 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
rawValueuse is ambiguous between display and storage - Verify CodeRaven builds and the refactor is a runtime no-op
- Thread the project kind through the
allCases/displayOrdercall sites — viacurrentCases/currentDisplayOrderresolved from adidSet, not plumbed through 63 signatures. 53 sites moved - Fix the regression the deferral caused —
allCaseswent 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 venturewithdisplayName,isVentureand ahasRepositoryhelper, decoded with the.projectdefault - Add
ventureProjects; narrowcodeProjectsandsidebarProjectsto.project - Skip
getGitRemoteinaddProjectfor 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,SmartTriggerServiceandProjectGitCacheagainst.venture - Guard
FindingsIngestortoo — findings carryfile:lineanchors pointing at nothing in a venture - Leave
MiraDriftScanneron the.personalguard deliberately — a venture Foundation can drift - Add a New Venture entry seeding
.claude/,docs/plans/and a starterCLAUDE.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
.venturekind 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
displayNameto return the founder labels for.venture - Extend
cases(for:)anddisplayOrder(for:)viaprojectCascade(9) andventureCascade(14) - Make
fileNamekind-aware — NOT in the original plan; porting VentureRaven's renames wholesale would have made every existing project's Foundation read as empty - Port
GenericLayerContextandGenericLayerSectionwith tolerant decoders, plus five optional properties onFoundationV2 - 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 iteratedallCases, 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
EditGenericLayerViewso 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) andBusinessPlanStore.swift, retargeting the store's path from VentureRaven's container - Port
CapabilityConstraintsView.swiftand add.capabilityConstraintstoIdeationSessionPhase - Port
BusinessExclusionandProductionRoute, which the plan had not listed - Add four capability fields to
IdeationProfileDatawithdecodeIfPresentdefaults - Map
.capabilityConstraintsonto.creativeDial's ordinal so noSessionForkcutoff shifts - Make
IdeationStageGrouping.stageskind-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).baseIdentitynow switches on the lens and 111 substitutions run throughStudioVocabulary. Until this landed, a venture session asked business questions and generated apps - Add
StudioVocabularyso 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
.assetsOutputsfacet, with founder-facing labels for every facet - Add
StudioLensso the non-isolated question selectors can read the lens without reaching intoProjectManager - 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 theircr-*equivalents - Delete the seven
vr-*files fromResources/Commands/ - Update
.claude/settings.jsonin both repos so the bundled-command list matches - Give
/cr-entryand/cr-completea non-git path — both exit 128 in a venture folder, and/cr-entryis 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
.ventureprojects in CodeRaven - Copy
IdeationV2/— 18 sessions plus phases files and 1 elaboration — checking each decodes against CodeRaven's currentIdeationSessionshape - 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 3SparkInbox/entries - Copy
Scratchpad/,Workbench/,PlanTasks/andBlueprints/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
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.
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.
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.
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.
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.
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.
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
- Any external or sellable framing of Ventures. Both apps are internal.
- The “Capital Studio” module
BusinessPlan.swift's header defers to — TAM/SAM/SOM, projections, the ask. - Merging Personal and Ventures into a single generalized workspace abstraction. Three concrete kinds are clearer than one abstraction over two of them; revisit at a fourth.
- Mobile sync for ventures.
MobileSyncModels.swift:168already carries the kind rawValue, so this is additive later. - Recovering the retired subsystems VentureRaven still holds (ToDos, MenuBar, QuickChecks, the old FeatureLab). CodeRaven removed them deliberately after the fork; VentureRaven's copies are the pre-removal state.
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.
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.