@lumoai/cli 1.62.0 → 1.65.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -148,7 +148,7 @@ what's unmet and why (the exact failure tails), and how many rounds are left.
|
|
|
148
148
|
- **Queue exit** (LUM-775): a merged / closed PR's line ends with ` · N left the queue (a resolved on main, b merged unreviewed, c PR closed)` when any undispositioned row has left the queue — derived at read time, never stored. `resolved on main` = an external-tool finding whose fingerprint is absent from a default-branch baseline that can testify (landed, whole, requested after the merge, ran that tool); `merged unreviewed` = an advisory row whose PR merged without a decision (a policy-blocking row never exits this way — it stays a next action and keeps blocking DONE until a human decides, or until a fresh baseline shows it gone); `PR closed` = closed without merging, nothing landed (reopening the PR puts the rows back). Exited rows are not next actions, are not counted in `openFindings`, and show muted with the reason in the web panel. Absent on an older server. The workspace-wide read-out with per-row reasons is `scripts/analysis/lum775-finding-queue/report.ts`.
|
|
149
149
|
- **Persisting findings** (LUM-738): a finding whose fingerprint is already on the repository's default-branch baseline (`persisting`) is not this PR's — it never appears as a next action, is not counted in `openFindings`, and shows muted (_already on the default branch_) in the web panel. Dependency findings (`kind=DEPENDENCY`, from osv-scanner) are advisory: they never block DONE.
|
|
150
150
|
- **Fails closed:** `⚠ Security-scan check failed — could not confirm …` when the scan read errored, and one `⚠ PR #n: … — could not confirm it is clean.` line per open PR whose latest scan is missing / FAILED / still running. Silence means a successful read with nothing open, never a failed check.
|
|
151
|
-
- **Open boundary crossings** — a trailing safety block when the task has ≥1 OPEN (undispositioned) forbidden-action crossing: a count split the way the server DONE gate counts it — `(N undispositioned: B blocking DONE, A advisory / non-blocking)` (LUM-771) — then one line per crossing, blocking rows first as `• [SEVERITY] CATEGORY — <clipped detail>` (highest-severity first) and non-blocking rows as `◦ [SEVERITY] CATEGORY (advisory — does not block DONE)` / `(below the workspace gate — does not block DONE)
|
|
151
|
+
- **Open boundary crossings** — a trailing safety block when the task has ≥1 OPEN (undispositioned) forbidden-action crossing: a count split the way the server DONE gate counts it — `(N undispositioned: B blocking DONE, A advisory / non-blocking)` (LUM-771) — then one line per crossing, blocking rows first as `• [SEVERITY] CATEGORY — <clipped detail>` (highest-severity first) and non-blocking rows as `◦ [SEVERITY] CATEGORY (advisory — does not block DONE)` / `(below the workspace gate — does not block DONE)` — an advisory row a SYSTEM re-judge produced appends ` · re-judged: <evidence>` (LUM-780: its cause no longer holds — the rule text is still in CLAUDE.md, or no linked PR removes a tracked test file; the row stays OPEN for a human ruling, it just no longer blocks); only the `•` rows need a ruling before DONE, each followed by a read-only **attribution** line `↳ by model=<m> · agent=<type>[/branch] · session=<8-char prefix>` (who/what crossed; any dimension that couldn't be resolved server-side prints `unknown`, never a fabricated value), then a pointer to `lumo crossing disposition` and the web acceptance panel. Silent when there are none, so it never overshadows the criteria.
|
|
152
152
|
- **Read-only awareness** — this block surfaces crossings detected elsewhere and clears nothing itself. The ruling is the user's: `lumo crossing disposition <id> --false-positive | --confirmed` (exit-4 envelope you relay, LUM-769 — see below) or the web panel. You never self-approve.
|
|
153
153
|
- **The check fails closed:** if the crossings read itself errors (network / server / parse), the block prints `⚠ Boundary-crossing check failed (network/server error) — could not confirm whether any are undispositioned` instead of staying silent. Silence means a successful read with zero open crossings, never a failed check — a hiccup can no longer masquerade as "all clear".
|
|
154
154
|
|
|
@@ -628,10 +628,15 @@ function pushOpenCrossings(lines, extras) {
|
|
|
628
628
|
for (const c of open) {
|
|
629
629
|
const detail = oneLineDetail(c.detail);
|
|
630
630
|
const tail = detail ? ` — ${detail}` : '';
|
|
631
|
+
// LUM-780: an advisory row that a SYSTEM re-judge produced says why, so
|
|
632
|
+
// "advisory" reads as a reasoned state rather than a silent downgrade.
|
|
633
|
+
const rejudged = c.rejudge
|
|
634
|
+
? ` · re-judged: ${(0, sanitize_1.sanitizeField)(c.rejudge)}`
|
|
635
|
+
: '';
|
|
631
636
|
const gate = c.blocking
|
|
632
637
|
? ''
|
|
633
638
|
: c.advisory
|
|
634
|
-
?
|
|
639
|
+
? ` (advisory — does not block DONE${rejudged})`
|
|
635
640
|
: ' (below the workspace gate — does not block DONE)';
|
|
636
641
|
lines.push(` ${c.blocking ? '•' : '◦'} [${c.severity}] ${(0, sanitize_1.sanitizeField)(c.category)}${gate}${tail}`);
|
|
637
642
|
lines.push(` ${formatAttribution(c.attribution)}`);
|
|
@@ -87,6 +87,10 @@ async function fetchOpenCrossings(apiUrl, token, taskIdentifier) {
|
|
|
87
87
|
attribution: normalizeAttribution(c.attribution),
|
|
88
88
|
advisory,
|
|
89
89
|
blocking: blocksDone({ advisory, severity }, gateEnabled),
|
|
90
|
+
rejudge: typeof c.rejudge?.evidence === 'string' &&
|
|
91
|
+
c.rejudge.evidence.length > 0
|
|
92
|
+
? c.rejudge.evidence
|
|
93
|
+
: null,
|
|
90
94
|
};
|
|
91
95
|
})
|
|
92
96
|
// Blocking rows first, then by severity — what the human must act on leads.
|