instar 1.3.660 → 1.3.661
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.
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "./builtin-manifest.schema.json",
|
|
3
3
|
"schemaVersion": 1,
|
|
4
|
-
"generatedAt": "2026-06-25T07:
|
|
5
|
-
"instarVersion": "1.3.
|
|
4
|
+
"generatedAt": "2026-06-25T07:21:02.386Z",
|
|
5
|
+
"instarVersion": "1.3.661",
|
|
6
6
|
"entryCount": 202,
|
|
7
7
|
"entries": {
|
|
8
8
|
"hook:session-start": {
|
|
@@ -5,6 +5,26 @@
|
|
|
5
5
|
|
|
6
6
|
## What Changed
|
|
7
7
|
|
|
8
|
+
Adds a new constitutional standard, **"Verify the State, Not Its Symbol"**, to
|
|
9
|
+
`docs/STANDARDS-REGISTRY.md` (Substrate family), and registers it as **P20** in
|
|
10
|
+
`docs/INSTAR-DESIGN-PRINCIPLES-AND-LESSONS.md` so the `/spec-converge` lessons-aware
|
|
11
|
+
reviewer fires on every future spec. Lesson L5 is re-pointed to P20 as its parent.
|
|
12
|
+
|
|
13
|
+
The standard names a class of blind spot that has bitten the fleet repeatedly under
|
|
14
|
+
different disguises: a detector, gate, verifier, or sentinel that trusts a *symbol*
|
|
15
|
+
of a state (a string on a pane, a marker, the presence or absence of a proxy signal)
|
|
16
|
+
instead of confirming the *state itself* — in both directions, where the presence of
|
|
17
|
+
a symbol is taken as the condition being true and the absence of a signal is taken as
|
|
18
|
+
the condition being true. When the evidence needed to decide is unavailable, the result
|
|
19
|
+
is **unknown**, and unknown must fail toward the least-harmful action for that specific
|
|
20
|
+
detector — which is not always "closed".
|
|
21
|
+
|
|
22
|
+
Documentation-only: this change adds no runtime, gate, or `src` surface. The companion
|
|
23
|
+
fix for the crystallizing instance (the RateLimitSentinel false-positive) is specified
|
|
24
|
+
and review-converged in `docs/specs/ratelimit-sentinel-false-positive-hardening.md`,
|
|
25
|
+
which this change also lands so the standard's enforcement-first citation resolves to a
|
|
26
|
+
real file; the implementation of that fix ships as a separate, tracked follow-on PR.
|
|
27
|
+
|
|
8
28
|
Fixed the "session paused" hang: an autonomous session would freeze indefinitely the first time a helper sub-agent (spawned via the Task/Agent tool) ran a shell command. Root cause: a sub-agent does NOT inherit the parent session's `--dangerously-skip-permissions` MODE — confirmed against Claude Code docs, it inherits only the permission RULES from `.claude/settings.json`. With no allow-rules configured, the sub-agent's first `Bash` call surfaced the interactive "This command requires approval" dialog, and in an unattended run there was no human to answer it, so the session sat modal-blocked forever (indistinguishable from "paused"). It affected the whole fleet because every agent shipped with an empty permissions block.
|
|
9
29
|
|
|
10
30
|
`PostUpdateMigrator.ensurePermissionAllowRules()` now runs inside `migrateSettings()` and adds a `permissions.allow` list for the built-in tools a sub-agent uses (`Bash`, `Read`, `Edit`, `Write`, `Glob`, `Grep`, `Task`, `NotebookEdit`, `WebFetch`, `WebSearch`, `TodoWrite`). Sub-agents inherit permission rules, so the allow-rule is the structural lever that reliably applies — unlike the existing `PermissionRequest` auto-approve hook, which does not reliably fire for sub-agent calls. The migration is idempotent (adds only missing tool names), never touches the operator's `deny`/`ask` lists, and deliberately excludes MCP tools (`mcp__*`) so external/network operations keep their external-operation-gate approval posture. Because it rides `migrateSettings()`, every existing agent picks it up on its next update and every new agent gets it at init (Migration Parity).
|
|
@@ -13,14 +33,37 @@ Safety is unchanged: the allow-rules only skip the duplicative human-in-the-loop
|
|
|
13
33
|
|
|
14
34
|
## What to Tell Your User
|
|
15
35
|
|
|
36
|
+
- **A new "verify the real state, not a sign of it" rule**: "I added a standard to how I'm
|
|
37
|
+
built so that my own watchers can't cry wolf at a word on the screen, or go silent because
|
|
38
|
+
they looked for proof in the wrong place. From now on, anything I build that watches for a
|
|
39
|
+
problem has to confirm the problem is really happening before it acts — and when it genuinely
|
|
40
|
+
can't tell, it errs toward the quiet, least-harmful choice instead of the loudest one. This
|
|
41
|
+
came straight out of the false 'you're throttled' alarms you saw tonight."
|
|
42
|
+
|
|
16
43
|
If your agent ever seemed to "pause" mid-task during an unattended/autonomous run — silently stuck and only resuming when you messaged it — this is a common cause: a helper it spawned hit an approval prompt nobody was there to answer. After this update (and a session restart so the new settings load), helper tasks no longer stall on those prompts, so autonomous runs keep moving. Your safety guards are unchanged — every command still passes the same pre-action checks; the only thing removed is the approval pop-up that had no one to answer it.
|
|
17
44
|
|
|
18
45
|
## Summary of New Capabilities
|
|
19
46
|
|
|
47
|
+
| Capability | How to Use |
|
|
48
|
+
|-----------|-----------|
|
|
49
|
+
| "Verify the State, Not Its Symbol" standard (P20) | automatic — the `/spec-converge` lessons-aware reviewer now flags any future spec whose detector fires on a single uncorroborated symbol, reads a self-writable channel, or treats absence as the bad state |
|
|
50
|
+
|
|
20
51
|
- `PostUpdateMigrator.ensurePermissionAllowRules()` — adds inherited `permissions.allow` rules for sub-agent built-in tools to every agent's `.claude/settings.json` via the migration path (new agents at init, existing agents on update). Idempotent, non-clobbering of operator `deny`/`ask`, and scoped to local tools (MCP stays gated by the external-operation-gate).
|
|
21
52
|
|
|
22
53
|
## Evidence
|
|
23
54
|
|
|
55
|
+
Earned from a live recurrence, not a hypothetical. On 2026-06-24 (topic 16566) the
|
|
56
|
+
RateLimitSentinel fired "this turn died on an API error" because the literal words
|
|
57
|
+
`API Error:` were on the session pane — placed there by the session *investigating* API
|
|
58
|
+
errors, with nothing actually failed — then cried wolf for ~11 minutes because its recovery
|
|
59
|
+
verifier looked for the session transcript in one Claude account home while the session ran
|
|
60
|
+
under another, reading absence-of-file as "never recovered". The detector that diagnosed the
|
|
61
|
+
bug was, live, tripped by the bug. The same class had recurred 4+ times before under different
|
|
62
|
+
disguises (2026-06-06 stale-transcript-pointer crying-wolf, the AUP-rejection wedge, the origin
|
|
63
|
+
of lesson L5), each patched point-wise without ever naming the class — the registry's promotion
|
|
64
|
+
signal. The companion code fix's reproduction + before/after is carried in its own spec and
|
|
65
|
+
follow-on PR; this PR is documentation-only and changes no runtime behavior to reproduce.
|
|
66
|
+
|
|
24
67
|
- **Reproduction (2026-06-24):** an unattended autonomous run sat silent for ~68 min; a screenshot showed the session modal-blocked on a sub-agent's `Bash` "This command requires approval" dialog. Confirmed the same class on a second agent (AI Guy). Settings inspection showed the `permissions` block was entirely absent (no allow-rules for sub-agents to inherit).
|
|
25
68
|
- **Mechanism confirmed:** Claude Code docs — sub-agents inherit permission RULES but not the permission MODE; PreToolUse hooks run BEFORE permission-rule evaluation and a hook exiting 2 blocks the call even for an allowed tool (so allow-rules cannot weaken the guards).
|
|
26
69
|
- **Tests:** `tests/unit/PostUpdateMigrator-permissionAllowRules.test.ts` — 6 tests: adds all sub-agent tools when absent; includes Bash; does NOT blanket-allow MCP; preserves operator allow entries with no duplicates; never touches deny/ask; idempotent on second pass. All passing. Adjacent `PostUpdateMigrator-cleanupPeriodDays.test.ts` (same migrateSettings path) still green. `npm run build` green.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Side-Effects Review — Verify the State, Not Its Symbol (constitution amendment)
|
|
2
|
+
|
|
3
|
+
**Change:** Documentation-only. Adds the constitutional standard "Verify the State, Not Its
|
|
4
|
+
Symbol" to `docs/STANDARDS-REGISTRY.md` (Substrate section), registers it as **P20** in
|
|
5
|
+
`docs/INSTAR-DESIGN-PRINCIPLES-AND-LESSONS.md` (the surface the `/spec-converge` lessons-aware
|
|
6
|
+
reviewer loads), re-points L5 to P20 as its parent, updates the Part-4 reviewer range to P1-P20,
|
|
7
|
+
and lands the supporting analysis spec + ELI16. **No runtime/`src` surface.** Operator-ratified
|
|
8
|
+
(Justin, topic 16566, 2026-06-24) after independent verification that it is a real gap.
|
|
9
|
+
|
|
10
|
+
1. **Over-block** — None. No code path, gate, or filter changes; nothing new can reject input.
|
|
11
|
+
The only behavioral effect is additive: the spec-converge reviewer gains one more lens (P20)
|
|
12
|
+
to flag a future spec — advisory findings, never a hard block of runtime behavior.
|
|
13
|
+
2. **Under-block** — The standard is enforced today only via the lessons-aware reviewer (advisory)
|
|
14
|
+
+ the companion code fix (the crystallizing instance). The `no-uncorroborated-symbol-fire` CI
|
|
15
|
+
ratchet that would mechanically catch *new* violating callsites is named as the next enforcement
|
|
16
|
+
surface, not yet built — so a brittle detector added between now and that ratchet relies on the
|
|
17
|
+
reviewer catching it. Stated honestly in the standard's "Applied through", not hidden.
|
|
18
|
+
3. **Level-of-abstraction fit** — Correct layer. It is a Substrate (model-level truth) standard, a
|
|
19
|
+
parent of the existing L5 lesson and the AUP-wedge note; placed beside its siblings
|
|
20
|
+
(No Silent Degradation, Distrust Temporary Success) and registered in the same P-catalog the
|
|
21
|
+
reviewer already consumes. No new abstraction invented.
|
|
22
|
+
4. **Signal vs authority (P2)** — Compliant and explicitly differentiated: the standard's text
|
|
23
|
+
states it is *orthogonal* to Signal-vs-Authority (which governs who may BLOCK) — it governs the
|
|
24
|
+
*evidentiary correctness* a detector must have whether it is a signal-emitter or a gate. The
|
|
25
|
+
amendment itself holds no authority; it is documentation feeding an advisory reviewer.
|
|
26
|
+
5. **Interactions** — Touches the shared P-catalog: P18/P19 already existed, so the new entry is
|
|
27
|
+
**P20** (verified free) and the Part-4 range bumped P1-P19 → P1-P20. L5 gains a parent pointer.
|
|
28
|
+
No collision with the unrelated registry "No Unbounded Loops" P19 reference (left intact). No
|
|
29
|
+
migration surface (these docs are not agent-installed files; Migration Parity N/A).
|
|
30
|
+
6. **External surfaces** — None. Internal developer-facing docs only; no user/agent/API surface,
|
|
31
|
+
no template (`generateClaudeMd`) change, no config, no hook.
|
|
32
|
+
7. **Multi-machine posture** — N/A (documentation). The standard it describes is, for detectors,
|
|
33
|
+
machine-local-by-design (each machine verifies its own sessions) — captured in the companion
|
|
34
|
+
fix's own side-effects review, not here.
|
|
35
|
+
8. **Rollback cost** — Trivial: revert the doc commit. No data, no state, no deployed behavior to
|
|
36
|
+
unwind. The companion code fix ships and rolls back independently on its own branch.
|
|
37
|
+
|
|
38
|
+
**Second-pass review:** Not required — documentation-only, no block/allow decision, no session
|
|
39
|
+
lifecycle, no gate/sentinel/watchdog code. (The companion CODE fix
|
|
40
|
+
`ratelimit-sentinel-false-positive-hardening`, which DOES touch sentinels, carries its own
|
|
41
|
+
mandatory Phase-5 second-pass on its own branch.)
|