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 <noreply@anthropic.com>
This commit is contained in:
2026-10-21 21:09:53 -04:00
co-authored by Claude Opus 5.5
parent 79655fd19f
commit 637ec66b79
+35 -47
View File
@@ -20,7 +20,7 @@ const store = useSettingsStore();
const authStore = useAuthStore(); const authStore = useAuthStore();
const toastStore = useToastStore(); const toastStore = useToastStore();
// ── Shared areas (milestone 307) ──────────────────────────────────────── // ── Shared areas ────────────────────────────────────────────────────────
// The global vocabulary a project's Systems map onto. Admin-only to WRITE — // 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 // 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. // reads it, which is why the catalog lives in a store rather than here.
@@ -75,7 +75,7 @@ async function saveArea() {
savingArea.value = false; savingArea.value = false;
} }
} }
// ── Platforms (milestone 463) ─────────────────────────────────────────── // ── Platforms ───────────────────────────────────────────────────────────
// The global list of what a project can be built on or ship as. Same split // 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 // 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 // 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 kbInjectTopK = ref("3");
const kbWritePathEnabled = ref(true); const kbWritePathEnabled = ref(true);
// The write-path arm's OWN threshold, stricter than auto-inject's 0.55 above: // 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 // code embeddings sit on a much higher similarity floor than prose, so 0.55
// unrelated code through (#2223). Shares top-k, not the threshold. // lets unrelated code through. Shares top-k, not the threshold.
const kbWritePathThreshold = ref("0.68"); const kbWritePathThreshold = ref("0.68");
const kbRuleHintThreshold = ref("0.72"); const kbRuleHintThreshold = ref("0.72");
const kbCheckpointThreshold = ref("0.80"); const kbCheckpointThreshold = ref("0.80");
// The two ACT arms no longer share a bar (#3853). A write-path query is a code // The two ACT arms do not share a bar. A write-path query is a code payload; a
// payload; a pre-tool query is a shell command, often under a dozen words — // pre-tool query is a shell command, often under a dozen words — less text,
// less text, less signal, lower scores for the same relevance. Measured at one // less signal, lower scores for the same relevance — so one shared bar makes
// shared 0.72 the two behaved like different subsystems: the write-path arm // them behave like different subsystems.
// spoke on 37% of its calls, the command arm on 2% of 11,768.
const kbToolRuleThreshold = ref("0.68"); const kbToolRuleThreshold = ref("0.68");
// And the prompt boundary is a third query shape again — the operator's own // 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"); 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. // is HELD for one read, so it sits with the checkpoint, not with the hints.
const kbReplyRuleThreshold = ref("0.8"); const kbReplyRuleThreshold = ref("0.8");
// The BUDGETS, one per arm (#4102). Until this step only auto-inject had one // The BUDGETS, one per arm. Without one, the only control over a noisy surface
// and every other arm's ceiling was a module constant nobody could reach — so // is raising its bar, which discards the surface's best candidates along with
// the only control an operator had over a noisy surface was to raise its bar, // its worst. A budget keeps the top of the ranking and drops the tail.
// 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.
const kbWritePathTopK = ref("3"); const kbWritePathTopK = ref("3");
const kbRuleHintTopK = ref("5"); const kbRuleHintTopK = ref("5");
const kbToolRuleTopK = ref("5"); const kbToolRuleTopK = ref("5");
const kbPromptRuleTopK = ref("3"); const kbPromptRuleTopK = ref("3");
const kbReplyRuleTopK = ref("1"); const kbReplyRuleTopK = ref("1");
// What has been changed about retrieval, newest first — the review surface for // 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<TuningEvent[]>([]); const tuningEvents = ref<TuningEvent[]>([]);
const loadingTuning = ref(false); const loadingTuning = ref(false);
// Near-duplicate report floors, one per record kind (services/dedup.py). // 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 // 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 // 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. // above the gate to keep the report pointed at genuinely-alike records.
const kbDupThresholdSnippet = ref("0.82"); const kbDupThresholdSnippet = ref("0.82");
const kbDupThresholdNote = ref("0.93"); const kbDupThresholdNote = ref("0.93");
const kbDupThresholdTask = 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 kbGateThreshold = ref("0.9");
const kbGateThresholdSnippet = ref("0.96"); const kbGateThresholdSnippet = ref("0.96");
const kbGateThresholdLesson = ref("0.96"); const kbGateThresholdLesson = ref("0.96");
@@ -207,11 +204,6 @@ const kbPlanMatchThreshold = ref("0.80");
const savingKbInject = ref(false); const savingKbInject = ref(false);
const kbInjectSaved = 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() { function detectTimezone() {
userTimezone.value = Intl.DateTimeFormat().resolvedOptions().timeZone; 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 // 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 // a surface, which is a different event from moving off a value somebody chose
// and renders differently below. // and renders differently below.
@@ -262,7 +254,7 @@ interface TuningEvent {
} }
// What a dial's number was measured against, and whether that space has moved // 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 // `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 // UNKNOWN rather than fine, and rendering the two the same would hide the case
// most likely to be wrong. // 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 * `release` means the shipped default itself changed between versions — no
* user turned anything. Folding that into the `human ? 'you' : 'Claude'` * 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 // corpus confident enough to be read first" — and a number that moves
// when another moves is a number nobody can reason about. // when another moves is a number nobody can reason about.
kb_checkpoint_threshold: String(cpT), kb_checkpoint_threshold: String(cpT),
// A FOURTH and FIFTH bar, and they are separate keys on purpose: the // A FOURTH and FIFTH bar, and they are separate keys on purpose: one
// whole finding of #3853 is that one number cannot serve arms whose // number cannot serve arms whose queries are different shapes. Moving one must not move the others.
// queries are different shapes. Moving one must not move the others.
kb_toolrule_threshold: String(trT), kb_toolrule_threshold: String(trT),
kb_promptrule_threshold: String(prT), kb_promptrule_threshold: String(prT),
// The reply backstop's own bar: it HOLDS a reply, so like the // 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); const restoring = ref(false);
// Backup, export and restore walk the whole store, so they are slow BY DESIGN // 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 // 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 // still bounded — every wait has a deadline, not necessarily a short one — and
// at all" is what leaves a restore that died server-side spinning forever. // "no ceiling at all" is what leaves a restore that died server-side spinning forever.
const BULK_TRANSFER_TIMEOUT_MS = 10 * 60 * 1000; const BULK_TRANSFER_TIMEOUT_MS = 10 * 60 * 1000;
function bulkDeadline(): AbortSignal { function bulkDeadline(): AbortSignal {
return AbortSignal.timeout(BULK_TRANSFER_TIMEOUT_MS); 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 // 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 // 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 // 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 savingBaseUrl = ref(false);
const baseUrlSaved = 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 // credential per forge host, used server-side for every forge read on
// projects this user owns. The token round-trips masked; the server treats // projects this user owns. The token round-trips masked; the server treats
// the mask as "unchanged". Tokens are stored sealed under SECRET_KEY: // the mask as "unchanged". Tokens are stored sealed under SECRET_KEY:
@@ -1996,12 +1987,12 @@ async function deleteUser(userId: number) {
/> />
<p class="field-hint">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.</p> <p class="field-hint">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.</p>
</div> </div>
<!-- THE REVIEW SURFACE (#4102). These numbers are maintained by the <!-- THE REVIEW SURFACE. These numbers are maintained by the
model that uses them: it reads which records each bar refused and model that uses them: it reads which records each bar refused and
moves the dial with the argument attached. This panel is the other moves the dial with the argument attached. This panel is the other
half of that bargain — a change made on your behalf is one you can half of that bargain — a change made on your behalf is one you can
read, disagree with, and set back by hand above. --> read, disagree with, and set back by hand above. -->
<!-- STALENESS (#4104). A bar is a cosine similarity, which only means <!-- STALENESS. A bar is a cosine similarity, which only means
something inside one embedding model's geometry over documents cut something inside one embedding model's geometry over documents cut
one particular way. Change either and every number above keeps one particular way. Change either and every number above keeps
applying while describing nothing. Shown ONLY when something has applying while describing nothing. Shown ONLY when something has
@@ -2067,10 +2058,7 @@ async function deleteUser(userId: number) {
</div> </div>
<!-- A design system belongs to a PROJECT, and the picker for it lives on <!-- A design system belongs to a PROJECT, and the picker for it lives on
the project. There was a setting here that designated the system the project, not here. -->
this install's own interface was built from; it only ever described
the app you were already looking at, which is not what the feature
is for (#274). -->
<div class="field"> <div class="field">
<label for="kb-duplicate-threshold-snippet">Near-duplicate report threshold — snippets</label> <label for="kb-duplicate-threshold-snippet">Near-duplicate report threshold — snippets</label>
@@ -3712,7 +3700,7 @@ async function deleteUser(userId: number) {
color: var(--fs-text-primary); color: var(--fs-text-primary);
} }
/* An absent field reads as absent — never as a blank, and never styled to look /* 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 { .version-grid dd.version-unknown {
font-family: inherit; font-family: inherit;
font-style: italic; font-style: italic;
@@ -3760,7 +3748,7 @@ async function deleteUser(userId: number) {
margin-bottom: 0.35rem; margin-bottom: 0.35rem;
color: var(--fs-text-primary); color: var(--fs-text-primary);
} }
/* remainder over .fs-input (components.css, canon #2336; m302) */ /* remainder over .fs-input (components.css) */
.input { .input {
width: 100%; width: 100%;
box-sizing: border-box; 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; } .cell-duration { color: var(--fs-text-tertiary); font-size: 0.8rem; white-space: nowrap; }
.text-error { color: var(--fs-error); } .text-error { color: var(--fs-error); }
/* Bare by design: a `<tr>` has nothing to style /* Bare by design: a `<tr>` 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-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-ip { font-family: monospace; font-size: 0.8rem; color: var(--fs-text-tertiary); margin-bottom: 0.4rem; }
.detail-json { .detail-json {
@@ -4495,7 +4483,7 @@ async function deleteUser(userId: number) {
font-weight: 500; font-weight: 500;
} }
/* ── Shared areas (milestone 307) ────────────────────────────────── /* ── Shared areas ──────────────────────────────────────────────────
The slug is shown deliberately: it is what decides whether two names are 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. */ 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); } .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-markers { font-family: var(--fs-font-mono); font-size: 0.82rem; }
.area-admin-desc .area-admin-slug { margin-right: 0.25rem; } .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 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. */ reading, so it gets the full-width line under a compact header row. */
.tuning-history { .tuning-history {
@@ -4581,7 +4569,7 @@ async function deleteUser(userId: number) {
color: var(--fs-accent); color: var(--fs-accent);
border-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 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 other two, and it wants to be legible without competing with the changes
somebody actually made. */ somebody actually made. */
@@ -4595,7 +4583,7 @@ async function deleteUser(userId: number) {
font-size: 0.85rem; font-size: 0.85rem;
color: var(--fs-text-secondary); 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", 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 not an outage. It only renders when something is actually stale, which is
what earns it the tint at all. */ what earns it the tint at all. */