instar 1.3.786 → 1.3.787

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.
@@ -527,6 +527,21 @@
527
527
  background: var(--bg);
528
528
  }
529
529
 
530
+ /* ── REQUIRED placement for every tab panel declared after </main> ──
531
+ Those panels are direct .app grid children. switchTab() hides the
532
+ sidebar too, so WITHOUT explicit grid placement the lone visible
533
+ panel auto-places into the 280px sidebar COLUMN — the "squished to
534
+ the side" bug (operator report 2026-07-08). Every after-main panel
535
+ MUST carry class="tab-panel" (or one of the container classes that
536
+ already sets grid-column: files/jobs/systems/features/dropzone, or
537
+ ph-root). Enforced structurally:
538
+ tests/unit/dashboard-panel-placement.test.ts fails on a bare panel. */
539
+ .tab-panel {
540
+ grid-column: 1 / -1;
541
+ min-width: 0;
542
+ background: var(--bg);
543
+ }
544
+
530
545
  .terminal-header {
531
546
  display: flex;
532
547
  align-items: center;
@@ -884,10 +899,10 @@
884
899
  maturation "you're here" marker. */
885
900
  .ph-root {
886
901
  --ph-accent: #4ade80;
887
- /* These panels are declared after </main>, making them direct .app grid
888
- children. switchTab() hides the sidebar too, so without explicit
889
- placement the lone visible panel auto-places into the 280px sidebar
890
- COLUMN the "squashed to the side" bug. Span the full grid. */
902
+ /* Grid placement for after-main panels is now the shared .tab-panel
903
+ contract (see the .tab-panel rule + the placement floor test:
904
+ tests/unit/dashboard-panel-placement.test.ts). ph-root keeps its own
905
+ grid-column because it ALSO constrains width for prose readability. */
891
906
  grid-column: 1 / -1;
892
907
  max-width: 760px;
893
908
  width: 100%;
@@ -2990,7 +3005,7 @@
2990
3005
  </div>
2991
3006
 
2992
3007
  <!-- Integrated-Being Tab (Integrated-Being v1) -->
2993
- <div id="integratedBeingPanel" style="display:none;flex-direction:column;padding:20px;gap:16px;overflow-y:auto">
3008
+ <div id="integratedBeingPanel" class="tab-panel" style="display:none;flex-direction:column;padding:20px;gap:16px;overflow-y:auto">
2994
3009
  <div style="display:flex;justify-content:space-between;align-items:center">
2995
3010
  <h2 style="margin:0">Integrated-Being</h2>
2996
3011
  <div>
@@ -3111,7 +3126,7 @@
3111
3126
  <!-- Read-only: NO action buttons that mutate eligibility. All PR-authored -->
3112
3127
  <!-- content rendered via textContent, never innerHTML — XSS defense rule -->
3113
3128
  <!-- for the dashboard per spec §"Dashboard surface rules". -->
3114
- <div id="prPipelinePanel" style="display:none;flex-direction:column;padding:20px;gap:16px;overflow-y:auto">
3129
+ <div id="prPipelinePanel" class="tab-panel" style="display:none;flex-direction:column;padding:20px;gap:16px;overflow-y:auto">
3115
3130
  <div style="display:flex;justify-content:space-between;align-items:center">
3116
3131
  <h2 style="margin:0">PR Pipeline</h2>
3117
3132
  <div>
@@ -3126,7 +3141,7 @@
3126
3141
  </div>
3127
3142
 
3128
3143
  <!-- Projects Tab — PROJECT-SCOPE-SPEC Phase 1.10 read-only view -->
3129
- <div id="projectsPanel" style="display:none;flex-direction:column;padding:20px;gap:16px;overflow-y:auto">
3144
+ <div id="projectsPanel" class="tab-panel" style="display:none;flex-direction:column;padding:20px;gap:16px;overflow-y:auto">
3130
3145
  <div style="display:flex;justify-content:space-between;align-items:center">
3131
3146
  <h2 style="margin:0">Projects</h2>
3132
3147
  <button onclick="loadProjects()" style="padding:6px 12px">Refresh</button>
@@ -3141,7 +3156,7 @@
3141
3156
  </div>
3142
3157
 
3143
3158
  <!-- Initiatives Tab — multi-phase long-running work -->
3144
- <div id="initiativesPanel" style="display:none;flex-direction:column;padding:20px;gap:16px;overflow-y:auto">
3159
+ <div id="initiativesPanel" class="tab-panel" style="display:none;flex-direction:column;padding:20px;gap:16px;overflow-y:auto">
3145
3160
  <div style="display:flex;justify-content:space-between;align-items:center">
3146
3161
  <h2 style="margin:0">Initiatives</h2>
3147
3162
  <div style="display:flex;gap:8px;align-items:center">
@@ -3172,7 +3187,7 @@
3172
3187
  </div>
3173
3188
 
3174
3189
  <!-- Commitments Tab (Open Promises) -->
3175
- <div id="secretsPanel" style="display:none;flex-direction:column;padding:20px;gap:16px;overflow-y:auto">
3190
+ <div id="secretsPanel" class="tab-panel" style="display:none;flex-direction:column;padding:20px;gap:16px;overflow-y:auto">
3176
3191
  <div style="display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap">
3177
3192
  <h2 style="margin:0">Secrets</h2>
3178
3193
  <div style="display:flex;gap:8px">
@@ -3190,7 +3205,7 @@
3190
3205
  <div id="secretsList" style="display:flex;flex-direction:column;gap:12px"></div>
3191
3206
  </div>
3192
3207
 
3193
- <div id="commitmentsPanel" style="display:none;flex-direction:column;padding:20px;gap:16px;overflow-y:auto">
3208
+ <div id="commitmentsPanel" class="tab-panel" style="display:none;flex-direction:column;padding:20px;gap:16px;overflow-y:auto">
3194
3209
  <div style="display:flex;justify-content:space-between;align-items:center">
3195
3210
  <h2 style="margin:0">Commitments</h2>
3196
3211
  <button onclick="loadCommitments()" style="padding:6px 12px">Refresh</button>
@@ -3208,7 +3223,7 @@
3208
3223
  </div>
3209
3224
 
3210
3225
  <!-- Tokens Tab — read-only token-usage observability -->
3211
- <div id="tokensPanel" style="display:none;flex-direction:column;padding:20px;gap:16px;overflow-y:auto">
3226
+ <div id="tokensPanel" class="tab-panel" style="display:none;flex-direction:column;padding:20px;gap:16px;overflow-y:auto">
3212
3227
  <div style="display:flex;justify-content:space-between;align-items:center">
3213
3228
  <h2 style="margin:0">Tokens</h2>
3214
3229
  <button onclick="loadTokens()" style="padding:6px 12px">Refresh</button>
@@ -3244,7 +3259,7 @@
3244
3259
 
3245
3260
  <!-- Resource Usage tab — per-agent CPU + memory (ResourceLedger Phase B).
3246
3261
  Read-only observability; mirrors the Tokens tab. -->
3247
- <div id="resourcesPanel" style="display:none;flex-direction:column;padding:20px;gap:16px;overflow-y:auto">
3262
+ <div id="resourcesPanel" class="tab-panel" style="display:none;flex-direction:column;padding:20px;gap:16px;overflow-y:auto">
3248
3263
  <div style="display:flex;justify-content:space-between;align-items:center">
3249
3264
  <h2 style="margin:0">Resource Usage</h2>
3250
3265
  <button onclick="loadResources()" style="padding:6px 12px">Refresh</button>
@@ -3284,7 +3299,7 @@
3284
3299
  true-blocker. A true-blocker is "best current understanding — recheck after <date>",
3285
3300
  never "stop trying". Read-only here; data from GET /blockers. detectedText and all
3286
3301
  free-text are UNTRUSTED and HTML-escaped before render. 503 = feature off. -->
3287
- <div id="blockersPanel" style="display:none;flex-direction:column;padding:20px;gap:16px;overflow-y:auto">
3302
+ <div id="blockersPanel" class="tab-panel" style="display:none;flex-direction:column;padding:20px;gap:16px;overflow-y:auto">
3288
3303
  <div style="display:flex;justify-content:space-between;align-items:center">
3289
3304
  <h2 style="margin:0">Blockers</h2>
3290
3305
  <button onclick="loadBlockers()" style="padding:6px 12px">Refresh</button>
@@ -3303,7 +3318,7 @@
3303
3318
  Every LLM call the system makes on its own behalf: which component, which
3304
3319
  provider/model, whether it acted or no-op'd, was skipped, cost + latency.
3305
3320
  Read-only; data from /metrics/features. -->
3306
- <div id="llmActivityPanel" style="display:none;flex-direction:column;padding:20px;gap:16px;overflow-y:auto">
3321
+ <div id="llmActivityPanel" class="tab-panel" style="display:none;flex-direction:column;padding:20px;gap:16px;overflow-y:auto">
3307
3322
  <div style="display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap">
3308
3323
  <h2 style="margin:0">LLM Activity</h2>
3309
3324
  <div style="display:flex;gap:8px;align-items:center">
@@ -3344,7 +3359,7 @@
3344
3359
  model it uses and its full ordered fallback tier list, with injection-safe /
3345
3360
  money-gated / critical-gate flags. Read-only display; data from
3346
3361
  /intelligence/routing/chains. No controls — the map only DISPLAYS the routing. -->
3347
- <div id="routingMapPanel" style="display:none;flex-direction:column;padding:20px;gap:16px;overflow-y:auto">
3362
+ <div id="routingMapPanel" class="tab-panel" style="display:none;flex-direction:column;padding:20px;gap:16px;overflow-y:auto">
3348
3363
  <div style="display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap">
3349
3364
  <h2 style="margin:0">Routing Map</h2>
3350
3365
  <button onclick="loadRoutingMap()" style="padding:6px 12px">Refresh</button>
@@ -3379,7 +3394,7 @@
3379
3394
  READ + every metered paid-door key with its caps and honest not-live/$0 state.
3380
3395
  Read-only: data from /routing-spend/summary + /routing-spend/caps. No money controls
3381
3396
  (caps adjust, go-live, alerts are later, dark increments). -->
3382
- <div id="spendPanel" style="display:none;flex-direction:column;padding:20px;gap:16px;overflow-y:auto">
3397
+ <div id="spendPanel" class="tab-panel" style="display:none;flex-direction:column;padding:20px;gap:16px;overflow-y:auto">
3383
3398
  <div style="display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap">
3384
3399
  <h2 style="margin:0">Spend</h2>
3385
3400
  <div style="display:flex;gap:8px;align-items:center">
@@ -3622,7 +3637,7 @@
3622
3637
  </section>
3623
3638
  </div>
3624
3639
 
3625
- <div id="evidenceTab" style="display:none;flex-direction:column;padding:20px;gap:16px;overflow-y:auto">
3640
+ <div id="evidenceTab" class="tab-panel" style="display:none;flex-direction:column;padding:20px;gap:16px;overflow-y:auto">
3626
3641
  <div style="display:flex;justify-content:space-between;align-items:center">
3627
3642
  <h2 style="margin:0">Evidence</h2>
3628
3643
  <div style="font-size:12px;color:var(--text-dim)">Per-entity evidence + reverse citations</div>
@@ -3681,7 +3696,7 @@
3681
3696
  </div>
3682
3697
 
3683
3698
  <!-- Threadline Tab — agent-to-agent conversations + Telegram bridge settings -->
3684
- <div id="threadlineTab" style="display:none;flex-direction:column;padding:20px;gap:16px;overflow-y:auto">
3699
+ <div id="threadlineTab" class="tab-panel" style="display:none;flex-direction:column;padding:20px;gap:16px;overflow-y:auto">
3685
3700
  <div style="display:flex;justify-content:space-between;align-items:center">
3686
3701
  <h2 style="margin:0">Threadline</h2>
3687
3702
  <button onclick="loadThreadlineBridgeConfig()" style="padding:6px 12px">Refresh</button>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "instar",
3
- "version": "1.3.786",
3
+ "version": "1.3.787",
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-08T21:14:02.877Z",
5
- "instarVersion": "1.3.786",
4
+ "generatedAt": "2026-07-09T03:23:07.095Z",
5
+ "instarVersion": "1.3.787",
6
6
  "entryCount": 202,
7
7
  "entries": {
8
8
  "hook:session-start": {
@@ -0,0 +1,42 @@
1
+ # Upgrade Guide — vNEXT
2
+
3
+ <!-- assembled-by: assemble-next-md -->
4
+ <!-- bump: patch -->
5
+
6
+ ## What Changed
7
+
8
+ - **The "squished to the side" bug is fixed structurally.** Fourteen dashboard tab panels
9
+ (Routing Map, Spend, Tokens, LLM Activity, Integrated Being, PR Pipeline, Projects,
10
+ Initiatives, Secrets, Commitments, Resources, Blockers, Evidence, Threadline) are declared
11
+ after `</main>` and are therefore direct `.app` grid children; with the sidebar hidden they
12
+ auto-placed into the 280px sidebar COLUMN, rendering all content in a ~185px strip on a
13
+ 1280px viewport (operator screenshots, topic 29723). A shared `.tab-panel` class
14
+ (`grid-column: 1 / -1; min-width: 0`) now places every one of them across the full content
15
+ area — one rule instead of fourteen inline copies. The pre-existing `.ph-root` tabs keep
16
+ their own placement + prose width.
17
+ - **A placement floor makes the bug unrepeatable.** `tests/unit/dashboard-panel-placement.test.ts`
18
+ scans the after-main markup region and fails the build when a top-level panel lacks a
19
+ placement-carrying class (with an instructive message naming the panel and the fix), asserts
20
+ the `.tab-panel` rule keeps its grid span, and guards its own matcher with a population floor.
21
+ The old defense was a CSS comment on `.ph-root` — a wish; every panel added since repeated
22
+ the bug. This is the guarantee (Structure > Willpower).
23
+
24
+ ## What to Tell Your User
25
+
26
+ The dashboard tabs that used to render squeezed into a narrow strip on the left of a desktop
27
+ window — including the new Routing Map and Spend tabs — now use the full width of the window.
28
+ Nothing to enable; it's just fixed everywhere once the release lands.
29
+
30
+ ## Summary of New Capabilities
31
+
32
+ - None — this is a layout bug fix. (It also adds a build-time guard so a future dashboard tab
33
+ can't reintroduce the same squished layout.)
34
+
35
+ ## Evidence
36
+
37
+ `tests/unit/dashboard-panel-placement.test.ts` — 4 cases: rule present + spans grid, every
38
+ placement class actually declares grid-column, no bare after-main panel (negative control
39
+ verified: stripping one panel's class fails naming exactly that panel), matcher-anchor guard
40
+ (the slice skips CSS/JS mentions of `</main>`). Real-browser (headless Chromium) before/after
41
+ screenshots at 1280×800: content strip ~260px before, full-width after; 390×844 rendering is
42
+ byte-identical before vs after (placement-only change). All 106 dashboard-reading unit tests green.
@@ -0,0 +1,51 @@
1
+ # Side-Effects Review — Dashboard responsive fix (.tab-panel placement + floor test)
2
+
3
+ **Version / slug:** `dashboard-responsive-fix`
4
+ **Date:** `2026-07-08`
5
+ **Author:** `Instar Agent (echo)`
6
+ **Second-pass reviewer:** `not required`
7
+
8
+ ## Summary of the change
9
+
10
+ Fixes the "everything is squished to the side" dashboard bug (operator report with screenshots, topic 29723, 2026-07-08): fourteen tab panels declared after `</main>` in `dashboard/index.html` are direct `.app` grid children with no explicit grid placement, so the lone visible panel auto-places into the 280px sidebar column on desktop. The fix adds ONE shared `.tab-panel` CSS class (`grid-column: 1 / -1; min-width: 0`) applied to all fourteen panels (Integrated Being, PR Pipeline, Projects, Initiatives, Secrets, Commitments, Tokens, Resources, Blockers, LLM Activity, Routing Map, Spend, Evidence, Threadline), plus a regression floor test (`tests/unit/dashboard-panel-placement.test.ts`) that fails the build when a future after-main panel lacks a placement-carrying class. The pre-existing `.ph-root` per-tab fix is left untouched; its comment now points at the shared contract. Files touched: `dashboard/index.html`, `tests/unit/dashboard-panel-placement.test.ts`, `docs/specs/dashboard-responsive-fix.eli16.md`, this artifact, and a release fragment.
11
+
12
+ ## Decision-point inventory
13
+
14
+ No decision-point surface. This change is presentation-layer CSS/HTML plus a static test. It gates no information flow, blocks no actions, filters no messages, and constrains no agent behavior at runtime. (The new unit test constrains future COMMITS — the standard test-ratchet pattern — not runtime behavior.)
15
+
16
+ ---
17
+
18
+ ## 1. Over-block
19
+
20
+ No block/allow surface at runtime — over-block not applicable to agent/user traffic. For the commit-time ratchet: the floor test could "over-block" a future legitimate panel that is genuinely out of normal flow (e.g. a new fixed-position overlay). Mitigation is built in: the `OUT_OF_FLOW_EXEMPT` list with a required justification comment, and the failure message names the exact panel and both resolution paths.
21
+
22
+ ## 2. Under-block
23
+
24
+ The floor test keys on 4-space-indented `<div id=...>` openers in the after-`</main>` markup region (all 27 current top-level panels match this shape). A future panel authored at unconventional indentation, as a non-div element, or injected purely from JS would not be seen by the floor. Accepted: the regression vector this floor closes is the observed copy-paste pattern (14 real instances); the population-sanity assertion (≥20 openers visible) fails loudly if the matcher ever goes blind wholesale. Deeper enforcement (viewport smoke tests) belongs to the Dashboard UX Standard work tracked in the topic-29723 working brief. <!-- tracked: topic-29723 dashboard-ux-brief Increment 2 -->
25
+
26
+ ## 3. Level-of-abstraction fit
27
+
28
+ Right layer. The bug is a CSS grid-placement defect; the fix is a shared CSS class at the layout layer where the sibling container classes (`files-container`, `jobs-container`, `systems-container`, `features-container`, `dropzone-container`) already solve the same problem the same way. The alternative — per-panel inline styles — is exactly the pattern that produced fourteen copies of the bug. No smarter existing gate applies (this is not decision logic).
29
+
30
+ ## 4. Signal vs authority compliance
31
+
32
+ Compliant by vacuity at runtime: the change holds no blocking authority and produces no signal — it is inert presentation markup. The unit test is a build-time ratchet, the same class as every other test in `tests/unit/`; it holds commit-blocking authority through CI exactly like all tests do, with deterministic, human-readable failure output.
33
+
34
+ ## 5. Interactions
35
+
36
+ - Interacts with `switchTab()` only passively: switchTab toggles inline `display`; the new class carries grid placement only, so show/hide behavior is unchanged.
37
+ - `.ph-root` panels keep their own placement + 760px prose width; the new rule does not apply to them (no double-fire; the floor test accepts either class).
38
+ - Mobile breakpoint (`@media max-width: 768px`) collapses `.app` to one column; `grid-column: 1 / -1` resolves identically there — verified byte-identical mobile rendering before vs after the change.
39
+ - No other rule targets `.tab-panel` (fresh class name; grep-verified single definition).
40
+
41
+ ## 6. External surfaces
42
+
43
+ Visible change: dashboard tabs render full-width on desktop instead of squished — the operator-requested fix. No API change, no data change, no cross-agent surface, no timing/conversation-state dependency. Verified with real-browser (headless Chromium) before/after screenshots at 1280×800 and 390×844: desktop fixed; mobile rendering byte-identical to pre-change.
44
+
45
+ ## 7. Multi-machine posture (Cross-Machine Coherence)
46
+
47
+ Machine-local BY DESIGN in the same sense as all dashboard markup: the HTML ships identically to every machine with the release; each machine serves its own copy. No replicated state, no machine-boundary URL, no one-voice notice surface. Both of the operator's machines get the fix as they pick up the release.
48
+
49
+ ## 8. Rollback cost
50
+
51
+ Trivial: revert the commit (CSS class + class attributes + one test file). No data migration, no agent state, no config. A revert restores the prior (buggy) rendering and deletes the floor test with it.