hyp status is a triage summary; the inventory moves behind --full (LLP 0212) - #716
hyp status is a triage summary; the inventory moves behind --full (LLP 0212)#716bgmcmullen wants to merge 3 commits into
Conversation
…P 0212) `hyp --help` states this command's job: "Start with 'hyp status' for whether this install is working." On a joined machine it printed 50 lines, and that was not what most of them answered. Every subsystem that landed a never-silent requirement landed it here, each correctly and each unaware of the others, so the screen became an inventory: ten plugin lines, three rosters, a nine-entry action ledger of which six read [done], a 64-char etag, two absolute paths, a raw byte count. On the observed machine one real problem (Claude Desktop enabled but not attached) appeared four times inside it. The default screen is now four rows in a frame - healthy, recording, where the data goes, what needs you - then the attention items, and nothing else. A conditional fact (a client not attached, a folder withheld, a refused action) is rendered when it is true; the inventory it used to sit in is `hyp status --full`, byte-identical to what shipped before. `--json` is untouched: no key moves. The summary wraps itself to the terminal (stdout.columns, else COLUMNS, else 80) before drawing the frame, and hangs continuations in the value column. A framed block cannot rely on the terminal's own wrap: that happens after the right edge is placed, turning the rectangle into a staircase, and a soft-wrapped continuation restarts under the label rather than under the text it continues. Verified no line exceeds the terminal width at every width from 20 to 200. Also: three collector diagnostics stop embedding their repair command in their message text. The `repair` field carries it and both text surfaces render that field, so the embedded copy only ever printed the same command twice on one screen. LLP 0212 records the decision and carries the table of every never-silent fact and where it now renders; 0031, 0164, 0186 and 0188 each gain an Extended-by forward-ref for the part of their `hyp status` prose this narrows. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- summariseCapture: mark local-only non-client sources (LLP 0188's clientSync.localOnly is keyed by picker id, which differs from the otel/otlp source name); state raw-anthropic/raw-openai's local-only count on the data row instead, since they have no capture row to attach to; fix the empty-parts fallback to exclude ai-gateway and use friendlyClientLabel like the main loop does. - summariseData: gate "asking about new folders" on report.layered.hasCentral to match renderStatusFull's LLP 0106 enrolled-only rule. - docs/ACCEPTANCE.md and README.md: update hyp status invocations and pass conditions that assumed the old always-on inventory text, now behind --full; rewrite the README troubleshooting paragraph for the summary + --full split. - wizard/fork.js: collapse a doubled blank line. - test/core/status-summary.test.js: add coverage for the above, and replace inline import(...) JSDoc types with a top-of-file @import.
|
Review round 1 of The diff was read in full against merge base Fixed in
|
…dicate - format.js: `otlp` and `otel` both map to `OpenTelemetry` in FRIENDLY_CLIENT_LABELS, so the summary prints the name the picker row offered instead of title-casing the source id into `Otlp`. Tests updated, including the fixture that used `otel` as a source name where the plugin actually contributes `otlp`. - status.js: `unattributedLocalOnlyCount` now builds its already-attributed client set from configured clients only, matching what `summariseCapture` renders. A local-only client with its plugin disabled was absent from `capture` yet counted as attributed, which is exactly the silence the never-silent invariant forbids. - LLP 0212 and LLP 0031: point at `renderStatusSummary` / `renderStatusFull` rather than the deleted `renderStatusText`. - LLP 0188: the `Extended-by:` line described the `data` row as naming local-only clients; the code marks them inline on `capture` and only carries a bare count on `data` for pickers with no row of their own.
|
Review round 2 of Round 2 verified each round-1 fix in the committed tree, read the Findings, all fixed1. minor - 2. minor - two LLP docs named a function this PR deleted. 3. minor - 4. minor - Verified from round 1
Still open from round 1 - human calls, not re-litigated
Also checked, clean
Note on the three "pre-existing" test failuresThe PR description documents 3 failures ( Head has moved to |
|
Triage after the review budget (LLP 0017). Two review rounds ran on this adopted PR: round 1 on Blocker: the
|
hyp --helpstates this command's job: "Start withhyp statusfor whether this install is working." On a joined machine it printed 50 lines, and that was not what most of them answered.Every subsystem that landed a never-silent requirement landed it here, each correctly and each unaware of the others, so the screen became an inventory: ten
active pluginslines, three rosters, a nine-entry client-action ledger of which six read[done], a 64-character etag, two absolute paths, a raw byte count,datasets: 1. All of it addressable elsewhere (hyp plugin list,hyp config show,hyp daemon status,hyp query status), and all of it printed unconditionally. On the observed machine one real problem, Claude Desktop enabled but not attached, appeared four times inside it: as a roster line, as anattachaction, as abackfillaction, and as a diagnostic.Before / after
Before (50 lines)
After:
What the summary carries
Four rows, in the order the questions get asked: healthy → recording → where it goes → what needs you.
activityis promoted out of a trailing section because rows landing is the only proof of capture; every other row is a proxy for it. It comes from the daemon's status file (LLP 0164), so it costs no query and reads no cache.A client carries its exceptions inline (
not attached,local only), so one client is one mention.pendinganddoneclient actions are a ledger and stay in--full;failedandrefusedare attention, with the re-arm hint LLP 0186 settled.Never-silent facts under a summary
A mandated fact now renders when it is true, not unconditionally: the summary states a fact when a reader could act on it, and the default it departs from is stated by its absence.
--fullremains the surface where everything is stated unconditionally, and--jsonwhere everything is stated in a fixed shape. LLP 0212 carries the full table (local-only clients, withheld directories, provenance tags, dropped entries, first-sync hold, folder ask, diagnostic kinds) and where each one lands.Width
The summary wraps itself (
stdout.columns, elseCOLUMNS, else 80) before drawing the frame, and hangs continuations in the value column. A framed block cannot rely on the terminal's own wrap: it happens after the right edge is placed, so a too-long row turns the rectangle into a staircase, and a soft-wrapped continuation restarts under the label instead of under the text it continues. Below 34 columns the frame drops and the gutter layout stands alone. 80-when-unknown is deliberate: a status screen is pasted into chat and captured in CI logs at least as often as it is read on a wide terminal.Also in here
Three collector diagnostics (
client_attach_missing,client_attach_stale,client_attached_not_configured) stop embedding their repair command in theirmessage. Therepairfield carries it and both text surfaces render that field, so the embedded copy only ever printed the same command twice on one screen. No test pinned the wording.formatBytesShort/friendlyClientLabelmove out ofwizard/fork.jsinto a sharedsrc/core/cli/format.js, so the returning gate and status quote the same install in the same units and the same client spellings.Docs
LLP 0212 records the decision. LLP 0031, 0164, 0186 and 0188 each gain an
Extended-by:forward-ref for the part of theirhyp statusprose this narrows; none of what they settled is edited.Testing
test/core/status-summary.test.js, 24 tests: the four rows, each conditional fact appearing exactly when true, attention ordering and dedup, colour never being the sole encoding, and no line exceeding the terminal width at every width from 20 to 200.renderStatusFull(mechanical rename; their assertions are unchanged, and they now guard that--fullstill prints the inventory verbatim).status_diagnosticsgains a case 5 asserting the default screen carries the problem and a runnable repair on a broken config, and that the plugin roster and the diagnostickindare not on it; span assertions coverformat=summaryandformat=full.local_only_export_withholdasserts the withheld-folder count on the default screen and the old wording under--full.npm test3922 pass. Pre-existing failures on master, untouched:report-render*andnpm run typecheckboth fail on a missingmarkeddependency, plus one hyparquet-writer dictionary test.package_bin_boot, which fails on master too: it asserts a help header (hyp - HypAware kernel CLI) the CLI stopped printing some time ago. Worth a separate fix.🤖 Generated with Claude Code