wave 7: the prober reads its map — graph-context injection dies whole
The owner's zero-configuration ruling (2026-09-23): nothing configures the graph beyond chat models. The prior-knowledge injection — its budget dial, its runner, its marker part, its dock/dispatch entries — is removed across all bands; the prober now reads the learner's persistent knowledge map on demand through two gated tools instead: - list_sessions: every birth session, names + kinds + counts + dates (graphSessionIndex, Platform's core seam) - list_propositions(session): what was born there + the session's own latest understanding level + that evaluation's date (graphSessionPropositions) — names/levels/dating ONLY, no statement text (owner ruling: the map's organization is the prober's business, its prose is not) Registered via createProberTools when chat-handler passes graphStore (the graphToolsEnabled gate decided server-side, per-turn fresh); the prober doctrine gains the map-review nudge at session start. Also: runner's JobKind special-casing collapses (KIND_ROLE/KIND_RUNNERS are plain records again), semantic-clusters.ts dies with its test, the embedder dep's doc tells the wave-7 stub story, and ports.ts's readClusterLabels/readNamingRuns surface stays untouched for Platform's ledger-port interlude. 848/848 tests, typecheck/lint/build green.
This commit is contained in:
@@ -7,11 +7,11 @@
|
||||
* of "ai" (safe everywhere: server, client, tests). See docs/vision.md.
|
||||
*/
|
||||
import type { UIMessage } from "ai";
|
||||
import type { CallUsage, GraphContextData } from "./chat.ts";
|
||||
import type { CallUsage } from "./chat.ts";
|
||||
|
||||
// ─── Async sub-agent jobs (vision §2.5; plan.md Wave 0 protocol) ────────────
|
||||
|
||||
export type JobKind = "research" | "demo" | "visual" | "pdf" | "graph-context";
|
||||
export type JobKind = "research" | "demo" | "visual" | "pdf";
|
||||
export type JobStatus = "running" | "done" | "error";
|
||||
|
||||
export interface JobRecord {
|
||||
@@ -295,8 +295,7 @@ export interface AbortSteerMessage extends UIMessage {
|
||||
export type SteerMessage =
|
||||
| SubagentSteerMessage
|
||||
| AbortSteerMessage
|
||||
| ProbeHandoffSteerMessage
|
||||
| GraphContextSteerMessage;
|
||||
| ProbeHandoffSteerMessage;
|
||||
|
||||
/** Whether a result is the failure shape (html/svg empty, failure brief). */
|
||||
export function isSubagentFailure(
|
||||
@@ -426,34 +425,6 @@ export function buildProbeHandoffSteer(chatId: string): ProbeHandoffSteerMessage
|
||||
};
|
||||
}
|
||||
|
||||
// ─── the graph-context steer (vision-context-injection.md) ───────────────────
|
||||
//
|
||||
// The injection's delivery: same wake pipeline, same gates — it queues
|
||||
// behind a pending quiz and rides the turn after the learner's answer, or
|
||||
// fires in the pump's idle window. Marker-only (the custom-message scheme):
|
||||
// no text part; the adapter flattens data-graph-context to graphContextText
|
||||
// (core/contracts/chat.ts owns the wording). One per chat, ever — the id is
|
||||
// deterministic per chat, so re-delivery is idempotent.
|
||||
|
||||
export interface GraphContextSteerMessage extends UIMessage {
|
||||
id: `steer_ctx_${string}`;
|
||||
role: "user";
|
||||
metadata: { graphContext: { chatId: string; jobId: string } };
|
||||
parts: [{ type: "data-graph-context"; data: GraphContextData }];
|
||||
}
|
||||
|
||||
export function buildGraphContextSteer(
|
||||
meta: { chatId: string; jobId: string },
|
||||
data: GraphContextData,
|
||||
): GraphContextSteerMessage {
|
||||
return {
|
||||
id: `steer_ctx_${meta.chatId}`,
|
||||
role: "user",
|
||||
metadata: { graphContext: meta },
|
||||
parts: [{ type: "data-graph-context", data }],
|
||||
};
|
||||
}
|
||||
|
||||
/** True when the transcript already carries this steer — idempotent
|
||||
* delivery for ANY steer kind: every steer id is deterministic per its
|
||||
* event (steer_<jobId> for jobs, steer_probe_<chatId> for the handoff). */
|
||||
|
||||
Reference in New Issue
Block a user