instar 1.3.788 → 1.3.789

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.
@@ -562,7 +562,17 @@
562
562
  /* F3 — Dashboard UX Standard: every tab's plain-language purpose line.
563
563
  One muted, readable sentence directly under the tab header telling a
564
564
  non-expert what the tab is for and what they can do here. Enforced by
565
- tests/unit/dashboard-tab-purpose.test.ts. */
565
+ tests/unit/dashboard-tab-purpose.test.ts.
566
+
567
+ F7 — CANONICAL purpose-line class. `.tab-purpose` is the shared vocabulary
568
+ every NEW tab should use for its purpose line. Three legacy variants still
569
+ exist and carry their own deliberately-distinct sizing — `.ph-intro`
570
+ (Process-Health design-system intro, larger), `.features-subtitle`, and
571
+ `.dropzone-subtitle` — all recognized by the F3 floor test. Per the spec
572
+ (docs/specs/dashboard-ux-standard.md, FD-3) F7 is soft-first: consolidating
573
+ those three into `.tab-purpose` is a tracked migration (it changes their
574
+ visual size, so it is done deliberately, not big-bang). Until then: reach
575
+ for `.tab-purpose`; do not add a fifth variant or an inline-styled line. */
566
576
  .tab-purpose {
567
577
  font-size: 13px;
568
578
  color: var(--text-dim);
@@ -2950,7 +2960,7 @@
2950
2960
  </div>
2951
2961
  <div class="file-content-panel" id="fileContentPanel">
2952
2962
  <div class="file-content-header" id="fileContentHeader" style="display:none">
2953
- <button class="files-back-btn" onclick="filesGoBack()">&larr;</button>
2963
+ <button class="files-back-btn" onclick="filesGoBack()" title="Back" aria-label="Back">&larr;</button>
2954
2964
  <div class="breadcrumbs" id="fileBreadcrumbs"></div>
2955
2965
  <div class="file-badges" id="fileBadges"></div>
2956
2966
  </div>
@@ -3229,7 +3239,7 @@
3229
3239
  Multi-spec project plans. Each project groups related pieces of work and only advances to its next round once its required checks pass.
3230
3240
  </div>
3231
3241
  <div id="projectsEmpty" style="padding:40px;text-align:center;color:var(--text-dim);display:none">
3232
- No active projects. Create one via <code>POST /projects</code> with a plan-doc path.
3242
+ No active projects yet. Ask your agent to start one from a plan document, and it'll appear here.
3233
3243
  </div>
3234
3244
  <div id="projectsList" style="display:flex;flex-direction:column;gap:12px"></div>
3235
3245
  </div>
@@ -3260,7 +3270,7 @@
3260
3270
  </div>
3261
3271
  <div id="initiativesDigest" style="display:none;padding:12px;border:1px solid var(--border);border-radius:6px;background:var(--bg-dim)"></div>
3262
3272
  <div id="initiativesEmpty" style="padding:40px;text-align:center;color:var(--text-dim);display:none">
3263
- No initiatives to display. Create one via <code>POST /initiatives</code>.
3273
+ No initiatives yet. Ask your agent to create one, and it'll appear here.
3264
3274
  </div>
3265
3275
  <div id="initiativesList" style="display:flex;flex-direction:column;gap:12px"></div>
3266
3276
  </div>
@@ -3945,7 +3955,7 @@
3945
3955
  <!-- WhatsApp QR panel (hidden by default) -->
3946
3956
  <div class="wa-qr-backdrop" id="waQrBackdrop" style="display:none" onclick="closeQrPanel()"></div>
3947
3957
  <div class="wa-qr-panel" id="waQrPanel" style="display:none">
3948
- <button class="wa-close" onclick="closeQrPanel()">&times;</button>
3958
+ <button class="wa-close" onclick="closeQrPanel()" title="Close" aria-label="Close">&times;</button>
3949
3959
  <h3>WhatsApp Connection</h3>
3950
3960
  <p id="waQrMsg">Scan this QR code with WhatsApp to connect</p>
3951
3961
  <div id="waQrContainer"></div>
@@ -7649,7 +7659,7 @@
7649
7659
 
7650
7660
  detail.innerHTML = '<div class="job-detail-header">'
7651
7661
  + '<div>'
7652
- + '<button class="back-btn" onclick="jobsGoBack()" style="display:none;margin-right:8px">&larr;</button>'
7662
+ + '<button class="back-btn" onclick="jobsGoBack()" style="display:none;margin-right:8px" title="Back" aria-label="Back">&larr;</button>'
7653
7663
  + '<h3>' + esc(displayName) + '</h3>'
7654
7664
  + '<div class="job-desc">' + esc(job.description || '') + '</div>'
7655
7665
  + '</div>'
@@ -9420,7 +9430,7 @@
9420
9430
  try {
9421
9431
  const data = await apiFetch(info.endpoint);
9422
9432
  panel.innerHTML = '<div class="cap-content-panel">' +
9423
- '<div class="cap-content-header"><span>' + esc(info.label) + '</span><button onclick="document.getElementById(\'capContentBrowser\').innerHTML=\'\'" style="border:none;background:none;color:var(--text-dim);cursor:pointer;font-size:14px">&times;</button></div>' +
9433
+ '<div class="cap-content-header"><span>' + esc(info.label) + '</span><button onclick="document.getElementById(\'capContentBrowser\').innerHTML=\'\'" style="border:none;background:none;color:var(--text-dim);cursor:pointer;font-size:14px" title="Close" aria-label="Close">&times;</button></div>' +
9424
9434
  '<div class="cap-content-body">' + renderBrowsableContent(info.renderer, data) + '</div></div>';
9425
9435
  } catch (e) {
9426
9436
  panel.innerHTML = '<div style="padding:12px;color:var(--red);font-size:12px">Failed to load: ' + esc(e.message) + '</div>';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "instar",
3
- "version": "1.3.788",
3
+ "version": "1.3.789",
4
4
  "description": "Coherence infrastructure for self-evolving AI agents — on the Claude Code or Codex subscription you already have.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$schema": "./builtin-manifest.schema.json",
3
3
  "schemaVersion": 1,
4
- "generatedAt": "2026-07-09T06:42:14.302Z",
5
- "instarVersion": "1.3.788",
4
+ "generatedAt": "2026-07-09T07:11:33.686Z",
5
+ "instarVersion": "1.3.789",
6
6
  "entryCount": 202,
7
7
  "entries": {
8
8
  "hook:session-start": {
@@ -0,0 +1,44 @@
1
+ # Upgrade Guide — vNEXT
2
+
3
+ <!-- assembled-by: assemble-next-md -->
4
+ <!-- bump: patch -->
5
+
6
+ ## What Changed
7
+
8
+ - **Every dashboard control is now labeled (Dashboard UX Standard F5).** Four icon-only buttons
9
+ (the Files back arrow, the QR-panel close, the Jobs back arrow, and the capability-content
10
+ close) shipped as a bare `←` / `×` glyph with no accessible name — a user (or screen reader)
11
+ had to guess. Each now carries a `title` + `aria-label`. A build-time floor
12
+ (`dashboard-controls-labeled.test.ts`) fails if any future button ships icon-only.
13
+ - **Empty states speak plain language, not API jargon (F6).** Two empty states told the operator
14
+ to "Create one via `POST /projects`" / "`POST /initiatives`" — meaningless to the person
15
+ reading the dashboard. They now say "Ask your agent to start one … and it'll appear here." A
16
+ floor (`dashboard-empty-states.test.ts`) fails on a bare or jargon-leaking empty state.
17
+ - **Shared purpose-line vocabulary documented (F7, soft-first).** `.tab-purpose` is marked the
18
+ canonical purpose-line class; the three legacy variants (`ph-intro`, `features-subtitle`,
19
+ `dropzone-subtitle`) are documented for a tracked, deliberate migration (per spec FD-3, not a
20
+ big-bang restyle).
21
+ - **Broken-asset floor (F8).** `dashboard-assets-resolve.test.ts` fails if a referenced local
22
+ image/icon has no file on disk.
23
+
24
+ ## What to Tell Your User
25
+
26
+ A few more dashboard papercuts are gone: every button now has a readable label (better for
27
+ accessibility too), and the "nothing here yet" messages tell you what to do in plain English
28
+ instead of showing a developer command. Nothing to enable — it lands with the release.
29
+
30
+ ## Summary of New Capabilities
31
+
32
+ - None — UX polish plus three build-time floors (F5 control labeling, F6 empty-state clarity,
33
+ F8 asset resolution) that fail the build if a future change regresses them.
34
+
35
+ ## Evidence
36
+
37
+ `tests/unit/dashboard-controls-labeled.test.ts` (F5): scans every `<button>` in
38
+ `dashboard/index.html`, asserts each has visible text, `title`, or `aria-label` (population floor
39
+ ≥30). `tests/unit/dashboard-empty-states.test.ts` (F6): audits the `*Empty*` resting-state
40
+ containers (population floor ≥6) for a real sentence and no `POST /…`/curl jargon.
41
+ `tests/unit/dashboard-assets-resolve.test.ts` (F8): every static local `src`/`url(...)` ref
42
+ resolves to a real file (logo.png confirmed present). All 7 dashboard floor tests green (13
43
+ cases, 1 browser-gated skip). Display-only markup + build-time floors — no runtime surface;
44
+ machine-local static asset; rollback is a plain revert.
@@ -0,0 +1,22 @@
1
+ # Side-effects review — Dashboard UX Standard floors F5–F8
2
+
3
+ **Change:** `dashboard/index.html` (F5 button labels, F6 empty-state de-jargoning, F7 canonical-class doc) + three static floor tests (`dashboard-controls-labeled` F5, `dashboard-empty-states` F6, `dashboard-assets-resolve` F8). Spec: `docs/specs/dashboard-ux-standard.md` (converged + approved, shipped in #1404). Tier 1 — display-only markup + build-time CI floors; no runtime `src/` change, no decision logic.
4
+
5
+ ## Phase 1 — Principle check (signal vs authority)
6
+ Does this touch a decision point that gates information flow / blocks actions / constrains agent behavior? **No.** The changes are (a) HTML label/text attributes rendered to the operator and (b) static test files that fail a *build* if the dashboard regresses. The tests are build-time CI floors, not runtime authorities — they never gate a message, session, or agent action. Signal-vs-authority does not apply (no runtime decision surface).
7
+
8
+ ## Phase 4 — Side-effects review
9
+ 1. **Over-block:** the floor tests could reject legitimate markup. F5 accepts a button labeled by visible text OR `title` OR `aria-label` OR dynamic (`${…}`/concatenated) content — the full current button population passes; a button labeled *only* by an adjacent element (not itself) would false-flag, acceptable because self-labeling is the accessibility norm and easily satisfied. F6 requires a ≥4-word sentence in each `*Empty*` container — a legitimately terse state would flag, but the 4-word floor is lenient. F8 excludes `data:`/`http(s)`/dynamic `${}` srcs, so only real static local refs are checked. No legitimate current markup is rejected (all 7 dashboard tests green).
10
+ 2. **Under-block:** F5 checks `<button>` only, not `<select>`/`<input>` labeling (a tracked F5 follow-up <!-- tracked: topic-29723 -->). F6 audits `*Empty*`-id containers, not every conceivable resting state. F8 checks static local refs only. These are honest partial floors that raise the bar without claiming totality — not regressions.
11
+ 3. **Level-of-abstraction fit:** correct layer. A UI-consistency standard is enforced at build time over the shipped markup; there is no smarter runtime gate this should feed (it is not a runtime concern). It extends the existing dashboard-floor test family (`dashboard-tab-purpose`, `dashboard-panel-placement`, `dashboard-nav-reachability`, `dashboard-viewport-scroll`) — same pattern, same layer.
12
+ 4. **Signal vs authority compliance:** compliant by absence — no blocking authority added (build-time test, not runtime gate). See Phase 1.
13
+ 5. **Interactions:** the new F5/F6/F8 tests are independent scans over `index.html`; none shadows another. The F7 change is a CSS *comment* only — it does not alter the `.tab-purpose` rule and the F3 `dashboard-tab-purpose` test (which recognizes all four purpose-line classes) still passes. No double-fire, no race with cleanup.
14
+ 6. **External surfaces:** changes the dashboard HTML the operator sees — 4 icon buttons gain accessible names, 2 empty states lose API jargon ("POST /projects" → plain language). Strictly additive/clarifying; no behavior, endpoint, or data change. No surface visible to other agents/users/systems. No timing/conversation-state dependency.
15
+ 7. **Multi-machine posture:** **machine-local BY DESIGN** — `dashboard/index.html` is a static asset shipped in the package and served by each machine's own server; every machine serves the identical shipped file, so there is nothing to replicate, proxy, or transfer. No durable state, no generated URL, no user-facing notice. A single-machine assumption is correct here, not a defect.
16
+ 8. **Rollback cost:** trivial — `git revert` the commit. Display-only markup + additive tests; no migration, no agent-state repair, no data change.
17
+
18
+ ## Phase 4.5 — No deferrals
19
+ The two under-block follow-ups (F5 select/input labeling; broader F6 coverage) are tracked <!-- tracked: topic-29723 -->. F7 hard-consolidation is deliberately soft-first per the spec's FD-3, not an orphan deferral. No partial fix of an in-scope item is shipped.
20
+
21
+ ## Phase 5 — Second pass
22
+ Not required: no block/allow, session-lifecycle, coherence, or sentinel/guard/gate/watchdog surface (Tier 1, display-only).