practice: the learner's creation note — optional free-form input carried to partitioner + generators (owner, 2026-09-29)

- dialog: optional 'Anything else?' textarea (typing-only, 2000-char mirror)
- API: body gains note? — trimmed, whitespace-only omitted, hard 400 over 2000
- pipeline: note persisted on the set and threaded to both agent stages
- agents: THE LEARNER'S NOTE prompt block (present only when set) + the
  weighed-never-owed stance pinned in both doctrines
- fix en route: doubled THE PARAMETERS heading in both prompts since slice 3
  (renderParams owns the heading; the literal blocks removed)
This commit is contained in:
amosblomqvist
2026-09-29 22:16:28 +03:00
parent cf0ec4a2f0
commit 06032769d2
15 changed files with 593 additions and 266 deletions
+6 -1
View File
@@ -275,6 +275,7 @@ export function createPracticePipeline(deps: PracticePipelineDeps) {
set: ProblemSet,
previousProblems: PreviousProblemRef[],
partitionRow: RunningPractice,
note?: string,
): Promise<void> {
const controller = partitionRow.controller;
@@ -308,6 +309,7 @@ export function createPracticePipeline(deps: PracticePipelineDeps) {
propositions: set.propositions,
params: set.params,
previousProblems,
note,
signal: controller.signal,
}),
);
@@ -370,6 +372,7 @@ export function createPracticePipeline(deps: PracticePipelineDeps) {
propositions: set.propositions,
params: set.params,
previousProblems,
note,
signal: row.controller.signal,
});
row.usage = generated.log;
@@ -431,6 +434,7 @@ export function createPracticePipeline(deps: PracticePipelineDeps) {
nodeIds: string[],
params: ProblemSet["params"],
titleHint?: string,
note?: string,
): Promise<{ set: ProblemSet; done: Promise<void> }> {
agents.refuseIfStagesUnready();
@@ -458,11 +462,12 @@ export function createPracticePipeline(deps: PracticePipelineDeps) {
chains,
status: "partitioning",
problems: [],
...(note ? { note } : {}),
});
const previousProblems = dedupInput(deps.practiceStore, selectedIds);
const row = registerRow(`${set.id}:partition`, set.id, "generation", "partitioning", `Partitioning — ${title}`);
const done = generateSet(set, previousProblems, row);
const done = generateSet(set, previousProblems, row, note);
return { set, done };
}