From 637ec66b79b91b1a77f8fad87a1a0967d4b1aa50 Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Wed, 21 Oct 2026 21:09:53 -0400 Subject: [PATCH] docs(6208): SettingsView comments state the reason, not the instance that taught it Record and milestone citations go; the ACT-arm bar split and the per-arm budgets state why they exist without the measurements that motivated them. A comment about a removed think_enabled setting, pointing at a file that no longer exists, is deleted, as is the story of a removed design-system picker. Co-Authored-By: Claude Opus 5.5 --- frontend/src/views/SettingsView.vue | 82 ++++++++++++----------------- 1 file changed, 35 insertions(+), 47 deletions(-) diff --git a/frontend/src/views/SettingsView.vue b/frontend/src/views/SettingsView.vue index 17854217..3373f108 100644 --- a/frontend/src/views/SettingsView.vue +++ b/frontend/src/views/SettingsView.vue @@ -20,7 +20,7 @@ const store = useSettingsStore(); const authStore = useAuthStore(); const toastStore = useToastStore(); -// ── Shared areas (milestone 307) ──────────────────────────────────────── +// ── Shared areas ──────────────────────────────────────────────────────── // The global vocabulary a project's Systems map onto. Admin-only to WRITE — // a global list anyone can extend stops being a shared list — but every user // reads it, which is why the catalog lives in a store rather than here. @@ -75,7 +75,7 @@ async function saveArea() { savingArea.value = false; } } -// ── Platforms (milestone 463) ─────────────────────────────────────────── +// ── Platforms ─────────────────────────────────────────────────────────── // The global list of what a project can be built on or ship as. Same split // as the areas: admin-only to write, readable by everyone. Markers are the // repo-relative globs that let a coverage refresh DETECT a platform; they @@ -157,46 +157,43 @@ const kbInjectThreshold = ref("0.55"); const kbInjectTopK = ref("3"); const kbWritePathEnabled = ref(true); // The write-path arm's OWN threshold, stricter than auto-inject's 0.55 above: -// code embeddings sit on a much higher similarity floor than prose, so 0.55 let -// unrelated code through (#2223). Shares top-k, not the threshold. +// code embeddings sit on a much higher similarity floor than prose, so 0.55 +// lets unrelated code through. Shares top-k, not the threshold. const kbWritePathThreshold = ref("0.68"); const kbRuleHintThreshold = ref("0.72"); const kbCheckpointThreshold = ref("0.80"); -// The two ACT arms no longer share a bar (#3853). A write-path query is a code -// payload; a pre-tool query is a shell command, often under a dozen words — -// less text, less signal, lower scores for the same relevance. Measured at one -// shared 0.72 the two behaved like different subsystems: the write-path arm -// spoke on 37% of its calls, the command arm on 2% of 11,768. +// The two ACT arms do not share a bar. A write-path query is a code payload; a +// pre-tool query is a shell command, often under a dozen words — less text, +// less signal, lower scores for the same relevance — so one shared bar makes +// them behave like different subsystems. const kbToolRuleThreshold = ref("0.68"); // And the prompt boundary is a third query shape again — the operator's own -// prose rather than anything a tool produced (#3852). +// prose rather than anything a tool produced. const kbPromptRuleThreshold = ref("0.72"); -// The reply arm (milestone 458): its bar is the bar at which a finished reply +// The reply arm: its bar is the bar at which a finished reply // is HELD for one read, so it sits with the checkpoint, not with the hints. const kbReplyRuleThreshold = ref("0.8"); -// The BUDGETS, one per arm (#4102). Until this step only auto-inject had one -// and every other arm's ceiling was a module constant nobody could reach — so -// the only control an operator had over a noisy surface was to raise its bar, -// which discards the surface's best candidates along with its worst. A budget -// keeps the top of the ranking and drops the tail, which is what was wanted. +// The BUDGETS, one per arm. Without one, the only control over a noisy surface +// is raising its bar, which discards the surface's best candidates along with +// its worst. A budget keeps the top of the ranking and drops the tail. const kbWritePathTopK = ref("3"); const kbRuleHintTopK = ref("5"); const kbToolRuleTopK = ref("5"); const kbPromptRuleTopK = ref("3"); const kbReplyRuleTopK = ref("1"); // What has been changed about retrieval, newest first — the review surface for -// changes the model made on the operator's behalf (#4102). +// changes the model made on the operator's behalf. const tuningEvents = ref([]); const loadingTuning = ref(false); // Near-duplicate report floors, one per record kind (services/dedup.py). // Snippets are single-chunk, so their floor sits below the 0.90 write-time // gate and catches what it lets through. Notes/tasks are scored at chunk -// grain (#280) — related families clear 0.90 easily — so their floor sits +// grain — related families clear 0.90 easily — so their floor sits // above the gate to keep the report pointed at genuinely-alike records. const kbDupThresholdSnippet = ref("0.82"); const kbDupThresholdNote = ref("0.93"); const kbDupThresholdTask = ref("0.93"); -// The create gate's bars (#4385). Defaults mirror services/dedup.py. +// The create gate's bars. Defaults mirror services/dedup.py. const kbGateThreshold = ref("0.9"); const kbGateThresholdSnippet = ref("0.96"); const kbGateThresholdLesson = ref("0.96"); @@ -207,11 +204,6 @@ const kbPlanMatchThreshold = ref("0.80"); const savingKbInject = ref(false); const kbInjectSaved = ref(false); -// think_enabled setting removed 2026-05-23. The chat+curator architecture -// has tools=[] on the chat model; think on a no-tools conversational pass -// is pure latency cost. See generation_task.py:run_generation comment for -// the full reasoning. - function detectTimezone() { userTimezone.value = Intl.DateTimeFormat().resolvedOptions().timeZone; } @@ -246,7 +238,7 @@ async function saveRetention() { } } -// One entry in the retrieval tuning trail (#4102). Mirrors +// One entry in the retrieval tuning trail. Mirrors // RetrievalTuningEvent.to_dict() — `old_value` is null for the first change to // a surface, which is a different event from moving off a value somebody chose // and renders differently below. @@ -262,7 +254,7 @@ interface TuningEvent { } // What a dial's number was measured against, and whether that space has moved -// (#4104). Mirrors the `calibration` block `current_settings` returns per dial. +// Mirrors the `calibration` block `current_settings` returns per dial. // `stale` is nullable on purpose: a dial moved before Scribe recorded stamps is // UNKNOWN rather than fine, and rendering the two the same would hide the case // most likely to be wrong. @@ -335,7 +327,7 @@ async function loadTuningHistory() { } } -/** Who moved a dial. Three answers, not two (#4225). +/** Who moved a dial. Three answers, not two. * * `release` means the shipped default itself changed between versions — no * user turned anything. Folding that into the `human ? 'you' : 'Claude'` @@ -445,9 +437,8 @@ async function saveKbInject() { // corpus confident enough to be read first" — and a number that moves // when another moves is a number nobody can reason about. kb_checkpoint_threshold: String(cpT), - // A FOURTH and FIFTH bar, and they are separate keys on purpose: the - // whole finding of #3853 is that one number cannot serve arms whose - // queries are different shapes. Moving one must not move the others. + // A FOURTH and FIFTH bar, and they are separate keys on purpose: one + // number cannot serve arms whose queries are different shapes. Moving one must not move the others. kb_toolrule_threshold: String(trT), kb_promptrule_threshold: String(prT), // The reply backstop's own bar: it HOLDS a reply, so like the @@ -497,15 +488,15 @@ const exporting = ref(false); const restoring = ref(false); // Backup, export and restore walk the whole store, so they are slow BY DESIGN // and the client's ordinary 30s default would cut them off mid-work. They are -// still bounded: rule 156 asks for a deadline, not a short one, and "no ceiling -// at all" is what leaves a restore that died server-side spinning forever. +// still bounded — every wait has a deadline, not necessarily a short one — and +// "no ceiling at all" is what leaves a restore that died server-side spinning forever. const BULK_TRANSFER_TIMEOUT_MS = 10 * 60 * 1000; function bulkDeadline(): AbortSignal { return AbortSignal.timeout(BULK_TRANSFER_TIMEOUT_MS); } -// ── What's running (#3127 checklist 12) ───────────────────────────────── +// ── What's running ────────────────────────────────────────────────────── // Three states kept apart, because collapsing any two of them is the defect // this readout exists to remove: `null` + no error = not asked yet (the Config // tab has not been opened); a payload = answered, with each ABSENT field shown @@ -822,7 +813,7 @@ const baseUrl = ref(""); const savingBaseUrl = ref(false); const baseUrlSaved = ref(false); -// Git forge connections (#2778) — the user's keyring: one read-only +// Git forge connections — the user's keyring: one read-only // credential per forge host, used server-side for every forge read on // projects this user owns. The token round-trips masked; the server treats // the mask as "unchanged". Tokens are stored sealed under SECRET_KEY: @@ -1996,12 +1987,12 @@ async function deleteUser(userId: number) { />

How many of the best-scoring rules a reply is checked against (1–10). Only the best can hold the reply; the rest are counted, which is what tells you how close the others came.

- - + the project, not here. -->
@@ -3712,7 +3700,7 @@ async function deleteUser(userId: number) { color: var(--fs-text-primary); } /* An absent field reads as absent — never as a blank, and never styled to look - like a value it does not have (#3127 checklist 12). */ + like a value it does not have. */ .version-grid dd.version-unknown { font-family: inherit; font-style: italic; @@ -3760,7 +3748,7 @@ async function deleteUser(userId: number) { margin-bottom: 0.35rem; color: var(--fs-text-primary); } -/* remainder over .fs-input (components.css, canon #2336; m302) */ +/* remainder over .fs-input (components.css) */ .input { width: 100%; box-sizing: border-box; @@ -4127,7 +4115,7 @@ async function deleteUser(userId: number) { .cell-duration { color: var(--fs-text-tertiary); font-size: 0.8rem; white-space: nowrap; } .text-error { color: var(--fs-error); } /* Bare by design: a `` has nothing to style - that its cells don't carry (#2444). */ + that its cells don't carry. */ .detail-row td { padding: 0 0.75rem 0.75rem; border-bottom: 1px solid var(--fs-border-color); } .detail-ip { font-family: monospace; font-size: 0.8rem; color: var(--fs-text-tertiary); margin-bottom: 0.4rem; } .detail-json { @@ -4495,7 +4483,7 @@ async function deleteUser(userId: number) { font-weight: 500; } -/* ── Shared areas (milestone 307) ────────────────────────────────── +/* ── Shared areas ────────────────────────────────────────────────── The slug is shown deliberately: it is what decides whether two names are the same area, and an admin renaming an entry needs to see it move. */ .area-admin-list { list-style: none; margin: 1rem 0 0; padding: 0; display: flex; flex-direction: column; gap: var(--fs-space-2); } @@ -4527,7 +4515,7 @@ async function deleteUser(userId: number) { .area-admin-markers { font-family: var(--fs-font-mono); font-size: 0.82rem; } .area-admin-desc .area-admin-slug { margin-right: 0.25rem; } -/* The retrieval tuning trail (#4102). Reads as a record, not a control panel: +/* The retrieval tuning trail. Reads as a record, not a control panel: the operator is reviewing what was done, and the reason is the part worth reading, so it gets the full-width line under a compact header row. */ .tuning-history { @@ -4581,7 +4569,7 @@ async function deleteUser(userId: number) { color: var(--fs-accent); border-color: var(--fs-accent); } -/* A shipped default that moved between releases (#4225). Muted rather than +/* A shipped default that moved between releases. Muted rather than accented: it is the answer to "did I do this?" being NO for both of the other two, and it wants to be legible without competing with the changes somebody actually made. */ @@ -4595,7 +4583,7 @@ async function deleteUser(userId: number) { font-size: 0.85rem; color: var(--fs-text-secondary); } -/* Stale calibration (#4104). Tinted rather than loud: the numbers still work, +/* Stale calibration. Tinted rather than loud: the numbers still work, they have merely stopped being measurements — that is a "come back to this", not an outage. It only renders when something is actually stale, which is what earns it the tint at all. */