Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion vessel/src/lib/raven/__tests__/mirrorArtifactKinds.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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',
);
});

Expand Down
7 changes: 5 additions & 2 deletions vessel/src/lib/raven/mirrorArtifactKinds.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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)
*
Expand Down Expand Up @@ -63,15 +66,15 @@ export type MirrorBackstageMethod = 'hook_stack' | 'relational_hook_stack';
/** User-facing product titles. */
export const MIRROR_REPORT_FAMILY_TITLE: Record<MirrorReportFamily, string> = {
solo_mirror: 'Solo Mirror',
synastry_mirror: 'Synastry Mirror Report',
synastry_mirror: 'Relationship Mirror Report',
symbolic_moment: 'Symbolic Moment Report',
symbolic_weather: 'Symbolic Weather Report',
};

/** User-facing second-pass titles. */
export const MIRROR_FULL_READ_LABEL_TITLE: Record<MirrorFullReadLabel, string> = {
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',
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Comment on lines +42 to +45
### 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).
Expand All @@ -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.

---

Expand Down
22 changes: 17 additions & 5 deletions vessel/src/lib/runtimeEventSessionScope.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,22 @@ function readPayloadRecord(event: RuntimeSystemEvent): Record<string, unknown> |
return payload;
}

function readTopLevelRecord(event: RuntimeSystemEvent): Record<string, unknown> {
return event as unknown as Record<string, unknown>;
}
Comment on lines +19 to +21

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();
}

Comment on lines +29 to +33
const inputSnapshot = payload?.inputSnapshot ?? topLevel.inputSnapshot;
if (inputSnapshot && typeof inputSnapshot === "object") {
const sessionId = (inputSnapshot as Record<string, unknown>).sessionId;
if (typeof sessionId === "string" && sessionId.trim()) {
Expand All @@ -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;
}

Expand Down
Loading