@techgoblin/gobstack 0.4.4-beta.4 → 0.4.4-beta.7

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/docs/GUIDE.md CHANGED
@@ -31,7 +31,8 @@ design on day one.
31
31
 
32
32
  ## 1. What this actually is, in plain language
33
33
 
34
- goblin-stack (published as the npm package **`@techgoblin/gobstack`**, product name **gobstack**)
34
+ gobstack (published on npm as **`@techgoblin/gobstack`**) — this guide, the README and the CLI
35
+ all call it **gobstack**
35
36
  is **a folder of files you install into a project** from npm. Once
36
37
  installed, three things change:
37
38
 
@@ -53,7 +54,7 @@ deliberately, and §8 and §11 say why.
53
54
  > **A rule that cannot fail is worse than no rule**, because it takes credit for verification it
54
55
  > does not perform.
55
56
 
56
- Everything else in goblin-stack follows from that sentence. If you remember one thing from this
57
+ Everything else in gobstack follows from that sentence. If you remember one thing from this
57
58
  guide, remember that one — it is also the standard the harness holds itself to, and the reason it
58
59
  ships a file of things it *cannot* check (`docs/LIMITS.md`).
59
60
 
@@ -87,7 +88,7 @@ one way this guide installs it.
87
88
  **Do not install into a real project yet.** You want to see what it does before it touches
88
89
  something you care about.
89
90
 
90
- The guided path is `goblin init` — one screen per question (class, branch/email, first
91
+ The guided path is `gob init` — one screen per question (class, branch/email, first
91
92
  gate, which platforms to emit), every question also answerable by flag, `--dry-run` to
92
93
  see the plan first:
93
94
 
@@ -96,12 +97,12 @@ see the plan first:
96
97
  git config user.email "you@example.com"
97
98
  git config user.name "you"
98
99
 
99
- goblin init --target . --class app --branch main --email "you@example.com" \
100
+ gob init --target . --class app --branch main --email "you@example.com" \
100
101
  --gate "bash tests/run-tests.sh" --yes
101
102
 
102
103
  or the plain installer this wizard drives, if you prefer the one-shot shape:
103
104
 
104
- goblin install --target . --class A
105
+ gob install --target . --class A
105
106
 
106
107
  Expected output (this is a real transcript, trimmed):
107
108
 
@@ -134,7 +135,7 @@ branch** (unless you want to).
134
135
  ## 4. Step 2 — Commit, then verify (the moment it earns its keep)
135
136
 
136
137
  cd /tmp/gs-try
137
- git add -A && git commit -m "chore: install goblin-stack"
138
+ git add -A && git commit -m "chore: install gobstack"
138
139
  .goblin/bin/goblin-verify
139
140
 
140
141
  You will see one line per rule. The shape:
@@ -219,7 +220,7 @@ without you remembering to. And the gate numbers are recorded with a date, so a
219
220
  ### The `practice:` key — the part that makes it yours
220
221
 
221
222
  If you already have a house standard — a `CONTRIBUTING.md`, a `PROJECT-PRACTICE.md`, anything
222
- written down — point `practice:` at it. goblin-stack does **not** copy its text. It records a
223
+ written down — point `practice:` at it. gobstack does **not** copy its text. It records a
223
224
  **hash** of the file and re-checks that hash on every verify.
224
225
 
225
226
  That buys you one specific, valuable thing: **if someone edits your standard, every project that
@@ -228,7 +229,7 @@ repos follow an old version.
228
229
 
229
230
  When *you* legitimately edit your own standard:
230
231
 
231
- goblin install --target . --re-pin
232
+ gob install --target . --re-pin
232
233
 
233
234
  It re-records the hash and prints the old and new value. Nothing re-pins automatically — an
234
235
  edited standard is never a silent no-op.
@@ -329,7 +330,7 @@ own the same way, once that gate is real: declare it in `.goblin/goblin.yaml` an
329
330
  can see.
330
331
 
331
332
  A check that is green on **both** the broken and the fixed tree proves nothing — it would have been
332
- green anyway. goblin-stack calls this the **REPLAY** rule, and it is the single practice that has
333
+ green anyway. gobstack calls this the **REPLAY** rule, and it is the single practice that has
333
334
  caught every real regression in this repository's own development history.
334
335
 
335
336
  ---
@@ -424,7 +425,7 @@ Two readings that are easy to get wrong:
424
425
  | `refused to overwrite: HANDOFF.md`, exit 1 | your repo already had a HANDOFF | **do not `--force`** — reconcile it (below) |
425
426
  | `PT-02 declared main, actual master` | branch mismatch | set `branch:` in the config |
426
427
  | `IN-02 ... practice EDITED` | someone changed the pinned standard | re-pin deliberately: `--re-pin` |
427
- | `goblin install: unknown subcommand` (exit 2) | you ran a bare `goblin install` without the npm package installed | install the npm package first: `npm i -g @techgoblin/gobstack`, then `goblin install` |
428
+ | `gob install: unknown subcommand` (exit 2) | you ran a bare `gob install` without the npm package installed | install the npm package first: `npm i -g @techgoblin/gobstack`, then `gob install` |
428
429
  | `IN-03` fails, "manifest is broken" | a row has a broken check column | fix the row; this is a source defect, not yours |
429
430
  | a `FAIL` you believe is wrong | the check may be weak, or your belief may be | run `--only <id>` and read the command it prints |
430
431
 
@@ -442,12 +443,12 @@ Declared but unusable (relative path, missing directory, no manifest inside) is
442
443
  with no fallback** — a repo is never judged by an engine it did not declare. A repo whose record
443
444
  says `mode=global` keeps hashing whatever files it still holds; the engine's own identity prints in
444
445
  every run's footer (`engine: mode=… cli_sha256=… enforcement_tsv_sha256=…`). The same commands are
445
- available outside any repo through the npm CLI: `goblin verify` / `goblin bans` / `goblin audit` /
446
- `goblin doctor` / `goblin emit` / `goblin upgrade` / `goblin --version`.
446
+ available outside any repo through the npm CLI: `gob verify` / `gob bans` / `gob audit` /
447
+ `gob doctor` / `gob emit` / `gob upgrade` / `gob --version`.
447
448
 
448
449
  **Migrating a repo to the global engine (W3):**
449
450
 
450
- goblin upgrade # 8 steps, two commits, one report
451
+ gob upgrade # 8 steps, two commits, one report
451
452
 
452
453
  It refuses on a dirty tree, a detached HEAD, a red repo, or a global engine holding different
453
454
  bytes — each refusal names the fix. What it does: verifies every recorded hash, lands the engine
@@ -461,7 +462,7 @@ again. Nothing is deleted before the engine is safely landed and the tree is gre
461
462
  git revert <commit-A-sha> <commit-B-sha>
462
463
 
463
464
  reverses byte-for-byte: the vendored payload returns, the record drops its `engine:` block, and
464
- `goblin verify` is the 43-green it was before. A second `goblin upgrade` on a migrated repo is a
465
+ `gob verify` is the 43-green it was before. A second `gob upgrade` on a migrated repo is a
465
466
  no-op; `goblin-install` onto one refuses with the revert remedy (re-installing would re-shadow the
466
467
  engine and silently de-migrate the record).
467
468
 
@@ -474,7 +475,7 @@ engine and silently de-migrate the record).
474
475
  | `goblin` (npm CLI) | propagates the subcommand's codes verbatim — `verify`/`bans`/`audit`/`--version`; `install`/`uninstall`/`re-pin`/`upgrade` route into `goblin-install` (`upgrade` migrates to the global engine: `0` ok · `1` refusal · `2` bad input); `doctor`/`emit` carry the same contract: `doctor` exits `0` every probed platform DETECTED and clean · `1` any DRIFT · `2` nothing to probe, and `emit` exits `0` ok or no-op · `1` refusal (with the path and the fix) · `2` bad input or unknown platform |
475
476
  | platforms (W4b) | `emit`/`doctor` cover seven: `claude`, `hermes`, `copilot`, `cursor`, `opencode`, `codex`, `gemini` — each detected via its own anchor (`~/.claude`, `~/.hermes`, `~/.copilot`, `~/.cursor`, `~/.config/opencode`, `~/.codex`, `~/.gemini`); codex and gemini carry `partial` command-blocking (see LIMITS #47) |
476
477
 
477
- `3` is the one to notice: it means goblin-stack's own rule table is malformed, not your project.
478
+ `3` is the one to notice: it means gobstack's own rule table is malformed, not your project.
478
479
 
479
480
  ---
480
481
 
@@ -482,10 +483,10 @@ engine and silently de-migrate the record).
482
483
 
483
484
  ### Commands
484
485
 
485
- goblin install --target <dir> --class A|B|C|D|E|F [options]
486
- goblin install --target <dir> --uninstall
487
- goblin install --target <dir> --re-pin
488
- goblin install --target <dir> --upgrade
486
+ gob install --target <dir> --class A|B|C|D|E|F [options]
487
+ gob install --target <dir> --uninstall
488
+ gob install --target <dir> --re-pin
489
+ gob install --target <dir> --upgrade
489
490
 
490
491
  .goblin/bin/goblin-verify [--only <id[,id...]>] [--json] [--list]
491
492
  .goblin/bin/goblin-audit # the only network step
@@ -505,7 +506,7 @@ Named procedures, installed as project-local skills. Each has a measurable verif
505
506
  | P5 | `goblin-tdd-repro` | a defect where a regression test is cheap |
506
507
  | P6 | `goblin-verify-author` | a project has no live check lane, or its gates drift |
507
508
  | P7 | `goblin-pr-gate` | anything that should be reviewed before landing |
508
- | P8 | `goblin-bootstrap` | adopting goblin-stack, or starting a project |
509
+ | P8 | `goblin-bootstrap` | adopting gobstack, or starting a project |
509
510
  | P9 | `goblin-handoff` | ending a session, or picking up another's |
510
511
  | P10 | `goblin-overnight` | an unattended run over a predicate |
511
512
  | P11 | `goblin-sweep` | the same change across many projects |
@@ -578,10 +579,10 @@ with *"prove it was broken first"* — it is the one practice that survives cont
578
579
  # 1. try it somewhere disposable
579
580
  mkdir -p /tmp/gs-try && cd /tmp/gs-try
580
581
  git init -b main
581
- goblin install --target . --class A # expect: created 50
582
+ gob install --target . --class A # expect: created 50
582
583
 
583
584
  # 2. commit and check
584
- git add -A && git commit -m "chore: install goblin-stack"
585
+ git add -A && git commit -m "chore: install gobstack"
585
586
  .goblin/bin/goblin-verify # expect: mostly PASS, some SKIP
586
587
 
587
588
  # 3. make it yours
@@ -599,12 +600,12 @@ with *"prove it was broken first"* — it is the one practice that survives cont
599
600
 
600
601
  # 5. do it for real, in a repo you care about
601
602
  cd ~/projects/your-project
602
- goblin install --target . --class A
603
- git add -A && git commit -m "chore: adopt goblin-stack"
603
+ gob install --target . --class A
604
+ git add -A && git commit -m "chore: adopt gobstack"
604
605
  .goblin/bin/goblin-verify
605
606
  $EDITOR HANDOFF.md # state / gates (dated!) / next / NOT verified
606
607
 
607
608
  ---
608
609
 
609
- *This guide is part of goblin-stack. If you find a step that does not work as written, that is a
610
+ *This guide is part of gobstack. If you find a step that does not work as written, that is a
610
611
  defect in the guide — report it the same way you would report one in the code.*
@@ -0,0 +1,334 @@
1
+ Script started on 2026-10-02 00:53:48+07:00 [COMMAND="bash /home/harvey/projects/goblin-stack/bin/goblin-init --target /tmp/ptyfinal/repo --yes" <not executed on terminal>]
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+ ▄███▄ ▄██▄ ██▄ █ ▄█▄ █ █ ▄██▀ █████ ▄███▄ ▄███ █ █
11
+ █ █ █ █ █▄▀█ █ █ █▄ █ ▀██▄ █ █ █ █ █ █
12
+ █ ▄██ █ █ █▄▀█ █ █ █ ▄█ ▄█▀ █ █████ █ ██
13
+ ▀██▀▀ ▀██▀ ██▀ ▀▀▀▀ ▀█▀ █ █ ██▀▀ ▀ █ █ ▀██▀ █ █
14
+  discipline around whatever executes
15
+ 
16
+  gob init — first-run setup (gobstack v0.4.4)
17
+  6 steps · every step has a flag · nothing is written until the plan is confirmed
18
+ 
19
+  ◆ 1. platforms 
20
+  ○ 2. class 
21
+  ○ 3. branch/email 
22
+  ○ 4. first gate 
23
+  ○ 5. emit 
24
+  ○ 6. done 
25
+ ▄███▄ ▄██▄ ██▄ █ ▄█▄ █ █ ▄██▀ █████ ▄███▄ ▄███ █ █
26
+ █ █ █ █ █▄▀█ █ █ █▄ █ ▀██▄ █ █ █ █ █ █
27
+ █ ▄██ █ █ █▄▀█ █ █ █ ▄█ ▄█▀ █ █████ █ ██
28
+ ▀██▀▀ ▀██▀ ██▀ ▀▀▀▀ ▀█▀ █ █ ██▀▀ ▀ █ █ ▀██▀ █ █
29
+  discipline around whatever executes
30
+ 
31
+  gob init — first-run setup (gobstack v0.4.4)
32
+  6 steps · every step has a flag · nothing is written until the plan is confirmed
33
+ 
34
+  ✔ 1. platforms 
35
+  ◆ 2. class 
36
+  ○ 3. branch/email 
37
+  ○ 4. first gate 
38
+  ○ 5. emit 
39
+  ○ 6. done 
40
+ 
41
+  ✔ 1. platforms 0 detected
42
+  no platform detected here — the wizard will still install the harness; emit later with gob emit
43
+ ▄███▄ ▄██▄ ██▄ █ ▄█▄ █ █ ▄██▀ █████ ▄███▄ ▄███ █ █
44
+ █ █ █ █ █▄▀█ █ █ █▄ █ ▀██▄ █ █ █ █ █ █
45
+ █ ▄██ █ █ █▄▀█ █ █ █ ▄█ ▄█▀ █ █████ █ ██
46
+ ▀██▀▀ ▀██▀ ██▀ ▀▀▀▀ ▀█▀ █ █ ██▀▀ ▀ █ █ ▀██▀ █ █
47
+  discipline around whatever executes
48
+ 
49
+  gob init — first-run setup (gobstack v0.4.4)
50
+  6 steps · every step has a flag · nothing is written until the plan is confirmed
51
+ 
52
+ 
53
+  ✔ 1. platforms 0 detected
54
+  no platform detected here — the wizard will still install the harness; emit later with gob emit
55
+  ✔ 1. platforms 0 detected
56
+  ✔ 2. class 
57
+  ◆ 3. branch/email 
58
+  ○ 4. first gate 
59
+  ○ 5. emit 
60
+  ○ 6. done 
61
+ 
62
+  what kind of work does this repo do?
63
+   1 ▸ app shipped features, PRs, review gates (class A)
64
+   2 service backend jobs, config, unattended runs (class B)
65
+   3 game playable builds, perf budgets (class C)
66
+   4 research specs, replays, reference corpora (class D)
67
+   5 agent fleets, loops, unattended automation (class E)
68
+   6 desktop the shell you live in, perf budget (class F)
69
+  ↑ number + Enter · Enter = app · the class letter works too (A-F)
70
+ 
71
+  ✔ 2. class A — shipped-software
72
+ ▄███▄ ▄██▄ ██▄ █ ▄█▄ █ █ ▄██▀ █████ ▄███▄ ▄███ █ █
73
+ █ █ █ █ █▄▀█ █ █ █▄ █ ▀██▄ █ █ █ █ █ █
74
+ █ ▄██ █ █ █▄▀█ █ █ █ ▄█ ▄█▀ █ █████ █ ██
75
+ ▀██▀▀ ▀██▀ ██▀ ▀▀▀▀ ▀█▀ █ █ ██▀▀ ▀ █ █ ▀██▀ █ █
76
+  discipline around whatever executes
77
+ 
78
+  gob init — first-run setup (gobstack v0.4.4)
79
+  6 steps · every step has a flag · nothing is written until the plan is confirmed
80
+ 
81
+ 
82
+  ✔ 1. platforms 0 detected
83
+  no platform detected here — the wizard will still install the harness; emit later with gob emit
84
+ 
85
+  what kind of work does this repo do?
86
+   1 ▸ app shipped features, PRs, review gates (class A)
87
+   2 service backend jobs, config, unattended runs (class B)
88
+   3 game playable builds, perf budgets (class C)
89
+   4 research specs, replays, reference corpora (class D)
90
+   5 agent fleets, loops, unattended automation (class E)
91
+   6 desktop the shell you live in, perf budget (class F)
92
+  ↑ number + Enter · Enter = app · the class letter works too (A-F)
93
+ 
94
+  ✔ 2. class A — shipped-software
95
+  ✔ 1. platforms 0 detected
96
+  ✔ 2. class A (shipped-software)
97
+  ✔ 3. branch/email 
98
+  ◆ 4. first gate 
99
+  ○ 5. emit 
100
+  ○ 6. done 
101
+ 
102
+  the forge contract — the identity this repo commits with (CM-01)
103
+ default branch ─ main
104
+ owner email ─ t@t.co
105
+  ✔ 3. branch/email main · t@t.co
106
+ ▄███▄ ▄██▄ ██▄ █ ▄█▄ █ █ ▄██▀ █████ ▄███▄ ▄███ █ █
107
+ █ █ █ █ █▄▀█ █ █ █▄ █ ▀██▄ █ █ █ █ █ █
108
+ █ ▄██ █ █ █▄▀█ █ █ █ ▄█ ▄█▀ █ █████ █ ██
109
+ ▀██▀▀ ▀██▀ ██▀ ▀▀▀▀ ▀█▀ █ █ ██▀▀ ▀ █ █ ▀██▀ █ █
110
+  discipline around whatever executes
111
+ 
112
+  gob init — first-run setup (gobstack v0.4.4)
113
+  6 steps · every step has a flag · nothing is written until the plan is confirmed
114
+ 
115
+ 
116
+  ✔ 1. platforms 0 detected
117
+  no platform detected here — the wizard will still install the harness; emit later with gob emit
118
+ 
119
+  what kind of work does this repo do?
120
+   1 ▸ app shipped features, PRs, review gates (class A)
121
+   2 service backend jobs, config, unattended runs (class B)
122
+   3 game playable builds, perf budgets (class C)
123
+   4 research specs, replays, reference corpora (class D)
124
+   5 agent fleets, loops, unattended automation (class E)
125
+   6 desktop the shell you live in, perf budget (class F)
126
+  ↑ number + Enter · Enter = app · the class letter works too (A-F)
127
+ 
128
+  ✔ 2. class A — shipped-software
129
+ 
130
+  the forge contract — the identity this repo commits with (CM-01)
131
+ 
132
+ 
133
+  ✔ 3. branch/email main · t@t.co
134
+  ✔ 1. platforms 0 detected
135
+  ✔ 2. class A (shipped-software)
136
+  ✔ 3. branch/email main · t@t.co
137
+  ✔ 4. first gate 
138
+  ◆ 5. emit 
139
+  ○ 6. done 
140
+ 
141
+  one real command that must stay green — suggested for a bash suite:
142
+  bash tests/run-tests.sh
143
+ gate command ─ bash tests/run-tests.sh
144
+  ✔ 4. first gate bash tests/run-tests.sh
145
+ ▄███▄ ▄██▄ ██▄ █ ▄█▄ █ █ ▄██▀ █████ ▄███▄ ▄███ █ █
146
+ █ █ █ █ █▄▀█ █ █ █▄ █ ▀██▄ █ █ █ █ █ █
147
+ █ ▄██ █ █ █▄▀█ █ █ █ ▄█ ▄█▀ █ █████ █ ██
148
+ ▀██▀▀ ▀██▀ ██▀ ▀▀▀▀ ▀█▀ █ █ ██▀▀ ▀ █ █ ▀██▀ █ █
149
+  discipline around whatever executes
150
+ 
151
+  gob init — first-run setup (gobstack v0.4.4)
152
+  6 steps · every step has a flag · nothing is written until the plan is confirmed
153
+ 
154
+ 
155
+  ✔ 1. platforms 0 detected
156
+  no platform detected here — the wizard will still install the harness; emit later with gob emit
157
+ 
158
+  what kind of work does this repo do?
159
+   1 ▸ app shipped features, PRs, review gates (class A)
160
+   2 service backend jobs, config, unattended runs (class B)
161
+   3 game playable builds, perf budgets (class C)
162
+   4 research specs, replays, reference corpora (class D)
163
+   5 agent fleets, loops, unattended automation (class E)
164
+   6 desktop the shell you live in, perf budget (class F)
165
+  ↑ number + Enter · Enter = app · the class letter works too (A-F)
166
+ 
167
+  ✔ 2. class A — shipped-software
168
+ 
169
+  the forge contract — the identity this repo commits with (CM-01)
170
+ 
171
+ 
172
+  ✔ 3. branch/email main · t@t.co
173
+ 
174
+  one real command that must stay green — suggested for a bash suite:
175
+  bash tests/run-tests.sh
176
+ 
177
+  ✔ 4. first gate bash tests/run-tests.sh
178
+  ✔ 1. platforms 0 detected
179
+  ✔ 2. class A (shipped-software)
180
+  ✔ 3. branch/email main · t@t.co
181
+  ✔ 4. first gate bash tests/run-tests.sh
182
+  ✔ 5. emit 
183
+  ◆ 6. done 
184
+  ✔ 5. emit 0 platform(s) · scope project
185
+
186
+ running: goblin-install --target /tmp/ptyfinal/repo --class A
187
+ created 50 · updated 0 · unchanged 0 · skipped 0
188
+
189
+ next:
190
+ 1. cd /tmp/ptyfinal/repo && git add -A && git commit # the install is a change like any other
191
+ 2. .goblin/bin/goblin-verify # or add .goblin/bin to PATH
192
+ 3. edit .goblin/goblin.yaml: replace the default gate with your real commands (P8 step 3)
193
+ 4. hermes skills trust /tmp/ptyfinal/repo # one-time, so the project-tier skills load
194
+
195
+ automations (optional; neither writes outside this repo, and A-02 has no agent in it):
196
+ bash /tmp/ptyfinal/repo/.goblin/automations/drift-audit.sh --dry-run # read the record first
197
+ cp /tmp/ptyfinal/repo/.goblin/automations/drift-audit.sh ~/.hermes/scripts/
198
+ hermes cron create "0 9 * * 1" --name "Drift audit - weekly" --no-agent \
199
+ --script drift-audit.sh --deliver <channel>
200
+ P13/P14 in docs/FLOWS.md; the whole model in automations/README.md
201
+ PASS IN-01 the install record exists and names its version
202
+ PASS IN-02 41 installed files hashed
203
+ PASS IN-03 the manifest is complete: every rule carries a check or is advisory, inside the enum
204
+ PASS IN-04 0 pre-existing file(s) left untouched
205
+ PASS HP-01 (test -f HANDOFF.md)
206
+ PASS HP-02 (for h in 'START HERE' 'STATE|STATUS' 'GATES?' 'NEXT STEPS|NEXT' 'NOT VERIFIED|UNVERIFIED|NOT PROVEN|UNPROVEN|PENDING[^.]*DEVICE TEST'; do grep -qiE "^#{2,3}[[:space:]]+[^[:alpha:]]*($h)\b" HANDOFF.md || { echo "missing section: $h"; exit 1; }; done)
207
+ PASS HP-03 1 gate line(s) inside the Gates section, each with a measured date (anchored on the declared gate name(s): commit todo_ceiling)
208
+ ADV HP-04 A stale sentence is corrected in place with a dated parenthetical, never deleted. (advisory)
209
+ PASS HP-05 names 3c96403 (ancestor of HEAD 3c96403)
210
+ PASS SP-01 (ls ./*-SPEC.md >/dev/null 2>&1)
211
+ FAIL SP-02 (test -z "$(git ls-files --others --exclude-standard -- '*-SPEC.md')" -> exit 1)
212
+ PASS SP-03 (awk '/^[[:space:]]*[-*][[:space:]]/ && /AC[0-9]*:/ && !/`|==|===|exit|<|>/ {print; bad=1} END{exit bad}' ./*-SPEC.md)
213
+ PASS GT-01 2 declared gate(s), each with a cmd
214
+ PASS GT-02 commit=0 todo_ceiling=0 · client_js_bytes 0 (ceiling 0) · measured 2026-10-02
215
+ PASS GT-03 (test -f .goblin/last-gate-line && [ .goblin/last-gate-line -nt "$(git rev-parse --git-dir)/logs/HEAD" ])
216
+ PASS GT-04 ratchet client_js_bytes ceiling 0
217
+ PASS GT-05 client_js_bytes 0 (ceiling 0)
218
+ PASS HS-01 not an asserting harness (report utility): gate.sh
219
+ 1 asserting harness(es), 1 report utility(ies)
220
+ SKIP HS-02 no pinned pre-change commit yet (replay.commit empty or unknown) - REPLAY not provable
221
+ ADV HS-03 Source probes read text with comments blanked first. (advisory)
222
+ PASS CM-01 (test "$(git log -1 --format='%ae')" = "$(grep '^owner_email:' .goblin/goblin.yaml | cut -d' ' -f2)")
223
+ ADV CM-02 The commit message was written to a file, not passed with -m. (advisory)
224
+ FAIL CM-03 9 dirty entr(y|ies), max_dirty 0
225
+ PASS MD-01 (for d in skills manifest bin templates presets .goblin .hermes; do [ -d "$d" ] || continue; grep -rniE '(d[e]epseek|cl[a]ude|g[p]t-[0-9]|gr[o]k|g[e]mini|g[l]m-[0-9]|k[i]mi)[a-z0-9.:_-]*' "$d" && exit 1; done; exit 0)
226
+ ADV MD-02 no model mapping configured (/tmp/ptyfinal/home/projects/fleet-model.yaml absent) - advisory
227
+ ADV MD-03 Role-pinned fan-out goes through kanban, not a model-less subagent spawn. (advisory)
228
+ PASS PG-01 0 review note(s)
229
+ PASS PG-02 0 review note(s) classified
230
+ PASS PG-03 0 review note(s) patch-id checked
231
+ ADV PG-04 Never bypass what the forge enforces. (advisory)
232
+ PASS PG-05 1 workflow file(s) checked for a self-skipping required check
233
+ PASS PG-06 goblin-gate.yml: runs the verifier, which executes every declared gate
234
+ 1 workflow file(s) compared with the 2 declared gate(s)
235
+ PASS DS-01 unchanged: .goblin/state.json=missing
236
+ PASS DS-02 snapshot .goblin/state.json=missing
237
+ ADV DOC-01 A significant change updates the docs that teach it. (advisory)
238
+ ADV DOC-02 System-level changes are recorded wherever the project's standard says they live. (advisory)
239
+ PASS SK-01 
240
+ PASS SK-02 20 installed skill file(s) hashed
241
+ PASS SK-03 advisory 10 of ceiling 10 (0 free slots: the next advisory row FAILs)
242
+ PASS SK-04 
243
+ PASS PT-01 (for d in skills manifest bin templates presets .goblin .hermes; do [ -d "$d" ] || continue; grep -rniE --exclude=goblin.yaml --exclude=installed.json '(h[a]rvey|tech-g[o]blin|/h[o]me/[a-z]+|g[o]blin-ui|op[e]n-door|sup[r]eme|bb[t]ech|c[l]v)' "$d" && exit 1; done; exit 0)
244
+ PASS PT-02 declared main, actual main
245
+ PASS CL-01 part pr-gate: optional, present
246
+ part review-panel: optional, present
247
+ part tokens: optional, absent
248
+ PASS CL-02 archive: false - the full class requirement applies
249
+ PASS SC-01 0 tracked secret file(s)
250
+ PASS SC-02 the whole secret family is ignored (.env, .env.local, .env.production proved by git)
251
+ PASS SC-03 0 client-visible secret-shaped name(s); no build output to scan for clause 2
252
+ PASS SC-04 0 cookie write(s) checked; a JS-written cookie is readable by any script - reported, not failed
253
+ PASS SC-05 0 write handler(s), 0 waived; 11 dir(s) declared
254
+ SKIP SC-06 no package.json - there is no dependency manifest to lock
255
+ SKIP SC-07 no audit record yet. Run .goblin/bin/goblin-audit once, deliberately, then commit
256
+ .goblin/audit.tsv: SC-07 reads the record and never the network
257
+ SKIP SC-08 no package-lock.json - there is no install-hook surface to enumerate
258
+ ADV SC-09 Auth is applied consistently across sibling routes. (advisory)
259
+ SKIP PF-01 no perf baseline recorded yet: run `find .next/static dist/assets dist -type f -name '*.js' -exec cat {} + 2>/dev/null | wc -c` on a pinned commit, then write
260
+ perf.baseline_commit, perf.baseline_value, perf.measured and the matching ratchet ceiling
261
+ PASS AU-01 2 automation producer(s) scanned, none opens with a network or forge verb
262
+ SKIP AU-02 no reports/*/report.yaml - nothing to dedup
263
+ SKIP AU-03 no reports/ - no reporter run in this repo to audit
264
+ PASS AU-04 
265
+ PASS BN-00 8 ban(s), each with an enforcement row and a named replacement
266
+ SKIP BN-01 No `any` in application TypeScript. (no matching files: src) 
267
+ SKIP BN-02 No `@ts-ignore` / `@ts-expect-error` suppressions. (no matching files: src) 
268
+ SKIP BN-03 No direct network call from a component. (not enabled in bans: - add BN-03 to .goblin/goblin.yaml to turn it on) 
269
+ SKIP BN-05 No import across a declared layer boundary. (no matching files: src) 
270
+ SKIP BN-06 No renderer with Node access (`nodeIntegration: true`). (not enabled in bans: - add BN-06 to .goblin/goblin.yaml to turn it on) 
271
+ SKIP BN-07 No renderer with context isolation or the process sandbox turned off. (not enabled in bans: - add BN-07 to .goblin/goblin.yaml to turn it on) 
272
+ SKIP BN-08 No dangerous webPreferences. (not enabled in bans: - add BN-08 to .goblin/goblin.yaml to turn it on) 
273
+ SKIP BN-09 No synchronous IPC and no `@electron/remote`. (not enabled in bans: - add BN-09 to .goblin/goblin.yaml to turn it on) 
274
+ SKIP FM-01 feature_map: is empty - no map is declared, so there is nothing to index
275
+ SKIP FM-02 feature_map: is empty - no map is declared, so there are no entry paths to resolve
276
+ SKIP VA-01 verify_doctor: is empty - no doctor is declared, so "the generated skill was executed once" is not provable here
277
+ SKIP JG-01 no loop record in this repo - no judge verdict to check
278
+ ADV JG-02 no model mapping configured (/tmp/ptyfinal/home/projects/fleet-model.yaml absent) - advisory
279
+ remedy: add a `judge:` entry beside the code lane in the file declared as models_file: in /tmp/ptyfinal/repo/.goblin/goblin.yaml
280
+ ADV JG-03 A judge lane that has never returned a non-`done` verdict is escalated. (advisory)
281
+ SKIP LP-01 no loop has run in this repo
282
+ SKIP LP-02 no loop has run in this repo
283
+ SKIP LP-03 no loop has run in this repo
284
+ SKIP LP-04 no loop has run in this repo
285
+ SKIP LP-05 no loop has run in this repo
286
+ SKIP RC-01 reference_manifest: is empty - no reference corpus is declared, so there is nothing for a build to match against
287
+ SKIP RC-02 reference_manifest: is empty - there is no manifest to shape-check (RC-01 skips for the same reason)
288
+ SKIP RC-03 no manifests/ directory - this is not a lab repo with a reference corpus, so there are no tracked bytes to check
289
+ SKIP RC-04 no manifests/*.sha256 - no acquisition record is declared, so there is none to read
290
+ 41 passed, 2 failed, 11 advisory, 28 skipped
291
+ of those 11 advisory: the matrix labels 10 row(s) advisory; the difference is the non-advisory row(s) reporting ADV by design (an unresolved lane) and any labelled row skipped by an opt-out
292
+ cannot see: whether a check in the harness dir tests the right path rather than
293
+ merely passing; whether the forge is bound by the workflow CL-01 found; whether a human
294
+ read the diff;
295
+ whether the model mapping names a family that actually differs (MD-02 reports it
296
+ and cannot change it); and whether .goblin/installed.json — the record every drift
297
+ check trusts — was itself rewritten. It is not signed, so one edit to it (with the
298
+ matching edit to the file it protects) defeats IN-02, SK-02 and HS-01 at once
299
+ (docs/LIMITS.md #18). The ban lane carries the same blind spot and two of its own:
300
+ the ban table is a manifest file under the same unsigned record, so a defanged ban
301
+ passes BN-00 (docs/LIMITS.md #28); a ban probe is a TEXT probe with no AST, so a
302
+ `Record<string, any>` is missed and a `: any` inside a string is reported
303
+ (docs/LIMITS.md #27); and no check here can reach a ban IN CONTEXT — the row proves
304
+ the forbidden path fails mechanically, never that the ban reached the agent that
305
+ wrote the line. The judge/loop lane adds its own: every JG-/LP- row reads a RECORD, so
306
+ it proves a handle, a pin, a budget and a pointer exist — never that the loop made
307
+ progress (a changed pointer is a proxy, docs/LIMITS.md #33), never which lane returned
308
+ a verdict, and never that the predicate was the right one or was really run. The CI lane
309
+ adds its own: PG-05 and PG-06 read a workflow's TEXT, so PG-05 sees a job whose gate step is
310
+ conditional and cannot see branch protection, the required-check list, or a forge that never
311
+ ran the job at all, and PG-06 proves a declared gate is INVOKED in a file under
312
+ .github/workflows/ — never that the forge marks that job required, never that it is the job
313
+ the forge waits on, and never that the workflow can fail (that is PG-05). A required check
314
+ that reports Success after skipping its gate is a green light for a commit whose gate never
315
+ ran (docs/CI.md). The reference-corpus lane adds its own: RC-01 matches EXACT sha256 only,
316
+ so a resized, recoloured or re-encoded reference asset, or copied text inside a shipped
317
+ string, passes it unseen; RC-02 proves the manifest is well-shaped, never that its entries
318
+ are the right hashes (as strong as tamper hashing, and installed.json is unsigned); RC-03
319
+ reads the tracked tree and cannot see a payload renamed and re-encoded; and RC-04 proves an
320
+ acquisition record EXISTS, never that the number beside it came from the store (HP-03's
321
+ defect, one artifact over). No row here reaches a reference asset in CONTEXT either.
322
+ engine: mode=vendored cli_sha256=2d37cf1c9f38a582ad60f3f75d2fcd53d10b743905dc3274eab6511c5c5ea008 enforcement_tsv_sha256=fd474c268b0852587c632910c503144fbcfe5e211ed2182902949a79fc5282b1
323
+
324
+ gob verify: 41 passed, 2 failed, 28 skipped · exit 1
325
+
326
+ next:
327
+ 1. the 28 skipped checks ARE your checklist — gob verify names each one
328
+ 2. replace the placeholder gate in .goblin/goblin.yaml with your real commands (P8 step 3)
329
+ 3. not emitted here: gob emit --platform <p> --scope global
330
+ 4. hermes skills trust /tmp/ptyfinal/repo # one-time, so the project-tier skills load
331
+
332
+ ▙ the goblin sees you. the gate is RED — start there.
333
+
334
+ Script done on 2026-10-02 00:53:50+07:00 [COMMAND_EXIT_CODE="0"]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@techgoblin/gobstack",
3
- "version": "0.4.4-beta.4",
3
+ "version": "0.4.4-beta.7",
4
4
  "description": "Agent-discipline toolkit: one verify command, an enforcement matrix, and LIMITS. bash engine, npm shim.",
5
5
  "bin": {
6
6
  "goblin": "bin/goblin.js",