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:
@@ -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. */
|
||||||
|
|||||||
Reference in New Issue
Block a user