Files
Jyotisha/frontend/src/lib/consultation-workflow-request.ts
T
Jesse_ChenandClaude Opus 5.5 5c65834dda feat(consult): split family into parents and children domains (engine still family)
parents (D12, 4/9 houses, Sun/Moon) and children (D7, 5th house, Jupiter,
PK) are plan/card domains with Chinese labels and the brief's aliases. They
send the family route contract to the engine and are rejected as a stored
session theme, so neither Python nor the chat_sessions.theme CHECK changes.
Methodology reports no strict checklist for them; must-use layers follow the
plan domain. Tests with 原值/新值/原因 where assertions changed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-09-27 02:54:11 +08:00

58 lines
1.9 KiB
TypeScript

import {
consultationDomainDefinition,
consultationDomainIds,
type ConsultationDomain,
type ConsultationTheme,
} from "./consultation-domain-registry.ts";
export { consultationDomainIds as consultationThemeValues };
export type { ConsultationTheme };
export type ConsultationWorkflowRoute = ConsultationDomain | "rectification" | "prashna";
export type ConsultationWorkflowPlanMetadata = Readonly<{
plan_version: string;
depth: string;
requestedDomains: readonly string[];
timingHorizon: string | null;
precisionBoundary: string;
requiredEvidenceCategories: readonly string[];
}>;
type WorkflowProjection = {
question: string;
themes: readonly ConsultationDomain[];
strictWorkflowRoute: ConsultationWorkflowRoute;
requiredLayers: readonly string[];
claimBoundary: string;
plan_version: string;
depth: string;
requested_domains: readonly string[];
timing_horizon: string | null;
precision_boundary: string;
required_evidence_categories: readonly string[];
};
export function projectConsultationWorkflowRequest(
question: string,
theme: ConsultationTheme,
plan: ConsultationWorkflowPlanMetadata,
) {
const requirement = consultationDomainDefinition(theme);
// The engine validates the route contract exactly (consultation_plan_contract.py),
// so a card-only domain (parents, children) sends its engine route's contract.
const engine = consultationDomainDefinition(requirement.strictWorkflowRoute);
return {
question,
themes: requirement.workflowThemes,
strictWorkflowRoute: requirement.strictWorkflowRoute,
requiredLayers: engine.requiredLayers,
claimBoundary: engine.claimBoundary,
plan_version: plan.plan_version,
depth: plan.depth,
requested_domains: plan.requestedDomains,
timing_horizon: plan.timingHorizon,
precision_boundary: plan.precisionBoundary,
required_evidence_categories: plan.requiredEvidenceCategories,
} satisfies WorkflowProjection;
}