Files
Jyotisha/docs/superpowers/specs/2026-07-19-private-consultation-entrypoints-design.md
T
2026-07-19 14:51:06 +08:00

58 lines
3.6 KiB
Markdown

# Private Consultation Entrypoints Design
## Goal
Make the “今日星语” and “生时校正” cards behave like concise product entrypoints without exposing internal consultation instructions in the composer, transcript, browser bundle, or persisted chat history.
## Approved interaction
- Clicking anywhere on the 今日星语 card places `深入看今日` in the composer.
- Clicking the 生时校正 card places `生时校正` before a result exists and `再次校正` after a candidate or confirmed time exists.
- Each card remains a semantic `article`; one stretched native button covers the card, and a quiet action label with an arrow sits at the lower-right edge.
- The cards contain no nested visible button, so mobile layouts do not create a large control in the middle of the content.
- Keyboard focus, disabled state, and the 44px interaction requirement apply to the whole-card button.
## Request contract
The browser may send one optional, closed entrypoint value:
```ts
type ConsultationEntrypoint =
| "daily_starlanguage"
| "birth_time_rectification";
```
The visible `question` remains the exact short sentence displayed to the user. The server validates the optional entrypoint and expands it into the internal model question. Arbitrary template names or client-authored prompt content are rejected by schema validation.
Normal typed questions omit `entrypoint` and retain their current behavior.
## Composer and transcript behavior
- Card selection stores the short visible question plus an internal entrypoint enum in React state.
- Any manual edit to the composer clears the entrypoint enum, so edited text is treated as an ordinary user question.
- Sending clears both fields.
- Undo/cancel restores both fields, preserving the same behavior when the user retries.
- Optimistic messages, persisted chat sessions, sharing, and future conversation history store only the visible short question.
## Server behavior
- A server-only resolver owns both internal prompt templates.
- `daily_starlanguage` expands with authoritative server time, the validated birth/chart input, the requested daily sections, and the existing non-deterministic boundary.
- `birth_time_rectification` expands with the validated birth/chart input, a request to continue or restart evidence-led rectification, and the existing rule that a candidate is not a proven birth minute.
- The expanded question is used both in the final Agent message and in `consultationInputSchema` passed to the calculation tool.
- User-visible history remains unchanged and never receives the expanded text.
- Prompt-extraction safety continues to inspect user-controlled visible content; the trusted server expansion is not treated as user input.
## Failure behavior
- Unknown entrypoint values return the existing 400 invalid-request response before billing.
- A valid entrypoint with an edited visible sentence is impossible through the product UI because editing clears the enum; the server still treats the enum as authoritative if a direct API client supplies both.
- Billing, cancellation settlement, streaming, model selection, and ordinary questions retain their current paths.
## Verification
- Unit tests prove each entrypoint selects a server expansion without pinning natural-language prompt prose.
- Route contract tests prove the enum is optional, invalid values fail, and the expanded question reaches both Agent and tool input.
- Client tests prove the browser source no longer contains the internal daily or rectification prompt builders, manual editing clears intent, and cancellation restores it.
- Browser QA verifies whole-card click, short composer text, keyboard focus, and desktop/390px mobile layout.