docs(6208): the remaining frontend comments drop milestone, step and rule citations
CI & Build / Python lint (push) Successful in 9s
CI & Build / Plugin hooks (push) Successful in 22s
CI & Build / TypeScript typecheck (push) Successful in 1m0s
CI & Build / integration (push) Successful in 1m55s
CI & Build / Python tests (push) Successful in 2m20s
CI & Build / Build & push image (push) Successful in 1m7s

Components, stores, api clients, router, types and shared CSS now state what
each piece is and why, without the milestone that introduced it. diff.ts
names its consumers instead of the copy history; stores/notes and tasks state
their current scope instead of the cleanup that set it; theme.css states the
token practice instead of the sweep that established it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-21 21:14:03 -04:00
co-authored by Claude Opus 5.5
parent 699a4cd986
commit bdd803537b
45 changed files with 80 additions and 95 deletions
@@ -11,7 +11,7 @@ import { fmtStamp } from "@/utils/dateFormat";
import { useToastStore } from "@/stores/toast";
/**
* Scheduled backups (milestone 523): one dated, uncompressed tar per run,
* Scheduled backups: one dated, uncompressed tar per run,
* delivered to a folder or an S3 bucket. The page answers "is my data backed
* up?" first — the verdict, then anything wrong — and the settings follow.
*/
@@ -50,7 +50,7 @@ async function load() {
}
}
// While a backup runs, follow it. Re-armed from load()'s finally (rule 157),
// While a backup runs, follow it. Re-armed from load()'s finally, never after the work,
// so one failed read does not stop the page following the run.
function schedulePoll() {
if (pollTimer) clearTimeout(pollTimer);
@@ -1,6 +1,6 @@
<script setup lang="ts">
/**
* The adoption matrix (milestone 463 step 4): every project × every canon
* The adoption matrix: every project × every canon
* family idea that reaches it, and the project's answer.
*
* Nobody approves an answer — the agent assesses each project against the
+2 -2
View File
@@ -1,13 +1,13 @@
<script setup lang="ts">
/**
* The inception form (milestone 297): "what does this project inherit?"
* The inception form: "what does this project inherit?"
*
* Two homes, one component. mode="create" rides the New-project modal's
* second step and only emits the choices (the project does not exist yet);
* mode="decide" sits on ProjectView for an undecided project, loads that
* project's current defaults, and records the decision itself.
*
* Platforms (milestone 463) start UNANSWERED (null). Ticking any box makes
* Platforms start UNANSWERED (null). Ticking any box makes
* the list the whole answer; in decide mode the boxes start from what
* detection already found, so recording confirms it.
*/
+2 -2
View File
@@ -8,9 +8,9 @@ import { useToastStore } from "@/stores/toast";
/**
* Proposals about a rule's moments, waiting on a person. A mount proposal
* (milestone 458 step 7) comes from a pass that read the rule, or from the
* comes from a pass that read the rule, or from the
* rule being opened just after the moment fired in several sessions; nothing
* is mounted until "Mount" is pressed. An unmount proposal (step 7b) comes
* is mounted until "Mount" is pressed. An unmount proposal comes
* from sessions reporting that the mount arrived where it did not apply;
* nothing is taken off until "Take it off" is pressed. Both are the judgment
* `judge_rule_moments` makes in a session, through the same service.
+1 -1
View File
@@ -6,7 +6,7 @@ import type { MomentAction, MomentUsage } from "@/api/moments";
import { fmtDate } from "@/utils/dateFormat";
/**
* The human door onto moments (milestone 458 step 6): every moment in the
* The human door onto moments: every moment in the
* catalog, the actions that reach it on this install, how many rules ride on
* it, and what reaching it has delivered. The session's own door is
* `list_moments` / `map_action` / `unmap_action`, and both call the same
+2 -2
View File
@@ -9,8 +9,8 @@
* deliberately rather than abstracting: the ordering carries urgency, "never"
* is categorically different from a date, and a failed check writes nothing.
*
* Lives in the Knowledge view rather than beside the rules sweep (operator's
* call, milestone 317 step 4): notes stay where notes live. The cost, accepted
* Lives in the Knowledge view rather than beside the rules sweep: notes stay
* where notes live. The cost, accepted
* knowingly, is that there is no single screen showing every record anyone has
* left unconfirmed — /rules keeps its own.
*/
+1 -1
View File
@@ -1,6 +1,6 @@
<script setup lang="ts">
/**
* A project's place in the family (milestone 463): which platforms it is.
* A project's place in the family: which platforms it is.
*
* Membership is what makes "does this family idea reach this project?" a
* lookup rather than a judgment — an idea is for some platforms, and it
@@ -7,7 +7,7 @@ import RuleEditorSlideOver from "@/components/rules/RuleEditorSlideOver.vue";
/**
* The reply shapes Scribe ships, and the operator's adjustments to each
* (milestone 500 step 5). A shape is product, so its text is read-only here;
* A shape is product, so its text is read-only here;
* what the operator owns is the preferences mounted on the shape's moment,
* which arrive beside it and win where they differ. "Adjust this" opens the
* preference editor already mounted there.
+3 -3
View File
@@ -570,7 +570,7 @@ async function confirmDelete() {
.issue-systems { display: flex; gap: 0.25rem; flex-shrink: 0; flex-wrap: wrap; }
.issue-sys-chip { font-size: 0.66rem; color: var(--fs-text-secondary); background: var(--fs-surface-raised); border-radius: 999px; padding: 0.05rem 0.4rem; }
/* ── Shared-area mapping (milestone 307) ──────────────────────────
/* ── Shared-area mapping ──────────────────────────────────────────
The review is a disclosure, not a banner: it exists only while there is
something to decide, and collapses to one line until opened. */
.area-review {
@@ -700,7 +700,7 @@ async function confirmDelete() {
.system-form-actions { display: flex; gap: 0.4rem; }
.system-paths-input { font-family: var(--fs-font-mono); font-size: 0.8rem; }
/* The area's files (milestone 444). Mono because they are paths to be read
/* The area's files. Mono because they are paths to be read
character for character; small because they qualify the card, not lead it. */
.system-paths {
list-style: none;
@@ -826,7 +826,7 @@ async function confirmDelete() {
border: 1px dashed var(--fs-border-color);
border-radius: var(--fs-radius-lg);
}
/* remainders over the shared recipes (components.css, m302) */
/* remainders over the shared recipes (components.css) */
.empty-title { margin: 0; color: var(--fs-text-primary); }
.empty-sub { margin: 0 0 0.5rem; font-size: 0.82rem; max-width: 32ch; }
+1 -2
View File
@@ -2,8 +2,7 @@
/**
* "N/M used" on a list row — surfaced vs opened, for any record kind.
*
* Extracted from SnippetListView when the rule list needed the same chip
* (milestone 333 step 5). The counts read identically for both; what differs
* Shared by the snippet and rule lists. The counts read identically for both; what differs
* is the ADVICE, which is why that is a prop. A snippet surfaced repeatedly
* and never opened should probably go; a rule in the same position may simply
* have a `when_to_apply` that fires on the wrong thing, and telling an
@@ -2,7 +2,7 @@
/**
* What Scribe has changed about how it works with you.
*
* THE RISK THIS EXISTS FOR (milestone 399). A preference is the one record
* THE RISK THIS EXISTS FOR. A preference is the one record
* kind the agent rewrites on its own, mid-work, without asking — which is
* what keeps it current and what makes it dangerous. An agent misreads one
* session, rewrites a preference, and follows the rewritten version forever
@@ -11,7 +11,7 @@ import type { ApplicableRules } from "@/api/rulebooks";
import RuleHomePicker from "@/components/rules/RuleHomePicker.vue";
/**
* A project's view of its rules (milestone 414). A rule's home is its reach:
* A project's view of its rules. A rule's home is its reach:
* the project's own rules apply here and nowhere else, and every global rule
* (one in a rulebook) applies here too. There is no subscribing this project
* to a rulebook and no skipping a global rule for it — a project that departs
@@ -27,7 +27,7 @@ const whenToApply = ref("");
// session may quietly rewrite.
const kind = ref<RuleKind>("rule");
const systemIds = ref<number[]>([]);
// The moments this rule is mounted on (milestone 458). Catalog moments are
// The moments this rule is mounted on. Catalog moments are
// ticked; a named procedure's moment (`skill.<name>`) is typed, since its
// name is the procedure's own and no list here could know it.
const ruleMoments = ref<string[]>([]);
@@ -46,7 +46,7 @@ const expiresWhen = ref("");
const relations = computed(() => store.currentRule?.relations ?? []);
// The lessons that point at this rule (milestone 440): confirmed instances
// The lessons that point at this rule: confirmed instances
// first, then suggestions waiting on a judgment. A rejected lesson does not
// point at the rule, so it is not listed here — it stays readable on the
// lesson, where the judgment was made.
@@ -509,7 +509,7 @@ legend { padding: 0 0.35rem; font-size: 0.8rem; color: var(--fs-text-tertiary);
.area-opt { display: flex; align-items: flex-start; gap: 0.5rem; margin-bottom: 0.4rem; font-size: 0.88rem; }
.area-opt input { width: auto; margin-top: 0.2rem; accent-color: var(--fs-accent); }
.trigger-missing textarea { border-color: var(--fs-warning); }
/* The moment picker (milestone 458): the name is what a session reads in a
/* The moment picker: the name is what a session reads in a
delivered line, so it is shown as written; the meaning is the gloss. */
.moments { margin-bottom: 1rem; }
.moments .intro { margin-top: 0; margin-bottom: var(--fs-space-3); }
@@ -84,7 +84,7 @@ function changedFields(index: number): string[] {
/** True when this edit rewrote or removed the rule's check.
*
* Worth its own marker because editing `verify_with` silently drops
* `verified_at` (milestone 312) — the moment a rule re-entered the staleness
* `verified_at` — the moment a rule re-entered the staleness
* sweep. That happens nowhere a reader can see it, and this row is the only
* surface that can say when it happened. */
function checkChanged(index: number): boolean {
@@ -1,6 +1,6 @@
<script setup lang="ts">
/**
* Where a rule lives, and moving it (milestone 414).
* Where a rule lives, and moving it.
*
* A rule's home IS its reach: in a rulebook topic it is global and applies to
* every project; on a project it applies there alone. Moving keeps the rule's
@@ -4,8 +4,7 @@ import { useRulebooksStore } from "@/stores/rulebooks";
import type { RulebookTopic } from "@/api/rulebooks";
// A rulebook's rules are global — they apply to every project — so this pane
// lists topics and nothing else. It carried a "Subscribers" checklist of
// projects until milestone 414 retired subscriptions.
// lists topics and nothing else.
const props = defineProps<{
rulebookId: number;
topics: RulebookTopic[];