instar 1.3.1158 → 1.3.1160
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/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/package.json +1 -1
- package/src/data/builtin-manifest.json +2 -2
- 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.1160.md +67 -0
- package/upgrades/side-effects/gemini-env-refusal-extract.md +60 -0
- package/upgrades/side-effects/registry-asset-freshness.md +76 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"generatedFrom": "source-tree",
|
|
4
4
|
"registrySha256": "81b53363a440e832672618965540b3e507ae0d93adcc67ec2b93daf7933b3ab4",
|
|
5
|
-
"packageVersion": "1.3.
|
|
5
|
+
"packageVersion": "1.3.1160",
|
|
6
6
|
"guards": [
|
|
7
7
|
{
|
|
8
8
|
"ref": "docs/audits/phase-b/f10-triage.md",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"sha256": "
|
|
2
|
+
"sha256": "05daed4cc90fbaa0916c051d8cf8985aa11cdc27f15f50ea5a3ffeff29550857",
|
|
3
3
|
"registrySha256": "81b53363a440e832672618965540b3e507ae0d93adcc67ec2b93daf7933b3ab4",
|
|
4
|
-
"packageVersion": "1.3.
|
|
4
|
+
"packageVersion": "1.3.1160"
|
|
5
5
|
}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "./builtin-manifest.schema.json",
|
|
3
3
|
"schemaVersion": 1,
|
|
4
|
-
"generatedAt": "2026-08-15T04:
|
|
5
|
-
"instarVersion": "1.3.
|
|
4
|
+
"generatedAt": "2026-08-15T04:54:47.730Z",
|
|
5
|
+
"instarVersion": "1.3.1160",
|
|
6
6
|
"entryCount": 202,
|
|
7
7
|
"entries": {
|
|
8
8
|
"hook:session-start": {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"generatedFrom": "source-tree",
|
|
4
4
|
"registrySha256": "81b53363a440e832672618965540b3e507ae0d93adcc67ec2b93daf7933b3ab4",
|
|
5
|
-
"packageVersion": "1.3.
|
|
5
|
+
"packageVersion": "1.3.1160",
|
|
6
6
|
"guards": [
|
|
7
7
|
{
|
|
8
8
|
"ref": "docs/audits/phase-b/f10-triage.md",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"sha256": "
|
|
2
|
+
"sha256": "05daed4cc90fbaa0916c051d8cf8985aa11cdc27f15f50ea5a3ffeff29550857",
|
|
3
3
|
"registrySha256": "81b53363a440e832672618965540b3e507ae0d93adcc67ec2b93daf7933b3ab4",
|
|
4
|
-
"packageVersion": "1.3.
|
|
4
|
+
"packageVersion": "1.3.1160"
|
|
5
5
|
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Upgrade Guide — vNEXT
|
|
2
|
+
|
|
3
|
+
<!-- assembled-by: assemble-next-md -->
|
|
4
|
+
<!-- bump: patch -->
|
|
5
|
+
|
|
6
|
+
## What Changed
|
|
7
|
+
|
|
8
|
+
Extracted `tests/helpers/geminiEnvRefusal.ts` and its two call sites
|
|
9
|
+
(`tests/e2e/gemini-cli-alive-lifecycle.test.ts`,
|
|
10
|
+
`tests/e2e/gemini-setup-narrative-lifecycle.test.ts`) plus its unit test out of the
|
|
11
|
+
blocked `echo/authorship-provenance` branch and onto main on their own.
|
|
12
|
+
|
|
13
|
+
The two live-gemini E2Es gate on `haveGemini = !!detectGeminiPath()` — whether the
|
|
14
|
+
BINARY IS INSTALLED. An installed-but-uncredentialed CLI exits 41 before processing
|
|
15
|
+
the prompt, so the assertion downstream can neither pass nor meaningfully fail. CI is
|
|
16
|
+
green only because no gemini binary exists there; the box that HAS gemini is the one
|
|
17
|
+
that goes red.
|
|
18
|
+
|
|
19
|
+
The two vitest globalSetup files that prepare the packed standards-registry asset
|
|
20
|
+
(`tests/setup/build-dist.globalSetup.ts` and
|
|
21
|
+
`tests/setup/ensure-registry-asset.globalSetup.ts`) decided whether to regenerate it
|
|
22
|
+
on PRESENCE alone — `if (outputs.every(exists)) return`. An asset generated from an
|
|
23
|
+
older revision of `docs/STANDARDS-REGISTRY.md` was therefore never regenerated.
|
|
24
|
+
|
|
25
|
+
Both now consult a shared `registryAssetIsStale()` helper that compares the oldest
|
|
26
|
+
output's mtime against the newest input's (`docs/STANDARDS-REGISTRY.md`,
|
|
27
|
+
`docs/standards-registry-floor.json`, `package.json`) — the same shape the sibling
|
|
28
|
+
`ensureDistBuilt()` twelve lines above already used.
|
|
29
|
+
|
|
30
|
+
## What to Tell Your User
|
|
31
|
+
|
|
32
|
+
None — internal change (no user-facing surface).
|
|
33
|
+
|
|
34
|
+
## Summary of New Capabilities
|
|
35
|
+
|
|
36
|
+
None — internal change (no user-facing surface).
|
|
37
|
+
|
|
38
|
+
## Evidence
|
|
39
|
+
|
|
40
|
+
- A full unit+integration+e2e run on a current checkout (3070 files) produced
|
|
41
|
+
**exactly 2 failures — both of these files**, both on
|
|
42
|
+
`Gemini CLI exited 41 — you must specify the GEMINI_API_KEY environment variable`.
|
|
43
|
+
- The helper is ABSENT from main (404 via the contents API, against a control showing
|
|
44
|
+
7 files DO exist in `tests/helpers/`), and the failing test on main references it 0
|
|
45
|
+
times — so the fix genuinely never landed.
|
|
46
|
+
- Main has not modified either e2e file since the authorship branch's base, so this
|
|
47
|
+
reverts nothing; the diff is +37/-6 against main.
|
|
48
|
+
- `tsc --noEmit` exit 0 via the real binary.
|
|
49
|
+
|
|
50
|
+
- Measured 2026-08-15: in a checkout whose asset was generated at 17:59 from a source
|
|
51
|
+
three hours newer, `standards-registry-asset`, `standards-enforcement-auditor` and
|
|
52
|
+
`standards-coverage-route` failed with 8 assertions. Regenerating the asset alone
|
|
53
|
+
made all 77 pass.
|
|
54
|
+
- `tests/unit/registry-asset-freshness.test.ts` — 9/9.
|
|
55
|
+
- Negative controls, both fired: reverting the comparison fails THE DEFECT case
|
|
56
|
+
(1 failed / 8 passed); reverting one call site to the presence check fails the
|
|
57
|
+
wiring case, naming the file. Both sources restored byte-exact.
|
|
58
|
+
- The wiring guard matches the MODULE SPECIFIER, not the imported identifier, so an
|
|
59
|
+
aliased import cannot defeat it — the alias blindness found in an invariant test
|
|
60
|
+
earlier this week.
|
|
61
|
+
- `tsc --noEmit` exit 0; full lint chain exit 0 across 45 lints.
|
|
62
|
+
|
|
63
|
+
## Why it is separate
|
|
64
|
+
|
|
65
|
+
Out-of-charter work absorbed into a large blocked change becomes hostage to that
|
|
66
|
+
change's gate. The Zero-Failure Standard was satisfied on a branch and NOT on main,
|
|
67
|
+
which is the only place it counts.
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Side-effects review — extracting the gemini environmental-refusal classifier
|
|
2
|
+
|
|
3
|
+
## The change
|
|
4
|
+
|
|
5
|
+
Moves `tests/helpers/geminiEnvRefusal.ts`, its unit test, and its two E2E call sites out of the blocked
|
|
6
|
+
`echo/authorship-provenance` branch and onto main on their own. No new code: the same four files,
|
|
7
|
+
standing alone where they can land. Test-only; no runtime surface.
|
|
8
|
+
|
|
9
|
+
## Why it is separate, which is the actual point
|
|
10
|
+
|
|
11
|
+
The two live-gemini E2Es gate on whether the BINARY IS INSTALLED. An installed-but-uncredentialed CLI
|
|
12
|
+
exits 41 before it processes the prompt, so the assertion downstream can neither pass nor meaningfully
|
|
13
|
+
fail. CI is green only because no gemini binary exists there — the box that HAS gemini is the one that
|
|
14
|
+
goes red. That is a Zero-Failure Standard violation on main today.
|
|
15
|
+
|
|
16
|
+
The fix was written hours ago, out-of-charter, and committed to whichever branch was checked out at the
|
|
17
|
+
time — a large change now blocked at an approval gate for reasons unrelated to gemini. So the standard
|
|
18
|
+
was satisfied on a branch and NOT on main, which is the only place it counts. **Out-of-charter work
|
|
19
|
+
absorbed into a blocked change becomes hostage to that change's gate.**
|
|
20
|
+
|
|
21
|
+
## Review answers
|
|
22
|
+
|
|
23
|
+
1. **Over-block.** The classifier skips ONLY on causes the CLI itself names (missing credentials, quota
|
|
24
|
+
exhaustion, a version-manager miss). Everything else still fails. The rejected alternative — a live
|
|
25
|
+
preflight asking "can this box reach gemini at all?" — is recorded in the helper's own header as the
|
|
26
|
+
wrong trade: it would also skip on a transient failure, so a real regression would vanish silently.
|
|
27
|
+
Between a false red (visible, blocks a push) and a silent skip (invisible), the silent skip is worse.
|
|
28
|
+
2. **Under-block.** A NEW environmental cause with different wording still fails loudly. That is the
|
|
29
|
+
intended direction; the list grows only when a real cause is observed.
|
|
30
|
+
3. **Level-of-abstraction fit.** The classification is shared once and the tests decide what to do with
|
|
31
|
+
the answer — this is the third environmental cause these files handle, which is the point at which
|
|
32
|
+
two copies stop being maintainable.
|
|
33
|
+
4. **Signal vs authority.** Not a gate. It decides whether a test asserts or skips.
|
|
34
|
+
5. **Interactions.** None outside the three test files. No production import.
|
|
35
|
+
6. **External surfaces.** None.
|
|
36
|
+
7. **Multi-machine posture.** Machine-local BY DESIGN — it classifies THIS box's credential state.
|
|
37
|
+
8. **Rollback cost.** Revert; the two e2e files return to failing on an uncredentialed box.
|
|
38
|
+
|
|
39
|
+
## Evidence
|
|
40
|
+
|
|
41
|
+
- **The negative control is main itself, measured rather than mutated.** A full run on a current
|
|
42
|
+
checkout (3073 files) produced exactly 2 failures — these two files — both on
|
|
43
|
+
`Gemini CLI exited 41 — you must specify the GEMINI_API_KEY environment variable`.
|
|
44
|
+
- On this branch the same three files pass, 24 tests, with the E2E bodies skipping loudly:
|
|
45
|
+
*"Skipping live Gemini narrative assertion: no credentials configured (the child env is key-free by
|
|
46
|
+
design; OAuth creds absent)."*
|
|
47
|
+
- The helper is ABSENT from main (404 via the contents API, against a control showing 7 files DO exist
|
|
48
|
+
in `tests/helpers/`), and the failing test on main references it 0 times — the fix genuinely never
|
|
49
|
+
landed.
|
|
50
|
+
- Main has not modified either e2e file since the source branch's base, so this reverts nothing; the
|
|
51
|
+
diff against main is +37/-6 on the e2e files plus the two new files.
|
|
52
|
+
- `tsc --noEmit` exit 0 via the real binary.
|
|
53
|
+
|
|
54
|
+
## Class closure — what this does NOT close
|
|
55
|
+
|
|
56
|
+
- **The live smoke assertion still never executes on this box.** It skips, correctly and loudly. Making
|
|
57
|
+
it exercisable needs a credential decision that is the operator's, not a code change.
|
|
58
|
+
- **Only gemini.** No audit was done of other live-CLI E2Es for the same installed-vs-usable confusion.
|
|
59
|
+
- **The stranding pattern itself is untouched.** Nothing prevents the next out-of-charter fix from being
|
|
60
|
+
committed to a branch that later blocks. That is a process observation, recorded rather than solved.
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Side-effects review — registry asset freshness
|
|
2
|
+
|
|
3
|
+
## The change
|
|
4
|
+
|
|
5
|
+
Two vitest globalSetup files decided whether to regenerate the packed
|
|
6
|
+
standards-registry asset by asking only whether its outputs EXIST. Both now share a
|
|
7
|
+
`registryAssetIsStale()` helper that compares the oldest output's mtime against the
|
|
8
|
+
newest input's. Test-only; no runtime surface.
|
|
9
|
+
|
|
10
|
+
## Review answers
|
|
11
|
+
|
|
12
|
+
1. **Over-block.** This is the dominant risk and it got the most care, because the
|
|
13
|
+
check runs at the START of every suite and an over-eager rule regenerates on every
|
|
14
|
+
run. Three conservative cases, each with its own test: equal mtimes are NOT stale;
|
|
15
|
+
no readable input is NOT stale; an empty output list is NOT stale. Measured cost of
|
|
16
|
+
a genuine regeneration is one generator invocation (~1s), and it self-limits — a
|
|
17
|
+
freshly written asset is newer than its inputs, so the next run skips.
|
|
18
|
+
|
|
19
|
+
2. **Under-block.** mtime is a proxy for content, not content itself. A source edited
|
|
20
|
+
and reverted leaves a newer mtime and triggers one unnecessary regeneration
|
|
21
|
+
(harmless). A content-identical touch does the same. Conversely, a filesystem that
|
|
22
|
+
does not preserve mtimes, or a checkout that sets all mtimes equal, would report
|
|
23
|
+
fresh when stale. A content hash would be exact — the generator already writes a
|
|
24
|
+
`sha256` into its metadata — and that is the stronger version of this fix. NOT done
|
|
25
|
+
here: it means reading and hashing a 450KB document on every suite start, where the
|
|
26
|
+
mtime compare is four `stat` calls, and the sibling `ensureDistBuilt()` this mirrors
|
|
27
|
+
uses mtimes too. Stated rather than implied.
|
|
28
|
+
|
|
29
|
+
3. **Level-of-abstraction fit.** Correct layer: the setup layer is where every test
|
|
30
|
+
file inherits the guarantee. The file's own history says this explicitly — a
|
|
31
|
+
per-file `beforeAll` bootstrap was found to be invisible to the next file that
|
|
32
|
+
needed it.
|
|
33
|
+
|
|
34
|
+
4. **Signal vs authority.** Not a gate. It decides whether to run a generator; it
|
|
35
|
+
blocks nothing and rejects no input.
|
|
36
|
+
|
|
37
|
+
5. **Interactions.** `ensureRegistryAsset()` must still run AFTER `ensureDistBuilt()`
|
|
38
|
+
(the generator imports from `dist/`). Unchanged — only the early-return predicate
|
|
39
|
+
moved. The exported `ensureRegistryAsset(root)` keeps its signature, so the
|
|
40
|
+
production-generator parity ratchet that imports it is unaffected.
|
|
41
|
+
|
|
42
|
+
6. **External surfaces.** None. Test setup only; nothing ships to an agent or a user.
|
|
43
|
+
|
|
44
|
+
7. **Multi-machine posture.** Machine-local BY DESIGN — a per-checkout build artifact.
|
|
45
|
+
There is nothing to replicate: each checkout generates its own copy, and the whole
|
|
46
|
+
defect was one checkout trusting its own stale copy.
|
|
47
|
+
|
|
48
|
+
8. **Rollback cost.** Revert the commit. The helper is additive; the two call sites
|
|
49
|
+
return to a presence check.
|
|
50
|
+
|
|
51
|
+
## Class closure — what this does NOT close
|
|
52
|
+
|
|
53
|
+
- **Only these two sites.** A sweep of `tests/setup/` and `scripts/` for
|
|
54
|
+
regenerate-on-presence guards found exactly these two making a regeneration decision
|
|
55
|
+
on existence alone; the other `existsSync` hits are ordinary existence guards, not
|
|
56
|
+
regeneration decisions. The wiring test pins both and fails if either drifts, but it
|
|
57
|
+
knows only about setups that generate THIS asset.
|
|
58
|
+
- **`src/data/builtin-manifest.json`** is named in the generator's own comment as
|
|
59
|
+
having a related defect (generated only into `src/data/` while its reader resolves
|
|
60
|
+
module-relative from `dist/data/`). Different feature, different defect, untouched.
|
|
61
|
+
- **mtime is not content** — see review answer 2.
|
|
62
|
+
|
|
63
|
+
## Evidence
|
|
64
|
+
|
|
65
|
+
- `tests/unit/registry-asset-freshness.test.ts` — 9/9 green.
|
|
66
|
+
- Negative controls, BOTH fired and both restored byte-exact: reverting the comparison
|
|
67
|
+
fails THE DEFECT case (1 failed / 8 passed — the 8 passing are the controls, which is
|
|
68
|
+
what makes them controls); reverting one call site to the presence check fails the
|
|
69
|
+
wiring case and names the file.
|
|
70
|
+
- Observed live: running the new test in a fresh checkout regenerated the asset
|
|
71
|
+
("88 articles → src/data + dist/data"). Under the presence check it would have
|
|
72
|
+
skipped, because the outputs existed.
|
|
73
|
+
- The originating measurement: three test files / eight assertions failing against a
|
|
74
|
+
three-hour-stale asset; regeneration alone made all 77 pass.
|
|
75
|
+
- `tsc --noEmit` exit 0 (run via the real binary — `npx tsc` here is intercepted by a
|
|
76
|
+
shim that exits 0 without typechecking). Full lint chain exit 0 across 45 lints.
|