Files
stack/packages/library/src/problems.mjs
T
jason.woltje ee7b2f1376 row 212: packages/library, mapping, scope, reader, resolver, R-rules, renderItems, survey (#1713)
Lands Gosalyn's round 3 candidate, a2c72ac95 (commit candidate, base c771a36f4), approved by Webby
(29979, rev 2731). 21 paths: the new packages/library (src, tests, fixtures, package.json, README),
scripts/stack-copy.sh (packages/library/src in COPY_PATHS), packages/cli/tests/stack-copy.test.mjs,
scripts/mosaic and agents/gosalyn/work/queue-212/BUILD.md. The 21-path patch-id, ea84d3e35470, equals
the candidate's.

Evidence: Gosalyn's slot run on round 3: 20 files 451 pass, 0 fail; test-queue 28/0 (gosalyn-0086).
Landing gate (Sage, 08:51-09:03Z, base 4ced5e63d) on a tree that also held row 197's 32 paths:
GATE_PASSED, node tests 981 pass 0 fail (library 39, cli 681, control-board 38, harness 16, webui 51, plus
the scripts/test-*.sh node suites), selftests 429 passed 0 failed. Row 212 lands alone (mos-1162); row
197 waits for an r6 after its lane proof stopped. No 212 path changed between c771a36f4 and this commit's
parent.
`queue review verify-commit 212` -> ok row 212 round 3: a2c72ac95 matches the commit candidate (21 paths).
2026-10-21 04:12:08 -05:00

28 lines
1.3 KiB
JavaScript

// Errors and the R-rule problems of design 1.3. A problem never holds back a commit: it names a
// path and, where there is one, a line, and the index leaves the file or link out.
export class LibraryError extends Error {
constructor(code, message) { super(`${code}: ${message}`); this.code = code; }
}
export const raise = (code, message) => { throw new LibraryError(code, message); };
export const RULES = Object.freeze({
R1: 'not a regular blob up to 1 MiB of UTF-8 text',
R2: 'path is unmapped',
R3: 'front matter not fully parsed',
R4: 'link resolves to no file or to more than one',
R5: 'canon file refers into the playground',
R6: 'canon file refers into another universe',
R7: 'paths differ only in case',
});
export function problem(code, path, line, message = RULES[code]) {
if (!Object.hasOwn(RULES, code)) raise('library-problem-code', `unknown problem code ${code}`);
return Object.freeze({ code, path, ...(Number.isSafeInteger(line) ? { line } : {}), message });
}
// Stable order for status output and tests: path, then line, then code.
export function sortProblems(list) {
return [...list].sort((a, b) => a.path < b.path ? -1 : a.path > b.path ? 1
: (a.line ?? 0) - (b.line ?? 0) || (a.code < b.code ? -1 : a.code > b.code ? 1 : 0));
}