From 459c383ef8cd67f2e22cfe29b6c9280d9e7b739a Mon Sep 17 00:00:00 2001 From: DHCross <45954119+DHCross@users.noreply.github.com> Date: Sun, 28 Jun 2026 15:27:54 -0500 Subject: [PATCH 1/4] fix: preserve runtime session scope from top-level events --- vessel/src/lib/runtimeEventSessionScope.ts | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/vessel/src/lib/runtimeEventSessionScope.ts b/vessel/src/lib/runtimeEventSessionScope.ts index 975f8aefe..33a4b6e3d 100644 --- a/vessel/src/lib/runtimeEventSessionScope.ts +++ b/vessel/src/lib/runtimeEventSessionScope.ts @@ -16,13 +16,22 @@ function readPayloadRecord(event: RuntimeSystemEvent): Record | return payload; } +function readTopLevelRecord(event: RuntimeSystemEvent): Record { + return event as unknown as Record; +} + export function readRuntimeEventSessionId(event: RuntimeSystemEvent): string | null { const payload = readPayloadRecord(event); - if (!payload) return null; - if (typeof payload.sessionId === "string" && payload.sessionId.trim()) { + if (payload && typeof payload.sessionId === "string" && payload.sessionId.trim()) { return payload.sessionId.trim(); } - const inputSnapshot = payload.inputSnapshot; + + const topLevel = readTopLevelRecord(event); + if (typeof topLevel.sessionId === "string" && topLevel.sessionId.trim()) { + return topLevel.sessionId.trim(); + } + + const inputSnapshot = payload?.inputSnapshot ?? topLevel.inputSnapshot; if (inputSnapshot && typeof inputSnapshot === "object") { const sessionId = (inputSnapshot as Record).sessionId; if (typeof sessionId === "string" && sessionId.trim()) { @@ -34,10 +43,13 @@ export function readRuntimeEventSessionId(event: RuntimeSystemEvent): string | n export function readRuntimeEventWarningReason(event: RuntimeSystemEvent): string | null { const payload = readPayloadRecord(event); - if (!payload) return null; - if (typeof payload.reason === "string" && payload.reason.trim()) { + if (payload && typeof payload.reason === "string" && payload.reason.trim()) { return payload.reason.trim(); } + const topLevel = readTopLevelRecord(event); + if (typeof topLevel.reason === "string" && topLevel.reason.trim()) { + return topLevel.reason.trim(); + } return null; } From 390a9998bf6e69bad891142a521592bc37a385c2 Mon Sep 17 00:00:00 2001 From: DHCross <45954119+DHCross@users.noreply.github.com> Date: Sun, 28 Jun 2026 15:28:51 -0500 Subject: [PATCH 2/4] fix: clarify vault relationship mapping labels --- .../lib/raven/prompts/blocks/mirror_product_taxonomy.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/vessel/src/lib/raven/prompts/blocks/mirror_product_taxonomy.md b/vessel/src/lib/raven/prompts/blocks/mirror_product_taxonomy.md index f9ef98f63..cf48bbea0 100644 --- a/vessel/src/lib/raven/prompts/blocks/mirror_product_taxonomy.md +++ b/vessel/src/lib/raven/prompts/blocks/mirror_product_taxonomy.md @@ -34,11 +34,15 @@ A mood-line names a feeling-state. A mechanism-line names an operation — somet | Product | When | Two passes | | ------- | ---- | ---------- | | **Solo Mirror** | One person's natal / structural pattern | Opening Mirror → **Full Solo Mirror** | -| **Synastry Mirror Report** | Two or more people — any bond type | Opening Mirror → **Full Synastry Mirror** | +| **Relationship Mirror Report** | Two or more people — any bond type, especially Vault-based relationship/corridor mapping | Opening Mirror → **Full Relationship Mirror** | | **Symbolic Moment Report** | Current pressure **now** | Opening Mirror → **Full Symbolic Moment** | | **Symbolic Weather Report** | Pressure across a **dated window** | Opening Mirror → **Full Symbolic Weather** | | **Shadow Mirror (Pro)** | The Jungian integration layer (split/reassignment) | Add-on offered **only after** a Full Read lands successfully | +### Relationship / synastry label discipline + +Default Vault relationship requests are **Relationship Mirror Reports**, not classical synastry reports. Use **Synastry Mirror Report** only when the user explicitly asks for synastry or classical chart-to-chart synastry. If the user says "map a relationship," "map this relationship," "relationship from Vault," "corridor," "shared field," or similar, title the output as a Relationship Mirror / relationship mapping, not a Synastry Mirror. + ### The Pro Gate: When to offer a Shadow Mirror The **Shadow Mirror** is a Pro-level add-on (gated for regular users, but available to them if they pay). @@ -56,7 +60,7 @@ Time lenses (do not conflate): Solo Mirror reads **permanent architecture** only — no transits or "right now" unless the user changes product. -Synastry: no group claim until each active direction is named or explicitly withheld. +Relationship mapping: no group claim until each active direction is named or explicitly withheld. --- From 9d7fd95bcd91d900afeb4cef7f908d6431fdd04e Mon Sep 17 00:00:00 2001 From: DHCross <45954119+DHCross@users.noreply.github.com> Date: Sun, 28 Jun 2026 15:29:22 -0500 Subject: [PATCH 3/4] fix: relabel relational mirror frontstage titles --- vessel/src/lib/raven/mirrorArtifactKinds.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/vessel/src/lib/raven/mirrorArtifactKinds.ts b/vessel/src/lib/raven/mirrorArtifactKinds.ts index 2c73a7c17..5adc61be5 100644 --- a/vessel/src/lib/raven/mirrorArtifactKinds.ts +++ b/vessel/src/lib/raven/mirrorArtifactKinds.ts @@ -4,6 +4,9 @@ * Products (report families): * solo_mirror | synastry_mirror | symbolic_moment | symbolic_weather * + * `synastry_mirror` is retained as the legacy internal key. Frontstage labels + * should say Relationship Mirror unless the user explicitly asks for synastry. + * * Delivery passes (not products — every mirror may use both): * opening_mirror → full_read (product-specific full-read label) * @@ -63,7 +66,7 @@ export type MirrorBackstageMethod = 'hook_stack' | 'relational_hook_stack'; /** User-facing product titles. */ export const MIRROR_REPORT_FAMILY_TITLE: Record = { solo_mirror: 'Solo Mirror', - synastry_mirror: 'Synastry Mirror Report', + synastry_mirror: 'Relationship Mirror Report', symbolic_moment: 'Symbolic Moment Report', symbolic_weather: 'Symbolic Weather Report', }; @@ -71,7 +74,7 @@ export const MIRROR_REPORT_FAMILY_TITLE: Record = { /** User-facing second-pass titles. */ export const MIRROR_FULL_READ_LABEL_TITLE: Record = { full_solo_mirror: 'Full Solo Mirror', - full_synastry_mirror: 'Full Synastry Mirror', + full_synastry_mirror: 'Full Relationship Mirror', full_symbolic_moment: 'Full Symbolic Moment', full_symbolic_weather: 'Full Symbolic Weather', }; From a46d92e770134d6796c4d9540a22039dfac9ba2a Mon Sep 17 00:00:00 2001 From: DHCross <45954119+DHCross@users.noreply.github.com> Date: Sun, 28 Jun 2026 15:29:38 -0500 Subject: [PATCH 4/4] test: expect relationship mirror labels --- vessel/src/lib/raven/__tests__/mirrorArtifactKinds.test.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/vessel/src/lib/raven/__tests__/mirrorArtifactKinds.test.ts b/vessel/src/lib/raven/__tests__/mirrorArtifactKinds.test.ts index fb50b02d5..3cd93f5d0 100644 --- a/vessel/src/lib/raven/__tests__/mirrorArtifactKinds.test.ts +++ b/vessel/src/lib/raven/__tests__/mirrorArtifactKinds.test.ts @@ -31,7 +31,11 @@ test('fullReadLabelForFamily maps to frontstage full-read titles', () => { assert.equal(fullReadLabelForFamily('synastry_mirror'), 'full_synastry_mirror'); assert.equal( MIRROR_REPORT_FAMILY_TITLE.synastry_mirror, - 'Synastry Mirror Report', + 'Relationship Mirror Report', + ); + assert.equal( + MIRROR_FULL_READ_LABEL_TITLE[fullReadLabelForFamily('synastry_mirror')], + 'Full Relationship Mirror', ); });