instar 1.3.1663 → 1.3.1664
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/dist/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +9 -0
- package/dist/commands/server.js.map +1 -1
- package/dist/core/SafeGitExecutor.d.ts +33 -11
- package/dist/core/SafeGitExecutor.d.ts.map +1 -1
- package/dist/core/SafeGitExecutor.js +144 -116
- package/dist/core/SafeGitExecutor.js.map +1 -1
- package/dist/data/standards-guard-index.json +1 -1
- package/dist/data/standards-guard-index.meta.json +2 -2
- package/dist/data/standards-registry.meta.json +1 -1
- package/dist/native/InstarWedgeCanary.app/Contents/MacOS/InstarWedgeCanary +0 -0
- package/dist/native/instar-desktop-host +0 -0
- package/dist/recommended/catalog.js +1 -1
- package/dist/recommended/catalog.js.map +1 -1
- package/dist/recommended/recipes.d.ts.map +1 -1
- package/dist/recommended/recipes.js +3 -2
- package/dist/recommended/recipes.js.map +1 -1
- package/dist/recommended/setupState.d.ts +9 -0
- package/dist/recommended/setupState.d.ts.map +1 -1
- package/dist/recommended/setupState.js +17 -0
- package/dist/recommended/setupState.js.map +1 -1
- package/dist/server/AgentServer.d.ts.map +1 -1
- package/dist/server/AgentServer.js +5 -0
- package/dist/server/AgentServer.js.map +1 -1
- package/dist/server/recommendedServiceRoutes.d.ts +2 -0
- package/dist/server/recommendedServiceRoutes.d.ts.map +1 -1
- package/dist/server/recommendedServiceRoutes.js +41 -7
- package/dist/server/recommendedServiceRoutes.js.map +1 -1
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +7 -0
- package/dist/server/routes.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +47 -47
- package/src/data/standards-guard-index.json +1 -1
- package/src/data/standards-guard-index.meta.json +2 -2
- package/src/data/standards-registry.meta.json +1 -1
- package/upgrades/1.3.1664.md +32 -0
- package/upgrades/side-effects/recommended-services-stop-holds.md +64 -0
- package/upgrades/side-effects/safe-git-one-verb-classifier.md +117 -0
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# Side-Effects Review — SafeGitExecutor one verb classification
|
|
2
|
+
|
|
3
|
+
**Version / slug:** `safe-git-one-verb-classifier`
|
|
4
|
+
**Date:** `2026-11-04`
|
|
5
|
+
**Author:** `Echo`
|
|
6
|
+
**Second-pass reviewer:** `independent reviewer subagent (see below)`
|
|
7
|
+
|
|
8
|
+
## Summary of the change
|
|
9
|
+
|
|
10
|
+
The git funnel kept two verb lists, one per kind of surface, so a verb in neither list was refused by both and each refusal named the other (EVO-028). `src/core/SafeGitExecutor.ts` now has one table, `GIT_VERB_CLASSES`, and one classifier, `classifyGitInvocation`, which all five entry points use. The two exported sets are derived from the table. `check-ignore` is added as a read and joins `SOURCE_TREE_READ_TIER_VERBS`. An unclassified verb gets one shared refusal on every surface. `reflog` becomes a `shape` verb, so its non-read forms route through `run` to `execSync`. Tests: `tests/unit/SafeGitExecutor-verb-classifier.test.ts` (new), plus one-line updates to `tests/unit/SafeGitExecutor.test.ts` and `tests/unit/SafeGitExecutor-sourceTreeReadOk.test.ts`.
|
|
11
|
+
|
|
12
|
+
Proportion: Tier 1 declared, because a revert fully undoes it and it adds no new authority, with the full chain run anyway because this is the safety funnel (converged spec, second-pass review). About 170 added source lines, most of them the list becoming a table. Three spec rounds, at the cap. The draft was three weeks stale and the rounds kept finding real errors in what it said about the system.
|
|
13
|
+
|
|
14
|
+
## Decision-point inventory
|
|
15
|
+
|
|
16
|
+
- `SafeGitExecutor` verb gate — modify — same gate, one source of truth. No new blocking authority.
|
|
17
|
+
- `SafeGitExecutor.run` routing — modify — routes on the classifier. Only `reflog` routing changes.
|
|
18
|
+
- `SOURCE_TREE_READ_TIER_VERBS` — modify — gains `check-ignore`, opt-in per call.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## 1. Over-block
|
|
23
|
+
|
|
24
|
+
No legitimate call is newly refused. Every verb the classifier calls `unclassified` was refused by both surfaces before. Harmless unclassified verbs (`check-attr`, `show-branch`) stay refused on purpose; EVO-028 approved one verb, and each further one needs its own check. The refusal now tells the caller that adding a verb is a reviewed change.
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## 2. Under-block
|
|
29
|
+
|
|
30
|
+
This change does not close existing gaps. Read-classified invocations can still write or run a program: `remote -v add`, `config key --list`, `format-patch`, `hash-object -w`, `write-tree`, `symbolic-ref`, `--output` on `diff`, `log` and `show`, repo-local `core.fsmonitor`, `diff.external`. Echo reproduced the first two. Those are EVO-029 items 4 and 5 <!-- tracked: CMT-1124 -->, and the record was widened in this run. `check-ignore` inherits the `core.fsmonitor` exposure that `status` already has, so it adds no new class. `run` still reads `args[0]`, so a pre-verb flag is routed to `readSync` (EVO-029 item 1 <!-- tracked: CMT-1124 -->).
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 3. Level-of-abstraction fit
|
|
35
|
+
|
|
36
|
+
Right layer. The contradiction lived inside the funnel, and the classification belongs next to the shape checks it calls. Two scripts keep their own verb lists for unrelated jobs and are left alone (EVO-029 item 6 <!-- tracked: CMT-1124 -->).
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## 4. Signal vs authority compliance
|
|
41
|
+
|
|
42
|
+
**Required reference:** [docs/signal-vs-authority.md](../../docs/signal-vs-authority.md)
|
|
43
|
+
|
|
44
|
+
**Does this change hold blocking authority with brittle logic?**
|
|
45
|
+
|
|
46
|
+
- [ ] No — this change produces a signal consumed by an existing smart gate.
|
|
47
|
+
- [ ] No — this change has no block/allow surface.
|
|
48
|
+
- [ ] Yes — but the logic is a smart gate with full conversational context (LLM-backed with recent history or equivalent).
|
|
49
|
+
- [ ] ⚠️ Yes, with brittle logic — STOP. Reshape the design. Brittle detectors must not own block authority. Either promote the logic to smart-gate level (with proper context) or demote it to a signal that feeds an existing smart gate.
|
|
50
|
+
|
|
51
|
+
None of the four boxes fits exactly, so this is stated directly. The funnel is a deterministic allowlist over git's fixed command grammar. It judges no meaning and it predates this change. `docs/signal-vs-authority.md` names hard-invariant validators as outside the principle and a deterministic policy evaluator as a valid authority where inputs can be enumerated. This change adds no blocking authority: everything it refuses was refused already. The Standards-Conformance Gate flagged this in all three rounds, because the registry article names only the emergency-stop floor as an exception. That disagreement between the two documents is filed as feedback fb-69615365-30f and needs a ruling, because the registry is the constitution.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## 4b. Judgment-point check (Judgment Within Floors standard)
|
|
56
|
+
|
|
57
|
+
No static heuristic is added at a competing-signals point. Whether a verb is in a closed table has no competing signals.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## 5. Interactions
|
|
62
|
+
|
|
63
|
+
- **Source-tree guard:** the unclassified refusal now comes before the guard on `execSync` and `spawn`. That call was refused either way; only the error changes, from `SourceTreeGuardError` to `SafeGitExecutorError`. `leaseMediumSelection.ts:67` treats both alike. Classified verbs keep their order, pinned by a test.
|
|
64
|
+
- **`GitStateManager.ts:345`:** `update-index --refresh` is still refused and swallowed; only the swallowed text changes.
|
|
65
|
+
- **`machine.ts:174`:** unchanged. It still reaches `readSync` and is refused.
|
|
66
|
+
- **Audit log:** one new reason, `unclassified-verb`. Nothing reads audit reasons.
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## 6. External surfaces
|
|
71
|
+
|
|
72
|
+
None. No route, config, message, file or agent-installed surface changes. Refusal text changes only for unclassified verbs, and nothing in `src/` or `scripts/` reads refusal text.
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## 6b. Operator-surface quality (Operator-Surface Quality standard)
|
|
77
|
+
|
|
78
|
+
No operator surface touched — not applicable.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## 7. Multi-machine posture (Cross-Machine Coherence)
|
|
83
|
+
|
|
84
|
+
No new state, notice or URL. This is in-process classification that ships identically to every machine. The one machine dependence is in git, not here: `check-ignore` reads `.git/info/exclude` and the per-user ignore file (`$XDG_CONFIG_HOME/git/ignore`, by default `~/.config/git/ignore`, unless a repo-local `core.excludesFile` overrides it), so its answer can differ per machine. The spec states this for callers. No status surface changes.
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## 8. Rollback cost
|
|
89
|
+
|
|
90
|
+
Revert the commit. No stored state, config or migration. After a revert `check-ignore` is unreachable again and the contradictory messages return.
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Conclusion
|
|
95
|
+
|
|
96
|
+
Three review rounds changed the design in two ways: the unclassified refusal moved ahead of the source-tree guard, and `check-ignore` joined the source-tree read tier, without which the goal was only half met. They also corrected several false statements in the spec and exposed the wider gap now recorded under EVO-029. Clear to ship as a consistency fix. It is not a claim that the read surfaces are safe.
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Second-pass review (if required)
|
|
101
|
+
|
|
102
|
+
**Reviewer:** independent reviewer subagent (claude-opus-5-5), read-only, no shared context beyond this artifact and the diff
|
|
103
|
+
**Independent read of the artifact: concur**
|
|
104
|
+
|
|
105
|
+
Concur after two wording corrections, both applied: the per-user ignore file description, and "added" not "changed" for the line count. The reviewer ran old and new code side by side with a fake git over every table verb and every `git --list-cmds=main` command on all five surfaces, on plain and source-tree fixtures. Only three groups differ: unclassified verbs, `check-ignore`, and `run` with `reflog`. Table membership matches the old lists plus the two stated additions. Unstated and harmless: `run([''])` now reaches `readSync` and is still refused.
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Evidence pointers
|
|
110
|
+
|
|
111
|
+
Disconfirmation on unchanged source: 14 of 16 tests failed for the expected reasons, including "readSync called with destructive verb 'check-ignore'" and "destructive shape 'reflog expire ...'". Convergence report: `docs/specs/reports/safe-git-one-verb-classifier-convergence.md`.
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## Class-Closure Declaration (display-only mirror)
|
|
116
|
+
|
|
117
|
+
No agent-authored-artifact defect — not applicable. This fixes source code, and adds no self-triggered controller.
|