From b920691540cdc33fc1484775fac3d60d6621edb8 Mon Sep 17 00:00:00 2001 From: artale Date: Sat, 27 Jun 2026 14:31:10 +0200 Subject: [PATCH] feat: classify feedback work-data signals --- src/fable5/feedback-memory.test.ts | 2 +- src/fable5/feedback-memory.ts | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/fable5/feedback-memory.test.ts b/src/fable5/feedback-memory.test.ts index 1aea850..74162da 100644 --- a/src/fable5/feedback-memory.test.ts +++ b/src/fable5/feedback-memory.test.ts @@ -38,7 +38,7 @@ describe("feedback memory", () => { const root = tmpRoot(); const receipt = writeFeedbackReceipt(root, "performance", "users want receipts", "test", new Date("2026-06-18T00:00:00.000Z")); - expect(receipt).toMatchObject({ schema: "fable.feedback.receipt.v1", source: "test", type: "performance" }); + expect(receipt).toMatchObject({ schema: "fable.feedback.receipt.v1", source: "test", type: "performance", signal: "performance" }); expect(fs.existsSync(path.join(root, ".fable", "feedback", "2026-06-18T00-00-00-000Z-performance.json"))).toBe(true); expect(fs.readFileSync(receipt.memoryPath, "utf-8")).toContain("users want receipts"); }); diff --git a/src/fable5/feedback-memory.ts b/src/fable5/feedback-memory.ts index e4e3a3e..3855e1a 100644 --- a/src/fable5/feedback-memory.ts +++ b/src/fable5/feedback-memory.ts @@ -2,6 +2,7 @@ import * as fs from "node:fs"; import * as path from "node:path"; export type FeedbackMemoryType = "approved" | "rejected" | "performance"; +export type FeedbackSignal = "quality_bar" | "correction" | "performance"; export interface FeedbackMemoryEntry { type: FeedbackMemoryType; @@ -12,6 +13,7 @@ export interface FeedbackMemoryEntry { export interface FeedbackReceipt extends FeedbackMemoryEntry { schema: "fable.feedback.receipt.v1"; source: string; + signal: FeedbackSignal; memoryPath: string; } @@ -36,13 +38,19 @@ export function appendFeedbackMemory(repo: string, type: FeedbackMemoryType, tex export function writeFeedbackReceipt(repo: string, type: FeedbackMemoryType, text: string, source = "cli", now = new Date()): FeedbackReceipt { const entry = appendFeedbackMemory(repo, type, text, now); - const receipt: FeedbackReceipt = { schema: "fable.feedback.receipt.v1", ...entry, source, memoryPath: feedbackMemoryPath(repo, type) }; + const receipt: FeedbackReceipt = { schema: "fable.feedback.receipt.v1", ...entry, source, signal: feedbackSignal(type), memoryPath: feedbackMemoryPath(repo, type) }; const dir = path.join(repo, ".fable", "feedback"); fs.mkdirSync(dir, { recursive: true }); fs.writeFileSync(path.join(dir, `${entry.createdAt.replace(/[:.]/g, "-")}-${type}.json`), `${JSON.stringify(receipt, null, 2)}\n`); return receipt; } +function feedbackSignal(type: FeedbackMemoryType): FeedbackSignal { + if (type === "approved") return "quality_bar"; + if (type === "rejected") return "correction"; + return "performance"; +} + export function feedbackMemoryStats(repo: string): Record { return Object.fromEntries((Object.keys(FILES) as FeedbackMemoryType[]).map((type) => { const file = feedbackMemoryPath(repo, type);