instar 1.3.810 → 1.3.812

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.
@@ -0,0 +1,21 @@
1
+ # ELI16 — Codex model retirements self-heal
2
+
3
+ ## What Changed
4
+
5
+ OpenAI can remove a model from the ChatGPT-account Codex surface without changing Instar. Previously, every small internal Codex judgment call using that model would begin failing until a person found the incident and manually changed the tier map. Instar now recognizes Codex's specific model-retirement response and retries that one call once with a live-verified safe model.
6
+
7
+ ## What to Tell Your User
8
+
9
+ A retired Codex model should no longer take down classifications, gates, tone checks, or commitment checks across the fleet. The recovery is intentionally narrow: it does not swap models for rate limits, login problems, network failures, or unrelated bad requests, so those real problems remain visible instead of being hidden behind a retry.
10
+
11
+ ## Summary of New Capabilities
12
+
13
+ - Classify Codex's exact ChatGPT-account “model not supported” response as an unsupported-model signal rather than generic authentication failure.
14
+ - Retry once on `gpt-5.4-mini`, the designated live-verified safe floor and a member of Instar's known Codex model registry.
15
+ - Preserve the original failure behavior for 429s, authentication errors, unrelated 400s, timeouts, and network failures.
16
+ - Stop after the fallback attempt and surface its error if it also fails; there is no recursive or unbounded retry path.
17
+ - Apply the same recovery to both the default structured exec path and the legacy plain-output kill-switch path.
18
+
19
+ ## Evidence
20
+
21
+ Unit coverage proves both sides of the classification boundary, the exact two-model attempt sequence, fallback failure surfacing, and non-retry behavior for neighboring errors. Exec-path coverage drives the real structured spawn helper through retirement and recovery. Existing provider, event-normalizer, lint, build, and three-tier suites remain the release gates.
@@ -0,0 +1,77 @@
1
+ # Side-Effects Review — Codex model-retirement fallback
2
+
3
+ **Version / slug:** `codex-model-retirement-fallback`
4
+ **Date:** 2026-07-10
5
+ **Author:** Instar-codey
6
+ **Second-pass reviewer:** not required
7
+
8
+ ## Summary of the change
9
+
10
+ `eventNormalizer.ts` now emits the existing `unsupported` error kind for Codex's exact ChatGPT-account model-retirement response. `CodexCliIntelligenceProvider` consumes that classified signal and retries once using the explicit `gpt-5.4-mini` safe-floor constant, after verifying it remains in `KNOWN_CODEX_MODEL_IDS`. Both structured and legacy exec modes use the same bounded authority.
11
+
12
+ ## Decision-point inventory
13
+
14
+ - Codex upstream-error classification — modify — distinguish the model-retirement response from generic authentication errors.
15
+ - Internal Codex retry authority — add — permit one safe-floor retry only for the classified retirement signal.
16
+
17
+ ## 1. Over-block
18
+
19
+ No legitimate request is blocked. A successful first attempt is unchanged. Failures outside the exact retirement signature continue surfacing exactly as before. A caller already using the fallback floor is never retried, preventing a same-model duplicate call.
20
+
21
+ ## 2. Under-block
22
+
23
+ If OpenAI changes the retirement wording, the new response will surface rather than trigger recovery; this is deliberately fail-loud. The fallback model can itself be retired, in which case its error surfaces after the single retry. API-key-only model availability is not inferred from generic errors.
24
+
25
+ ## 3. Level-of-abstraction fit
26
+
27
+ The event normalizer owns provider-native error classification. The intelligence provider owns bounded execution recovery and already controls both spawn modes. The retry consumes the shared classified signal rather than creating a second raw-stderr policy. The known-model registry remains the authority for acceptable Codex model identities.
28
+
29
+ ## 4. Signal vs authority compliance
30
+
31
+ Required reference: [docs/signal-vs-authority.md](../../docs/signal-vs-authority.md)
32
+
33
+ - [x] No — the brittle provider-signature detector produces the structured `unsupported` signal; the provider's narrowly enumerated recovery policy consumes it.
34
+
35
+ This is also a constrained protocol invariant, not conversational judgment. The detector cannot retry anything itself. The authority requires the exact classified condition, a different requested model, and a known registry member before acting.
36
+
37
+ ## 5. Interactions
38
+
39
+ - **Shadowing:** retirement classification runs before generic auth classification so the recoverable condition is no longer swallowed by the broader category.
40
+ - **Double-fire:** `evaluate()` owns the only retry. The mode-specific execution methods do not recurse and do not contain fallback logic.
41
+ - **Races:** there is no shared mutable retry state; the attempt bound is lexical to one evaluation.
42
+ - **Feedback loops:** the fallback invocation bypasses the outer catch, so a second retirement response surfaces instead of feeding back into another retry.
43
+ - **Observability:** `onModel` receives the original model and then the fallback model. Existing usage callbacks still reflect any structured usage that Codex emitted per attempt.
44
+
45
+ ## 6. External surfaces
46
+
47
+ Codex-backed agents gain automatic continuity for internal judgment calls during a model retirement. No endpoint, configuration, database, credential, user notice, external network integration, generated URL, or operator action is added. Other error types remain externally visible as failures.
48
+
49
+ ## 6b. Operator-surface quality
50
+
51
+ No operator surface — not applicable.
52
+
53
+ ## 7. Multi-machine posture
54
+
55
+ **Replicated by code rollout.** The fallback policy has no mutable state; every updated machine applies the same constant, classifier, registry check, and attempt bound independently. It emits no user-facing notice, holds no durable state, does not interact with topic transfer, and generates no URLs.
56
+
57
+ ## 8. Rollback cost
58
+
59
+ Pure code rollback and patch release. No state migration or agent repair is required. During rollback propagation, a newly retired model would again fail loudly rather than corrupt state or silently choose arbitrary models.
60
+
61
+ ## Conclusion
62
+
63
+ The recovery is intentionally smaller than a generic retry policy: one exact classified provider response, one registry-checked safe floor, one additional attempt. Boundary tests preserve visibility for neighboring errors and prove the fallback cannot loop. Clear to ship after full gates and CI.
64
+
65
+ ## Second-pass review
66
+
67
+ Not required by the instar-dev high-risk list: this changes an internal provider error-recovery path, not messaging, session lifecycle, dispatch, compaction, trust, coherence, or a sentinel/guard/gate/watchdog.
68
+
69
+ ## Evidence pointers
70
+
71
+ - `tests/unit/CodexCliIntelligenceProvider.test.ts`
72
+ - `tests/unit/codex-cli-provider-execjson.test.ts`
73
+ - `tests/unit/providers/adapters/openai-codex/observability/eventNormalizer.test.ts`
74
+
75
+ ## Class-Closure Declaration
76
+
77
+ No agent-authored-artifact defect and no self-triggered controller — not applicable.
@@ -0,0 +1,225 @@
1
+ # Side-Effects Review — Dashboard glance floors F10/F11 (Phase 1)
2
+
3
+ **Version / slug:** `glance-floors-f10-f11`
4
+ **Date:** `2026-07-10`
5
+ **Author:** `echo`
6
+ **Second-pass reviewer:** `not required` (no block/allow, session-lifecycle, or gate/sentinel/guard surface — this is a display-only front-end component; see §5)
7
+
8
+ ## Summary of the change
9
+
10
+ Adds the two "glance floors" (F10 glance + F11 universal drill-down) to the Dashboard
11
+ UX Standard and ships their enforcement: one shared front-end component
12
+ `dashboard/glance.js` (a plain-English headline + ≤5 labeled tiles + a drill-down
13
+ container that opens a filtered list then a full record), a pure `validateGlanceSpec`
14
+ that refuses an over-budget or jargon-carrying glance, and three test tiers
15
+ (unit F10 + F11, integration against the real `/commitments` route, e2e feature-alive).
16
+ One view — the Commitments tab — is wired onto the component as the reference
17
+ implementation (glance layer → existing list as Layer 2 → full record as Layer 3).
18
+ Files: `docs/specs/dashboard-ux-standard.md` (+ `.eli16.md` + convergence report),
19
+ `docs/STANDARDS-REGISTRY.md`, `dashboard/glance.js` (new), `dashboard/index.html`
20
+ (Commitments panel markup + CSS + `loadCommitments` rewrite), and four test files.
21
+ **No `src/*.ts` change, no new server route, no config, no hooks.**
22
+
23
+ ## Decision-point inventory
24
+
25
+ **No decision-point surface.** Nothing here gates information flow, blocks actions,
26
+ filters messages, or constrains agent behavior. `validateGlanceSpec` is a build-time
27
+ quality assertion over component-authored UI copy — it decides how a dashboard tab
28
+ *renders*, never what the agent may do. The one "refusal" (the component refusing to
29
+ render an over-budget/jargon glance) affects presentation only and falls back to an
30
+ honest degraded glance, never a raw dump — it holds no authority over any pipeline.
31
+
32
+ - `validateGlanceSpec` (dashboard/glance.js) — add — a pure UI-copy budget/jargon
33
+ check; presentation-only, no runtime authority.
34
+
35
+ ---
36
+
37
+ ## 1. Over-block
38
+
39
+ **No block/allow surface — over-block not applicable.** The nearest analog is the
40
+ jargon check possibly rejecting legitimate glance copy. It is scoped to
41
+ *component-authored* Layer-1 strings only (headline + tile labels + values); agent/
42
+ user free text lives at Layer 2/3 and is displayed (sanitized), never vocab-gated — so
43
+ a user phrasing a promise with jargon can never blank the operator's glance. If the
44
+ check does reject a builder's copy, the component renders an honest degraded glance
45
+ (truncated headline + a drill), never a raw dump — no operator-visible data is lost.
46
+
47
+ ---
48
+
49
+ ## 2. Under-block
50
+
51
+ **No block/allow surface — under-block not applicable.** As a readability floor the
52
+ jargon detector is deliberately heuristic (it is NOT a secret-redaction boundary —
53
+ secret handling stays at the API/data layer, untouched here). It can miss novel
54
+ concept-jargon expressed in ordinary words; that residual is a tracked later-phase
55
+ tightening, and the curated insider-TERM denylist + form heuristics cover the known
56
+ classes (internal IDs, machine ids, config keys, cadences, state-machine names) with
57
+ bypass-variant tests.
58
+
59
+ ---
60
+
61
+ ## 3. Level-of-abstraction fit
62
+
63
+ Right layer. F10/F11 are enforced at the **component boundary** (a shared renderer +
64
+ a pure validator), not by scraping bespoke per-tab markup — because the glance content
65
+ is JS-rendered from live data, a static grep of `index.html` cannot see it, so the
66
+ component is the correct place to make the floor structural. The component REUSES the
67
+ existing lower-level primitives instead of re-implementing them: `sanitizeForDisplay`,
68
+ `hasOpenInteraction`, and `updateCountdowns` are imported from `dashboard/subscriptions.js`
69
+ (the shipped F9 safety + interaction-hold bar), so both surfaces share one contract.
70
+
71
+ ---
72
+
73
+ ## 4. Signal vs authority compliance
74
+
75
+ **Required reference:** [docs/signal-vs-authority.md](../../docs/signal-vs-authority.md)
76
+
77
+ - [x] No — this change has no block/allow surface.
78
+
79
+ `validateGlanceSpec` is a build-time/presentation quality check with no blocking
80
+ authority over any runtime pipeline. It informs how a tab renders (and, in the tests,
81
+ fails CI on a NEW below-floor tab) — it never gates a message, action, session, or
82
+ information flow. There is no brittle detector holding runtime authority here.
83
+
84
+ ---
85
+
86
+ ## 5. Interactions
87
+
88
+ - **Shadowing:** none. The glance component is additive; it renders into a new
89
+ `#commitmentsGlance` container. It does not run before/after any check.
90
+ - **Double-fire:** none. `loadCommitments` replaces (never appends) the glance root
91
+ and the drill container, so repeated renders/polls cannot accumulate DOM or listeners.
92
+ - **Races:** F9-composed. While a drill interaction is open (the drill container carries
93
+ `data-interaction-open`, or a field is focused/dirty), a re-render MERGES live counts
94
+ via `patchGlanceCounts` instead of rebuilding over the interaction — reusing the shipped
95
+ `hasOpenInteraction`. The Commitments tab has no background poll today, so this is
96
+ latent-but-correct (and unit-tested), and will already be right if a poll is added.
97
+ - **Feedback loops:** none — a pure renderer over data the tab already fetched.
98
+
99
+ ---
100
+
101
+ ## 6. External surfaces
102
+
103
+ - **Other agents / users / external systems:** none. `dashboard/glance.js` is a
104
+ client-side ESM module served statically; it holds no secrets, opens no endpoint, and
105
+ makes no network call of its own (the Commitments reference reuses the EXISTING authed
106
+ `/commitments` GET and the EXISTING `/commitments/:id/deliver` POST).
107
+ - **Persistent state:** none touched.
108
+ - **Operator surface (Mobile-Complete):** the operator actions on this surface (view
109
+ promises, drill in, mark delivered) are all completable from the dashboard, which is
110
+ phone-reachable via the tunnel + PIN — no new laptop-bound step. The "Mark delivered"
111
+ action lives on the Layer-3 record and calls the existing authed route.
112
+
113
+ ---
114
+
115
+ ## 6b. Operator-surface quality (Operator-Surface Quality standard)
116
+
117
+ This change touches an operator surface (`dashboard/glance.js`, `dashboard/index.html`).
118
+ The glance floors ARE the whole-view structural application of this standard.
119
+
120
+ 1. **Leads with the primary action?** Yes. On arrival the Commitments tab shows the
121
+ headline answer ("I'm carrying N open promises; K need attention soon, none overdue.")
122
+ and the big labeled tiles — the state and the way in, visible immediately, no toggle,
123
+ no below-the-fold, no explanatory prose in front.
124
+ 2. **Zero raw internals as primary content?** Yes — enforced by F10 itself. No internal
125
+ IDs, state-machine names, config keys, or seconds-cadences may appear at the glance
126
+ layer (a machine-checked rule). The raw detail (`CMT-953`, `cadence 1800s`, timestamps)
127
+ lives at Layer 3, one click down, where it belongs — verified in a real browser (tile →
128
+ list → record).
129
+ 3. **Destructive actions de-emphasized?** N/a-leaning: the only action is the constructive
130
+ "Mark delivered", placed on the Layer-3 record (not above the glance). There is no
131
+ destructive control on this surface; nothing louder than the primary path.
132
+ 4. **Plain language + phone width?** Yes. Copy reads the way a person would say it
133
+ ("Waiting on you", "Due soon", "Quiet"). Tiles use an auto-fit grid that reflows at
134
+ phone width; the drill list/records stack; nothing scrolls the page sideways (records
135
+ use `word-break`/`overflow-wrap`). Verified visually at 900px and via the responsive
136
+ grid.
137
+
138
+ ---
139
+
140
+ ## 7. Multi-machine posture (Cross-Machine Coherence)
141
+
142
+ **machine-local BY DESIGN → effectively `unified` by construction.** `dashboard/glance.js`
143
+ is a **stateless client-side renderer**: it persists nothing, reads no config, holds no
144
+ server state, and introduces no machine-divergent state. It renders whatever data the
145
+ adopting tab already fetched and inherits that endpoint's existing posture — the
146
+ Commitments reference drills into `GET /commitments`, whose pool-scope posture
147
+ (`?scope=mesh`) is unchanged by this PR. So there is no new machine-local surface to
148
+ justify and no `machine-local-justification` marker is required.
149
+
150
+ - **User-facing notices:** none emitted (a passive render surface — one-voice gating n/a).
151
+ - **Durable state:** none held (nothing strands on topic transfer).
152
+ - **Generated URLs:** none (no links minted that must survive a machine boundary).
153
+
154
+ **Migration Parity:** met by construction. The dashboard ships wholesale via
155
+ `express.static(dashboardDir)` from the installed package directory (`package.json`
156
+ `files` includes `dashboard/`; `AgentServer.resolveDashboardDir` resolves to the package
157
+ root, not the agent home). A package update replaces `dashboard/glance.js` + updated
158
+ `index.html` on the normal update path — exactly as `dashboard/subscriptions.js` shipped —
159
+ so already-deployed agents receive the glance with **no `PostUpdateMigrator` entry** and
160
+ no `init`-only templating. `loadCommitments` loads `glance.js` through the same `try/catch`
161
+ dynamic-import guard the other tabs use, so a missing/failed module degrades the tab
162
+ gracefully. **Agent Awareness:** n/a — this is an internal dashboard UX/dev standard (how
163
+ a view renders), not a new operator-invocable capability/route/config/hook; the awareness
164
+ surface is `STANDARDS-REGISTRY.md` (nine → eleven floors), already updated.
165
+
166
+ ---
167
+
168
+ ## 8. Rollback cost
169
+
170
+ **Pure front-end change — revert and ship a patch.** No persistent state, no data
171
+ migration, no agent-state repair. `dashboard/glance.js` and the `index.html` edits are
172
+ replaced wholesale on the next package update; reverting the commit restores the prior
173
+ Commitments renderer. No user-visible regression during the rollback window (the tab
174
+ simply reverts to its previous look). The new tests would revert with the code.
175
+
176
+ ---
177
+
178
+ ## Conclusion
179
+
180
+ This review produced no blocking concerns. The change is display-only with no
181
+ decision-point, block/allow, session-lifecycle, or gate/sentinel surface, so no
182
+ second-pass review is required. The design was materially hardened by /spec-converge
183
+ (a six-angle internal panel + the code-backed Standards-Conformance Gate + an external
184
+ Gemini pass across three rounds): the Layer-1-is-100%-component-authored invariant that
185
+ makes the jargon check both safe and complete; the XSS/display-safety contract reusing
186
+ the shipped `sanitizeForDisplay`; bypass-resistant vocab detection; the honest-degraded
187
+ (never raw-dump) failure mode; a strengthened F11 (non-vacuous, distinct, tile→list→record,
188
+ XSS + dead-end negatives); the structural grandfather ratchet (completeness + monotonic
189
+ ceiling); the one-population honest tile→server-field derivation with a count-truthfulness
190
+ test; and all three test tiers. Verified live in a real browser (Playwright): the
191
+ Commitments glance renders headline + tiles, and drilling opens the filtered list then the
192
+ full record with the raw IDs/cadence correctly one click down. Clear to ship.
193
+
194
+ ---
195
+
196
+ ## Second-pass review (if required)
197
+
198
+ **Reviewer:** not required — no block/allow, messaging-dispatch, session-lifecycle,
199
+ compaction, coherence/idempotency/trust, or sentinel/guard/gate/watchdog surface (Phase-5
200
+ triggers). Display-only front-end component.
201
+
202
+ ---
203
+
204
+ ## Evidence pointers
205
+
206
+ - Unit: `tests/unit/dashboard-glance-word-budget.test.ts` (31 tests — F10 budget/jargon +
207
+ bypass variants + adversarial-fixture conformance + count-truthfulness + the ratchet),
208
+ `tests/unit/dashboard-glance-drilldown.test.ts` (8 tests — F11 walk, Layer-2→3, negatives,
209
+ F9 hold, XSS).
210
+ - Integration: `tests/integration/glance-commitments-tab.test.ts` (glance built + walked
211
+ against a real `GET /commitments` HTTP response with a live `CommitmentTracker`).
212
+ - E2E: `tests/e2e/glance-commitments-tab-lifecycle.test.ts` (feature-alive: 200 not 503,
213
+ feature ON/OFF, full render, no `<script>` survives).
214
+ - Live: Playwright render of the reference glance — headline "I'm carrying 5 open
215
+ promises; 2 need attention soon, none overdue.", 4 tiles, tile→list (2 rows)→record
216
+ (`id: CMT-953`, `cadence: 1800s` at Layer 3 only).
217
+ - Spec convergence report: `docs/specs/reports/dashboard-ux-standard-convergence.md`.
218
+
219
+ ---
220
+
221
+ ## Class-Closure Declaration (display-only mirror)
222
+
223
+ No agent-authored-artifact defect and no self-triggered controller (no loop / monitor /
224
+ sentinel / reaper / scheduler / recovery path that fires a restart / swap / respawn /
225
+ spawn / notify / retry / re-drive / kill) — **not applicable**.