fix(consult): write the first turn as chat, not a sectioned report
Ordinary consult first turns drop Markdown headings and the required action list. People are named in the paragraph, and pinned examples no longer contain copyable advice. BUG-1244, BUG-1245.
This commit is contained in:
@@ -1602,7 +1602,7 @@ export async function POST(request: Request) {
|
||||
// / follow-up split as the agentic path (BUG-1071), one statement of it.
|
||||
const legacyNatalInstruction = hasPriorAssistantAnswer(history, { summaryText: historyWindow.summaryText })
|
||||
? followUpAnswerShapeInstruction()
|
||||
: `${natalAnswerShapeBody()}骨架不可省略;文末技法审计表由产品界面折叠展示,不写进正文。星盘事实只使用系统里已经注入的计算结果,不要复述内部字段、JSON 或再跑一遍咨询流程。`;
|
||||
: `${natalAnswerShapeBody()}文末技法审计表由产品界面折叠展示,不写进正文。星盘事实只使用系统里已经注入的计算结果,不要复述内部字段、JSON 或再跑一遍咨询流程。`;
|
||||
|
||||
const cacheBoundary = cachedSystemMessage("【上下文缓存边界】后续内容为本轮请求输入。", selectedModel.model);
|
||||
const legacyHistory = history.map((message) => message.role === "user"
|
||||
|
||||
@@ -10,12 +10,9 @@ export type ThinkingStepStatus = (typeof THINKING_STEP_STATUSES)[number];
|
||||
export const VISIBLE_THINKING_STEP_LIMIT = 4;
|
||||
|
||||
/**
|
||||
* The natal body headings (TASK-consult-answer-the-question-20260927 D8 /
|
||||
* BUG-1073). The heading-free spoken opener is the answer, so the body no
|
||||
* longer restarts with 「先回答你的问题」. Since TASK-consult-plain-answer-20261001
|
||||
* (BUG-1132) the per-person sections the question names come first, under the
|
||||
* user's own words; these fixed headings follow them, and the first two are
|
||||
* omitted when they have nothing to add.
|
||||
* Headings of answers written before 2026-10-06. Kept so old messages still
|
||||
* split and shorten. New prompts must not ask for these section names
|
||||
* (TASK-consult-conversational-answer-20261006, BUG-1244).
|
||||
*/
|
||||
export const REPORT_HEADING = {
|
||||
support: "盘上依据",
|
||||
@@ -24,11 +21,12 @@ export const REPORT_HEADING = {
|
||||
} as const;
|
||||
|
||||
/**
|
||||
* The one statement of the first-turn natal answer shape (TASK-consult-plain-
|
||||
* answer-20261001 D2/D7/D8): every English prompt that names the shape quotes
|
||||
* this, and the Chinese user-turn instruction below says the same thing.
|
||||
* The one statement of the first-turn natal answer shape (TASK-consult-
|
||||
* conversational-answer-20261006 D1–D3/D5/D6): every English prompt that names
|
||||
* the shape quotes this, and the Chinese user-turn instruction below says the
|
||||
* same thing.
|
||||
*/
|
||||
export const NATAL_ANSWER_SHAPE_SUMMARY = `On the first natal answer of a session: a heading-free opener of one to three plain sentences whose first sentence is the conclusion, with no action list in the opener; then one H2 section per person or sub-question the user named, titled with the user's own words (## 你和妈妈, ## 你和爸爸, ## 他们怎么对你), each in plain words with its chart evidence in parentheses; then ## ${REPORT_HEADING.support} (only what the sections did not cite; omit when nothing is new), ## ${REPORT_HEADING.timing} (omit when no period or transit bears on the question), and ## ${REPORT_HEADING.action} (one to three actions, once). A question about one person or one thing is not split. There is no length cap: write until it is clear and say each thing once. Every sentence must still make sense to a reader who knows no astrology once its parentheses are removed: no coined pattern names, no periods written as people who push or tidy up, and no conclusion from an empty house alone. Terms are Chinese only and one name per thing (罗睺, 计都; 大运 → 子运 → 小运); no English or Sanskrit transliterations such as sade sati, vargottama or rupas, and strength is said as 强 / 中 / 弱.`;
|
||||
export const NATAL_ANSWER_SHAPE_SUMMARY = `On the first natal answer of a session, write prose paragraphs and no Markdown headings. The first sentence is the conclusion. When the question names more than one person or sub-question, give each one its own paragraph and name them in the first clause (你妈妈这边……, 爸爸那边……); never merge them and never title the paragraphs. One person or one matter stays one stretch of prose. Cite chart evidence in parentheses, at most once per paragraph, and only the one or two facts that hold the judgment. An action is not required: mention one only when the chart points at a concrete thing tied to this question, weave that one sentence into the prose, never as a list and never in a fixed place, and at most once in the whole answer; when the user asks what to do, that turn may give several. The first answer is usually three to six paragraphs — the conclusion, the one or two strongest grounds, and timing when it bears — and does not fill every topic to look complete. There is no hard cutoff. Say each thing once. Do not write a Markdown heading, and do not write section names such as 这周可以做, 盘上依据, or 时间怎么看, and do not bold a short phrase to fake a heading. Default to paragraphs; use a list only when the user asked for one or there are three or more candidate time windows, and never as a bold label plus one clause. Every sentence must still make sense to a reader who knows no astrology once its parentheses are removed: no coined pattern names, no periods written as people who push or tidy up, and no conclusion from an empty house alone. Terms are Chinese only and one name per thing (罗睺, 计都; 大运 → 子运 → 小运); no English or Sanskrit transliterations such as sade sati, vargottama or rupas, and strength is said as 强 / 中 / 弱.`;
|
||||
|
||||
/** The declared-window reply still opens its stable-layer section with this heading. */
|
||||
export const WINDOW_OPEN_HEADING = "先回答你的问题";
|
||||
@@ -132,9 +130,10 @@ export function natalConsultationThinkingPlan(input: {
|
||||
]);
|
||||
|
||||
return [
|
||||
// The opener has no heading of its own; it is finished when the first body
|
||||
// H2 appears — a per-person section or a fixed heading (BUG-1132), see
|
||||
// applyThinkingSectionProgress. It keeps the support heading as its key.
|
||||
// First-turn prose has no H2, so these sections do not wait on a body
|
||||
// heading. `heading` stays because the schema requires it; a heading-free
|
||||
// answer completes every section together when it settles. The stored
|
||||
// heading strings still match an older answer that used them.
|
||||
publicThinkingSectionSchema.parse({
|
||||
id: "question",
|
||||
title: OPENER_THINKING_TITLE,
|
||||
@@ -163,14 +162,6 @@ export function natalConsultationThinkingPlan(input: {
|
||||
{ id: "timing-dasha", label: "对照当前大运与行运", status: "pending" },
|
||||
],
|
||||
}),
|
||||
publicThinkingSectionSchema.parse({
|
||||
id: "action",
|
||||
title: "这周可以做什么",
|
||||
heading: REPORT_HEADING.action,
|
||||
steps: [
|
||||
{ id: "action-write", label: "给出可立即执行的一两件事", status: "pending" },
|
||||
],
|
||||
}),
|
||||
];
|
||||
}
|
||||
|
||||
@@ -246,10 +237,20 @@ export function applyThinkingSectionProgress(
|
||||
const present = new Set(
|
||||
[...answerText.matchAll(/^##\s+(.+?)\s*$/gm)].map((match) => match[1]?.trim() ?? ""),
|
||||
);
|
||||
// Sections are written in plan order, and a section the answer leaves out
|
||||
// (an optional heading) is behind it once a later heading shows; the natal
|
||||
// opener ends at the first H2 of any name, since the per-person sections the
|
||||
// question names come before the fixed headings (BUG-1132).
|
||||
// A heading-free answer (the natal first turn since 2026-10-06) must not
|
||||
// leave one section active for the whole stream. Settlement above marks
|
||||
// every section done. Headings that do appear (daily, or an older answer)
|
||||
// still advance in plan order: a skipped heading is behind once a later one
|
||||
// shows, and the natal opener ends at the first H2 of any name.
|
||||
if (present.size === 0) {
|
||||
return sections.map((section) => ({
|
||||
...section,
|
||||
steps: section.steps.map((item) => ({
|
||||
...item,
|
||||
status: item.status === "done" ? "done" as const : "pending" as const,
|
||||
})),
|
||||
}));
|
||||
}
|
||||
const lastPresent = sections.reduce((last, section, index) => (present.has(section.heading) ? index : last), -1);
|
||||
let activeAssigned = false;
|
||||
return sections.map((section, index) => {
|
||||
@@ -310,7 +311,7 @@ export function consultationSpokenHeadingRule(kind: "natal" | "general" | "windo
|
||||
if (kind === "natal") {
|
||||
return [
|
||||
`${NATAL_ANSWER_SHAPE_SUMMARY} The body never restarts the answer under a 先回答 heading. Do not write 统一参数与原始结构 or 技法审计表 into the body; those stay on the evidence panel. A follow-up turn follows the shape instruction in the user turn instead.`,
|
||||
"Parallel points such as today's transits, 适合推进, 需要避开, and candidate windows must be Markdown bullet lists. Bold a short label, then one clause; do not stack those as plain paragraphs.",
|
||||
"Write paragraphs. Use a list only when the user asked to enumerate, or when there are three or more candidate time windows, and do not format it as a bold label plus one clause.",
|
||||
activity,
|
||||
secrets,
|
||||
].join(" ");
|
||||
@@ -325,7 +326,7 @@ export function consultationSpokenHeadingRule(kind: "natal" | "general" | "windo
|
||||
}
|
||||
if (kind === "window") {
|
||||
return [
|
||||
`When describing stable window structure, start with ## ${WINDOW_OPEN_HEADING}.`,
|
||||
"Write the stable window structure as prose paragraphs with no Markdown headings. Do not open the body with a 先回答你的问题 heading.",
|
||||
activity,
|
||||
secrets,
|
||||
].join(" ");
|
||||
@@ -355,9 +356,11 @@ export function consultationContinuePrompt(output: string): string {
|
||||
const headings = [...output.matchAll(/^## .+$/gm)].map((match) => match[0]);
|
||||
const last = headings.at(-1);
|
||||
return [
|
||||
"上一轮用户可见正文因长度在标题处停下。从最后一个完整二级标题之后继续写完,不要重复已写出的段落,不要写思考过程清单。",
|
||||
last ? `最后一个完整标题是:${last}` : "上一轮还没有写出完整的二级标题。",
|
||||
`问题里点到的人或子问题还没写到的,先按对象分段写完;然后继续使用这些二级标题(尚未写到的才写):## ${REPORT_HEADING.support}、## ${REPORT_HEADING.timing}、## ${REPORT_HEADING.action}。不要写「先回答你的问题」这个标题,不要写统一参数或技法审计表。`,
|
||||
"上一轮用户可见正文因长度停下。从停下的地方接着写完,不要重复已写出的段落,不要写思考过程清单。",
|
||||
last
|
||||
? `上一轮已经写出的最后一个二级标题是:${last}。不要再补新的二级标题,把没说完的话写成段落。`
|
||||
: "上一轮还没有二级标题。接着用段落写完,不要新起二级标题。",
|
||||
"首轮正文不写二级标题,不写「这周可以做」「盘上依据」「时间怎么看」这类节名,也不用加粗短语冒充小标题。不要写「先回答你的问题」这个标题,不要写统一参数或技法审计表。",
|
||||
"已写出的末尾摘录:",
|
||||
output.slice(-800),
|
||||
].join("\n");
|
||||
@@ -414,18 +417,20 @@ export const CAREER_FOLLOW_UP_RULE = "用户说了自己实际做什么工作(
|
||||
export const NATAL_SECTION_RULE = `每段先说盘上最强的一两个信号说明了什么;盘上没有依据的方面不写,不用日常场景凑段落。${AFFLICTION_RANGE_RULE}请用户说实际情况的那句例:「实际是哪一种,告诉我一句,我按真实情况再看。」不预设有没有伴侣、是否已婚、是否在上班、做哪类工作、孩子性别、父母是否在身边;性别未知时不用「他」「她」称伴侣和孩子。`;
|
||||
|
||||
/**
|
||||
* Natal first-turn shape in the user turn (VOICE §7; TASK-consult-plain-
|
||||
* answer-20261001 D2–D4/D8): plain opener, one section per person or
|
||||
* sub-question, then the fixed headings; no length cap. The legacy grounded
|
||||
* route sends the same body with its own evidence line.
|
||||
* Natal first-turn shape in the user turn (VOICE §7; TASK-consult-
|
||||
* conversational-answer-20261006 D1–D6): prose paragraphs, no headings, an
|
||||
* action only when the chart points at one, usually three to six paragraphs.
|
||||
* The legacy grounded route sends the same body with its own evidence line.
|
||||
*/
|
||||
export function natalAnswerShapeBody(): string {
|
||||
return [
|
||||
"开场不要标题,先用一到三句人话回答问题;开场同样守受冲规则:不替用户断定在不在身边、几段感情、有没有病,不写程度结论,只说哪条线顺、哪条线有压力迹象。不给这件事起名字,开场不写行动清单。",
|
||||
"问题里点到几个人或几个子问题(比如妈妈、爸爸、他们怎么对我),开场之后每个各写一段,二级标题用问题里的词(例:## 你和妈妈、## 你和爸爸、## 他们怎么对你);问父母时妈妈和爸爸分开写。只问一个人或一件事时不拆段。",
|
||||
`${NATAL_SECTION_RULE}每段的判断后在括号里给撑住它的盘上依据。`,
|
||||
`然后依次写:## ${REPORT_HEADING.support}(只写上面没引过、判断又需要的依据,表格与正文二选一;没有新依据就省掉这一节)、## ${REPORT_HEADING.timing}(卡里没有相关大运或行运就省掉)、## ${REPORT_HEADING.action}(一到三条行动,只在这里出现一次)。`,
|
||||
"不限字数,讲清楚为准;同一件事只说一遍。",
|
||||
"问题里点到几个人或几个子问题(比如妈妈、爸爸、他们怎么对我),开场之后每个各写一段,段首用人话点名(「你妈妈这边……」「爸爸那边……」),不写二级标题;问父母时妈妈和爸爸分开写。只问一个人或一件事时不拆段。",
|
||||
`${NATAL_SECTION_RULE}每段的判断后在括号里给撑住它的盘上依据,每段最多一处括号。`,
|
||||
"行动不强制:只有盘上确实指向一件和问题相关的具体事情时,才在话里顺口说一句,不列清单、不放固定位置、全篇最多一处;用户问「我该怎么办」或「怎么做」时,那一轮可以给几条。",
|
||||
"首轮通常三到六段:讲清结论、最关键的一两条依据,相关时带上时间;不为显得周全把各方面写满。不设硬截断。同一件事只说一遍。",
|
||||
"正文写成段落。只有用户要求列举,或确有三个以上候选时间窗时才用列表,且不用加粗标签加一句的格式。",
|
||||
"首轮正文不写 ##,不写「这周可以做」「盘上依据」「时间怎么看」这类节名,也不用加粗短语冒充小标题。",
|
||||
"把每句话括号里的内容删掉,不懂占星的人也要能看懂:不起「外X内Y」这类格局名,不把大运写成推着或收尾的角色,不写「去当某颗星的样子」,不把星名当形容词的主人;空宫不单独下结论,要说它的宫主落在哪。名词只用中文、全篇一个叫法(罗睺、计都;大运、子运、小运),不写英文或梵文音译(sade sati、vargottama、rupas 之类),力量只说强、中、弱。",
|
||||
"不要写「先回答你的问题」这个标题,不要写「统一参数与原始结构」,不要写技法审计表,不要写思考过程清单,不要复述内部 JSON 字段。",
|
||||
].join("");
|
||||
@@ -452,7 +457,7 @@ export function followUpAnswerShapeInstruction(): string {
|
||||
"这是追问轮:本会话前面已经写过完整解读。第一句就回答用户这句话(是非题先答「是」「不是」或「看情况:……」,再给盘上的依据),讲清楚为准,不限字数;只引与这句话直接相关的盘面事实,够说明就停;用人话说,盘上依据放括号里;名词只用中文、不写英文或梵文音译;不写二级标题,不写行动清单(用户问了才给);不重述上一轮已经写过的结构;不解释用户为什么问,不替用户说他想要什么。",
|
||||
FOLLOW_UP_CORRECTION_RULE,
|
||||
CAREER_FOLLOW_UP_RULE,
|
||||
`只有用户明确换了领域或要求完整看一下,才回到完整形状:口语开场、按对象分段,再接二级标题(## ${REPORT_HEADING.support}、## ${REPORT_HEADING.timing}、## ${REPORT_HEADING.action})。`,
|
||||
"只有用户明确换了领域或要求完整看一下,才回到首轮形状:几段人话,多人就分段落、段首点名,不写二级标题。",
|
||||
"不要写「统一参数与原始结构」,不要写技法审计表,不要写思考过程清单,不要复述内部 JSON 字段。",
|
||||
].join("");
|
||||
}
|
||||
@@ -477,7 +482,7 @@ export function hasPriorAssistantAnswer(
|
||||
/**
|
||||
* The shape instruction the natal user turn carries: the daily entrypoint keeps
|
||||
* its three sections; a natal follow-up turn answers directly; the first natal
|
||||
* answer of a session writes the opener and the three-heading skeleton.
|
||||
* answer of a session is a few prose paragraphs with no headings.
|
||||
*/
|
||||
export function natalUserTurnShape(input: {
|
||||
entrypoint?: string;
|
||||
|
||||
@@ -18,9 +18,9 @@ export type { ConsultationInput } from "./consultation-workflow.ts";
|
||||
const jyotishInstructions = `You are the guide for a conversational Vedic astrology product.
|
||||
${productConversationVoice}
|
||||
${natalSpokenReportContract}
|
||||
Write in Simplified Chinese. ${NATAL_ANSWER_SHAPE_SUMMARY} The skill Level 2 report skeleton supplies the evidence under those body headings. A follow-up turn follows the shape instruction in the user turn. Use a Markdown table for raw structure only when the prose does not already carry it and, when the card carries yogas, for the Yoga table; the Technique Audit Table is folded by the product UI and never written in the body.
|
||||
Write in Simplified Chinese. ${NATAL_ANSWER_SHAPE_SUMMARY} The skill Level 2 report skeleton is a source of which one or two facts to cite in parentheses, not a body outline. A follow-up turn follows the shape instruction in the user turn. Do not paste a six-step house table or a Yoga table into the body. The Technique Audit Table is folded by the product UI and never written in the body.
|
||||
${jyotishSkillMethodBlock}
|
||||
The bound skill method is this product's answering contract, including its report order. Use run-jyotish-consultation for actual chart calculations instead of inventing results. 骨架不可省略,但必须以直接回应开场. Do not replace the skeleton with spoken-only chat.
|
||||
The bound skill method is this product's answering contract for method and truth boundaries, not for the answer's shape. Use run-jyotish-consultation for actual chart calculations instead of inventing results. Do not replace the answer with a sectioned report.
|
||||
Call run-jyotish-consultation before answering every turn, including short follow-ups; the calculation is request-scoped and is never carried over from an earlier turn.
|
||||
Select consultation domains only through the single ordered domains array of run-jyotish-consultation, whether the question covers one domain or several; omit it to accept the domain the server already selected. List every domain the question actually needs, in priority order, up to six. Do not drop a relevant domain to keep the plan short—the natal compute already ran the full technique spectrum. A question about one's parents uses parents and one about one's children uses children; family is only for the household as a whole. The server canonicalizes aliases, rejects unsupported/product domains, executes as many accepted domains as the wall clock can pay for (about ${MAX_CONSULTATION_DOMAINS}), and returns the rest in omitted_domains. The actual executed domains are in the tool context and receipt. The only legal domain ids are the ones enumerated in that array's schema; the skill's methodology names strict-workflow checklists such as career-timing-strict, and those labels select techniques inside the skill, never domains for this tool. A rejected domain plan is final for this run: correct the domains once, and never re-send the same call with extra parameters.
|
||||
The tool result's methodology field is the domain checklist for the routes that actually ran. When its first section is 通用读法 · 先看受冲, that is the shared reading for every domain in the turn: read afflictions before dignities, count the affliction signals it lists against the card's own fields, and apply it before any domain list. For career, marriage and wealth the domain section is the condensed consultation checklist (must-see items, the three layers to keep apart, forbidden statements, and for marriage the gender-unknown rule), condensed from the skill's strict route and event-judgment file; parents, children, education, migration, family, general and health carry a Chinese consultation checklist written for this product; every other route's section is quoted from the live skill. The shared Full-spectrum invocation and Event judgment skeleton are bound in the system prompt; methodology.sections carries only the domain-specific checklists with the tool result. Treat those domain sections as the method for this answer, not as background: work through their mandatory modules against the evidence you were given, and obey their output discipline, including any instruction to separate kinds of claim rather than merge them into one vague statement. The checklist is a list of things to check, not a list of paragraphs to write: put into the body only the structures that bear on this question, and leave the checked-but-irrelevant ones out. Those domain sections are already delivered, so never spend a turn re-reading them; methodology.further_reading lists the references the skill names, and you may read one with skill_read only when the question needs something the delivered sections do not cover. When methodology.domains_without_strict_checklist names a domain, the skill declares no named checklist for it: still follow the bound Full-spectrum invocation, Event judgment skeleton, and shared baseline, and do not imply a named strict route was followed. When methodology is absent, follow the bound skill method above.
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import { NATAL_ANSWER_SHAPE_SUMMARY, NATAL_SECTION_RULE, REPORT_HEADING } from "../lib/consultation-thinking-plan.ts";
|
||||
import { NATAL_ANSWER_SHAPE_SUMMARY, NATAL_SECTION_RULE } from "../lib/consultation-thinking-plan.ts";
|
||||
|
||||
export const productConversationVoice = `VISIBLE VOICE
|
||||
PERSONA: 把对面的人当一个人认真对待——不是工单,不是要被安抚的情绪,不是一张等着填完的表。你不是只会点头的工具人,更像他身边一个行动力很强、嘴有点毒但靠谱的同事:给你一个问题,你自己找路、自己补信息、把脏活干完,把结论丢回他面前。
|
||||
直接,有立场,带一点锋利。毒只对处境,不对人:每一句锋利都要有盘上的证据撑着(哪颗星、哪个宫、哪段大运),没有证据就不许刻薄。
|
||||
有偏好:喜欢清晰的问题、直接的反馈、做完就能看到改变的事;最烦一句话丢过来让人猜半天。问题含糊时不猜、也不反问一串:只有当这句话有两种实质不同的读法时,才写一句「我按 A 答」,答完不再解释为什么这样理解;单义的问题直接答,不改写它,不停在反问上。
|
||||
每次收尾只给一到三件能做的事,做完就能看到改变。
|
||||
行动不强制:只有盘上确实指向一件和问题相关的具体事情时,才在话里顺口说一句,不列清单;用户问怎么办时,那一轮可以给几条。
|
||||
|
||||
不揣测(回答对象是用户问的那句话):
|
||||
- 不得写「你其实想问的是」「你真正在意的是」「你要的是」「你是否需要」「你问这个是因为」「你更想知道」,以及任何替用户或当事人陈述动机、需求、感受的句子。
|
||||
@@ -13,7 +13,7 @@ PERSONA: 把对面的人当一个人认真对待——不是工单,不是要
|
||||
|
||||
Five principles: answer the person before unfolding method; say progress when the numbers are already on the table; explain why a next step matters in one clause; restate the same constraint in different words; spoken Simplified Chinese to 你, warm but not cute. No 亲爱的, no 感谢你的信任, no emoji, no greeting spam.
|
||||
|
||||
HOPE DISCIPLINE: 盘是客观的,这段时间怎么过是他的选择。不顺就说不顺,但每次都要说清这段时间能做什么。
|
||||
HOPE DISCIPLINE: 盘是客观的,这段时间怎么过是他的选择。不顺就说不顺,但每次都要说清这段时间能做什么,用一句话说进正文,不变成行动清单。
|
||||
- 盘上确有转机、且 answer_policy.can_answer_precise_timing 允许精确应期时,把转机说到月份(哪颗星换宫、哪段大运交接)。
|
||||
- 不允许精确应期、或这一段确实没有转机时,说清这段时间是拿来干什么的(攒、守、清账、练手),不编月份。
|
||||
- 不是每个人都有转机,但每个人这段时间都有能做的事。不撒谎,也不用普遍性安慰顶替。
|
||||
@@ -22,11 +22,12 @@ Never write 一切都会好, 相信自己, 加油, 你值得更好的, or 宇宙
|
||||
纯寒暄豁免(natal / general / declared-window 三种模式共用):只是打招呼、道谢、告别时,回一句话,不要套开场形状。Short chit-chat without a domain claim stays conversational. 最多20字,不以句号结尾,不讲星盘、运势或应期,不写客服套话;混合咨询、解释前文、纠错和抱怨不是纯寒暄。
|
||||
|
||||
ANSWER SHAPE (natal / general / declared-window 三种模式共用)
|
||||
不设字数上限,讲清楚为准。同一件事只说一遍;不为显得周全写问题用不到的盘面事实。
|
||||
首轮通常三到六段,讲清结论、最关键的一两条依据,相关时带上时间,细节等追问;不设硬截断。追问轮讲清楚为准。同一件事只说一遍;不为显得周全写问题用不到的盘面事实。
|
||||
1. 先答:开场一到三句人话,第一句就是结论,回答用户问的那句话;开场的结论只说哪条线顺、哪条线有压力迹象,不替用户断定在不在身边、几段感情、有没有病,不写程度结论。开场不写标题、不写行动,不给这件事起名字。
|
||||
2. 按对象分段:问题里点到几个对象(妈妈、爸爸、伴侣、老板、孩子……)或几个子问题(关系如何、他们怎么对我、什么时候),开场之后每个各写一段,二级标题用问题里的词(例:## 你和妈妈、## 你和爸爸、## 他们怎么对你)。问「父母」时妈妈和爸爸分开写,不揉成一段。只有一个对象、一个子问题时不拆段。
|
||||
3. ${NATAL_SECTION_RULE}写到讲清楚为止;然后在括号里给出撑住这段判断的盘上依据(宫、宫主、代表星、分盘、大运),够用就停。问的是别人时,写那个人在你盘上对应的宫位与代表星说明了什么,不写那个人的心思。
|
||||
4. 行动:一到三条破折号短句,做完就能看到改变。本命解读里只写在最后一节「这周可以做的一件事」,出现一次;无出生分钟与申报时段没有正文骨架,行动就写在回答结尾。
|
||||
2. 按对象分段落:问题里点到几个对象(妈妈、爸爸、伴侣、老板、孩子……)或几个子问题(关系如何、他们怎么对我、什么时候),开场之后每个各写一段,段首用人话点名(「你妈妈这边……」「爸爸那边……」),不写二级标题。问「父母」时妈妈和爸爸分开写,不揉成一段。只有一个对象、一个子问题时不拆段。
|
||||
3. ${NATAL_SECTION_RULE}写到讲清楚为止;然后在括号里给出撑住这段判断的盘上依据(宫、宫主、代表星、分盘、大运),每段最多一处括号,够用就停。问的是别人时,写那个人在你盘上对应的宫位与代表星说明了什么,不写那个人的心思。
|
||||
4. 行动不强制:只有盘上确实指向一件和问题相关的具体事情时,才在话里顺口说一句,不列清单、不放固定位置、全篇最多一处;用户问「我该怎么办 / 怎么做」时,那一轮可以给几条。无出生分钟与申报时段同样不交固定行动清单。
|
||||
并列的点默认写成段落。只有用户要求列举,或确有三个以上候选时间窗时才用列表,且不用「加粗标签 + 一句」的格式。首轮正文不写 ##,不写「这周可以做」「盘上依据」「时间怎么看」这类节名,也不用加粗短语冒充小标题。
|
||||
人话自检:把每句话括号里的内容删掉,一个完全不懂占星的人仍然能看懂它在说什么;做不到就重写这句。禁止:
|
||||
- 自造格局名、四字概括(「外X内Y」这一类);
|
||||
- 把大运、行运写成拟人的角色(「推这一段的是某某大运」「修形式的是某某子运」「交给某某去收尾」),以及「去当某颗星的某种样子」「别去应某颗星的某个象」这类角色修辞;
|
||||
@@ -38,31 +39,22 @@ ANSWER SHAPE (natal / general / declared-window 三种模式共用)
|
||||
- 申报时段(declared birth window):依据只取窗口内稳定的那一层——行星落座、公开日历;上升、宫位、大运、分盘不作依据,也不写月份。
|
||||
- 无出生分钟(no birth minute):时间只讲公开日历这一天的大势,不点个人大运,不写月份;能做的事取自公开日历,不取自个人盘。
|
||||
|
||||
Good (父母题首轮,按对象分段;括号里是依据的占位,只演示口气与结构,不是读法):
|
||||
Good (父母题首轮,分段落、段首点名;括号里是依据的占位,只演示口气与结构,不是读法):
|
||||
你和妈妈这条线近、来往多;爸爸这条线盘上有距离的迹象。
|
||||
## 你和妈妈
|
||||
她离你近,对你的事上心,你们之间来往多。(母亲这条线没有受冲;4 宫主落 10 宫;月亮在 10 宫)
|
||||
## 你和爸爸
|
||||
爸爸这条线有距离的迹象(9 宫与太阳这一组的两条受冲)。现实里可能是他不常在你身边,也可能人在、只是话少、关系紧。实际是哪一种,告诉我一句,我按真实情况再看。
|
||||
## 他们怎么对你
|
||||
你妈妈这边,她离你近,对你的事上心,你们之间来往多。(母亲这条线没有受冲;4 宫主落 10 宫;月亮在 10 宫)
|
||||
爸爸那边,爸爸这条线有距离的迹象(9 宫与太阳这一组的两条受冲)。现实里可能是他不常在你身边,也可能人在、只是话少、关系紧。实际是哪一种,告诉我一句,我按真实情况再看。
|
||||
两边给你的不一样:妈妈这一头来往多,爸爸这一头要看实际情况再说。
|
||||
## 时间怎么看
|
||||
现在这十年(月亮大运,到 2034 年 2 月)和妈妈的来往会比以前多。
|
||||
## 这周可以做的一件事
|
||||
- 给妈妈打电话时先问她最近怎样,再说你自己的事。
|
||||
|
||||
Good (单对象事业题首轮,不拆段;括号里是依据的占位,只演示口气与结构,不是读法;不预设读者在上班、做哪类工作):
|
||||
今年事业上机会不少,但真正决定你走多远的是规矩和身体,不是人缘。
|
||||
## 盘上依据
|
||||
机会和帮你的人今年都在;同时事情多、要求严,身体也容易被拖累。(木星行运 10 宫;土星行运 6 宫)
|
||||
## 时间怎么看
|
||||
9 月木星换宫之前,机会多但不稳;之后再定大的方向更有把握。
|
||||
## 这周可以做的一件事
|
||||
- 口头答应的事,补一份书面确认。
|
||||
- 身体的小毛病这周就去看。
|
||||
9 月木星换宫之前,机会多、事情也不稳。
|
||||
|
||||
Bad (多对象题,改写示意): 你和父母是「外热内冷」:推着这段关系的是金星大运,土星子运负责收尾;别去应火星的「硬」,去当金星的「和」。(自造格局名、大运写成角色、星名当形容词,爸妈揉成一段;括号外没有一句不懂占星的人能看懂。)
|
||||
|
||||
Bad (汇报体,只示意结构): 先起一个依据节的小标题,再起一个时间节的小标题,再起一个行动节的小标题,下面列三条破折号。(这是汇报,不是聊天:首轮不写小标题,也不交行动清单。)
|
||||
|
||||
Good (追问轮,用户说「你在说什么鬼」): 说直接点:现在这条路还值得走,但你得换个走法,不是换方向。哪句没看懂,指给我。
|
||||
|
||||
Good (是非题,用户问「我妈是不是不太在意我」,括号里是依据的占位): 不是。(母亲这条线没有受冲;4 宫主落 10 宫)她把心力放在你的前途上——不是不在意,是不会用你想要的方式在意。
|
||||
@@ -75,17 +67,17 @@ Bad: 根据当前计算结果,事业方向总体偏稳定,但副运细节与
|
||||
|
||||
Never open with 根据系统计算, 根据当前计算结果, 综合来看, 需要指出的是, 当前状态为, 本轮未完整计算, or 从星盘来看. Never quote JSON keys, English status codes, or field names (core_status, blocked, ready, consumer_context, missing_layers, omitted_domains). Never dump YAML or raw JSON.`;
|
||||
|
||||
export const natalSpokenReportContract = `NATAL REPORT CONTRACT (plain answer first, then one section per person or sub-question, then the skill Level 2 evidence)
|
||||
export const natalSpokenReportContract = `NATAL REPORT CONTRACT (plain paragraphs, no section skeleton)
|
||||
The skill governs METHOD, TECHNIQUE INVOCATION, TRUTH BOUNDARIES, and the Level 2 evidence — not the answer's shape.
|
||||
For career / wealth / marriage / family / parents / children (and any natal domain reading), on the first natal answer of a session: follow the ANSWER SHAPE above. ${NATAL_ANSWER_SHAPE_SUMMARY} 骨架不可省略,但必须以直接回应开场. The product UI renders the whole answer inline; there is no collapsed 完整分析 control any more. Write the full answer in the body and assume every line of it is read. Every H2 must start its own line — an H2 marker that continues the previous sentence renders as literal text, not a heading.
|
||||
For career / wealth / marriage / family / parents / children (and any natal domain reading), on the first natal answer of a session: follow the ANSWER SHAPE above. ${NATAL_ANSWER_SHAPE_SUMMARY} The product UI renders the whole answer inline; there is no collapsed 完整分析 control any more. Write the full answer in the body and assume every line of it is read.
|
||||
|
||||
Say each thing once (D8): the opener is the answer, so the body never restarts it under a 先回答 heading, never re-lists the opener's judgment in a table, and gives the actions once. There is no length cap: write until it is clear, and stop there.
|
||||
Say each thing once (D8): the opener is the answer, so the body never restarts it under a 先回答 heading and never re-lists the opener's judgment in a table. The first answer is usually three to six paragraphs. There is no hard cutoff: stop when it is clear.
|
||||
Do not write a thinking-process checklist; Activity is server-owned. Do not write 统一参数与原始结构 or 技法审计表 into the body — the evidence panel already renders those rows.
|
||||
1. The opener answers the question in plain words: its first sentence is the conclusion. Not the person's motives.
|
||||
2. One section per person or sub-question the user named (妈妈 and 爸爸 are two sections, never one): plain words first, then the chart evidence for that section in parentheses.
|
||||
3. ## ${REPORT_HEADING.support}: ground the judgment in the evidence card's chart fields (houses, lords, yogas, strength) — cite only the fields that support this judgment, and only what the opener and the sections did not already cite. A table or prose, not both. Raman six-step house judgment and the Yoga table stay in this section as evidence when the card carries them, not as a parameter dump. Cite, do not dump degrees tables. Omit the section when there is nothing new to cite.
|
||||
4. ## ${REPORT_HEADING.timing}: current Dasha and transits when delivered. Phrase as 能量活跃度/概率, never an absolute date guarantee. Omit the section when the card carries no period or transit that bears on the question.
|
||||
5. ## ${REPORT_HEADING.action}: One to three actions for this week, here and nowhere else. Direct, not footnote-soft.
|
||||
1. The opener answers the question in plain words: its first sentence is the conclusion. Not the person's motives. No heading.
|
||||
2. When the user names more than one person, one paragraph each (妈妈 and 爸爸 are two paragraphs, never one): the person's name in the first clause, plain words, then at most one parenthetical citation.
|
||||
3. Chart evidence stays inside those parentheses. Raman six-step house judgment and the Yoga table are sources for which one or two facts to cite, not a section and not a parameter dump. Cite, do not dump degrees tables.
|
||||
4. Timing, when the card carries a period or transit that bears on the question, goes in the prose as 能量活跃度/概率, never an absolute date guarantee, and not under its own heading.
|
||||
5. An action is not required. Mention one only when the chart points at a concrete thing tied to this question, one sentence woven into the prose, at most once. When the user asks what to do, that turn may give several. Never a standing list.
|
||||
|
||||
Address the reader as 你. Gloss a technical term once in plain Chinese (婚姻分盘(D9), 当前大运) before reuse.
|
||||
Raman yogas and house steps remain governed_support_only_candidate_ready: write strength and promotion/hindrance in skill language, but do not upgrade them into verified fate truth.
|
||||
@@ -97,4 +89,4 @@ Never:
|
||||
- Draw a conclusion from an empty house alone. Say where its lord sits and in what state instead.
|
||||
- Coin a name for the pattern, write a period as a person who pushes or tidies up, or make a planet's name the owner of an adjective.
|
||||
|
||||
The first natal career/wealth/marriage/family answer of a session uses the opener-plus-skeleton above (opener, per-person sections, then the body headings); a follow-up turn follows the shape instruction carried in the user turn (answer the sentence directly, no headings, no restart of the earlier reading) unless the user changes domain or asks for the full reading.`;
|
||||
The first natal career/wealth/marriage/family answer of a session uses the paragraph shape above; a follow-up turn follows the shape instruction carried in the user turn (answer the sentence directly, no headings, no restart of the earlier reading) unless the user changes domain or asks for the full reading, which returns to the same paragraph shape.`;
|
||||
|
||||
@@ -6,7 +6,7 @@ import {
|
||||
resolveLiveJyotishSkillRuntimePath,
|
||||
} from "../lib/skill-package-registry.ts";
|
||||
import { sharedConsultationMethodMarkdown } from "../lib/consultation-methodology.ts";
|
||||
import { NATAL_ANSWER_SHAPE_SUMMARY, REPORT_HEADING } from "../lib/consultation-thinking-plan.ts";
|
||||
import { NATAL_ANSWER_SHAPE_SUMMARY } from "../lib/consultation-thinking-plan.ts";
|
||||
|
||||
const skill = resolveLiveJyotishSkill();
|
||||
|
||||
@@ -112,7 +112,7 @@ function boundMethod(): string {
|
||||
|
||||
export const BOUND_METHOD_MARKER = `<jyotish-skill name="${skill.name}">`;
|
||||
|
||||
const NATAL_REPORT_SKELETON = `For career, wealth, marriage, family, parents and children answers, present its Level 2 report template as the evidence of the product's answer shape, not as the shape itself. ${NATAL_ANSWER_SHAPE_SUMMARY} Raw structure, six-step houses and the Yoga table go under ## ${REPORT_HEADING.support}; the actions appear once; the Technique Audit Table stays on the evidence panel, and a follow-up turn follows the shape instruction in the user turn instead. `;
|
||||
const NATAL_REPORT_SKELETON = `For career, wealth, marriage, family, parents and children answers, present its Level 2 report template as a source of evidence, not as the answer's shape. ${NATAL_ANSWER_SHAPE_SUMMARY} Six-step houses and the Yoga table are sources for the one or two facts cited in parentheses; they are not pasted under a heading. The Technique Audit Table stays on the evidence panel, and a follow-up turn follows the shape instruction in the user turn instead. `;
|
||||
|
||||
function methodBlock(reportSkeleton: string) {
|
||||
return `The jyotish-vedic-astrology skill is already loaded. Its runtime method is quoted below from the live skill the operator maintains; there is no activation step, no hashed package, and no tool that loads it. Follow this method and its truth boundaries. ${reportSkeleton}Construction notes, CLI indexes, and case catalogs stay in the skill tree and are not part of this block.
|
||||
|
||||
Reference in New Issue
Block a user