@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/README.md +29 -26
- package/bin/goblin +19 -18
- package/bin/goblin-doctor +3 -3
- package/bin/goblin-emit +3 -3
- package/bin/goblin-init +139 -95
- package/bin/goblin-install +1 -1
- package/bin/goblin-upgrade +5 -5
- package/bin/goblin-verify +1 -1
- package/bin/goblin.js +22 -22
- package/docs/GUIDE.md +26 -25
- package/docs/w6-tty-redraw-pty-transcript.txt +334 -0
- package/package.json +1 -1
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
|
-
|
|
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
|
|
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 `
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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
|
-
| `
|
|
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: `
|
|
446
|
-
`
|
|
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
|
-
|
|
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
|
-
`
|
|
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
|
|
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
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
603
|
-
git add -A && git commit -m "chore: adopt
|
|
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
|
|
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
|
+
[2K[91m▄███▄ ▄██▄ ██▄ █ ▄█▄ █ █ ▄██▀ █████ ▄███▄ ▄███ █ █[0m
|
|
11
|
+
[2K[91m█ █ █ █ █▄▀█ █ █ █▄ █ ▀██▄ █ █ █ █ █ █[0m
|
|
12
|
+
[2K[91m█ ▄██ █ █ █▄▀█ █ █ █ ▄█ ▄█▀ █ █████ █ ██[0m
|
|
13
|
+
[2K[91m▀██▀▀ ▀██▀ ██▀ ▀▀▀▀ ▀█▀ █ █ ██▀▀ ▀ █ █ ▀██▀ █ █[0m
|
|
14
|
+
[2K [90mdiscipline around whatever executes[0m
|
|
15
|
+
[2K
|
|
16
|
+
[2K[97m gob init[0m [90m— first-run setup (gobstack v0.4.4)[0m
|
|
17
|
+
[2K [90m6 steps · every step has a flag · nothing is written until the plan is confirmed[0m
|
|
18
|
+
[2K
|
|
19
|
+
[2K [91m◆[0m 1. platforms [97m[0m
|
|
20
|
+
[2K [90m○[0m 2. class [97m[0m
|
|
21
|
+
[2K [90m○[0m 3. branch/email [97m[0m
|
|
22
|
+
[2K [90m○[0m 4. first gate [97m[0m
|
|
23
|
+
[2K [90m○[0m 5. emit [97m[0m
|
|
24
|
+
[2K [90m○[0m 6. done [97m[0m
|
|
25
|
+
[9A[J[2K[91m▄███▄ ▄██▄ ██▄ █ ▄█▄ █ █ ▄██▀ █████ ▄███▄ ▄███ █ █[0m
|
|
26
|
+
[2K[91m█ █ █ █ █▄▀█ █ █ █▄ █ ▀██▄ █ █ █ █ █ █[0m
|
|
27
|
+
[2K[91m█ ▄██ █ █ █▄▀█ █ █ █ ▄█ ▄█▀ █ █████ █ ██[0m
|
|
28
|
+
[2K[91m▀██▀▀ ▀██▀ ██▀ ▀▀▀▀ ▀█▀ █ █ ██▀▀ ▀ █ █ ▀██▀ █ █[0m
|
|
29
|
+
[2K [90mdiscipline around whatever executes[0m
|
|
30
|
+
[2K
|
|
31
|
+
[2K[97m gob init[0m [90m— first-run setup (gobstack v0.4.4)[0m
|
|
32
|
+
[2K [90m6 steps · every step has a flag · nothing is written until the plan is confirmed[0m
|
|
33
|
+
[2K
|
|
34
|
+
[2K [92m✔[0m 1. platforms [97m[0m
|
|
35
|
+
[2K [91m◆[0m 2. class [97m[0m
|
|
36
|
+
[2K [90m○[0m 3. branch/email [97m[0m
|
|
37
|
+
[2K [90m○[0m 4. first gate [97m[0m
|
|
38
|
+
[2K [90m○[0m 5. emit [97m[0m
|
|
39
|
+
[2K [90m○[0m 6. done [97m[0m
|
|
40
|
+
[2K
|
|
41
|
+
[2K ✔ 1. platforms [97m0 detected[0m
|
|
42
|
+
[2K [93mno platform detected here — the wizard will still install the harness; emit later with gob emit[0m
|
|
43
|
+
[12A[J[2K[91m▄███▄ ▄██▄ ██▄ █ ▄█▄ █ █ ▄██▀ █████ ▄███▄ ▄███ █ █[0m
|
|
44
|
+
[2K[91m█ █ █ █ █▄▀█ █ █ █▄ █ ▀██▄ █ █ █ █ █ █[0m
|
|
45
|
+
[2K[91m█ ▄██ █ █ █▄▀█ █ █ █ ▄█ ▄█▀ █ █████ █ ██[0m
|
|
46
|
+
[2K[91m▀██▀▀ ▀██▀ ██▀ ▀▀▀▀ ▀█▀ █ █ ██▀▀ ▀ █ █ ▀██▀ █ █[0m
|
|
47
|
+
[2K [90mdiscipline around whatever executes[0m
|
|
48
|
+
[2K
|
|
49
|
+
[2K[97m gob init[0m [90m— first-run setup (gobstack v0.4.4)[0m
|
|
50
|
+
[2K [90m6 steps · every step has a flag · nothing is written until the plan is confirmed[0m
|
|
51
|
+
[2K
|
|
52
|
+
[2K
|
|
53
|
+
[2K ✔ 1. platforms [97m0 detected[0m
|
|
54
|
+
[2K [93mno platform detected here — the wizard will still install the harness; emit later with gob emit[0m
|
|
55
|
+
[2K [92m✔[0m 1. platforms [97m[90m0 detected[0m[0m
|
|
56
|
+
[2K [92m✔[0m 2. class [97m[0m
|
|
57
|
+
[2K [91m◆[0m 3. branch/email [97m[0m
|
|
58
|
+
[2K [90m○[0m 4. first gate [97m[0m
|
|
59
|
+
[2K [90m○[0m 5. emit [97m[0m
|
|
60
|
+
[2K [90m○[0m 6. done [97m[0m
|
|
61
|
+
[2K
|
|
62
|
+
[2K [90mwhat kind of work does this repo do?[0m
|
|
63
|
+
[2K [97m 1 ▸ app shipped features, PRs, review gates [90m(class A)[0m
|
|
64
|
+
[2K [97m 2 service backend jobs, config, unattended runs [90m(class B)[0m
|
|
65
|
+
[2K [97m 3 game playable builds, perf budgets [90m(class C)[0m
|
|
66
|
+
[2K [97m 4 research specs, replays, reference corpora [90m(class D)[0m
|
|
67
|
+
[2K [97m 5 agent fleets, loops, unattended automation [90m(class E)[0m
|
|
68
|
+
[2K [97m 6 desktop the shell you live in, perf budget [90m(class F)[0m
|
|
69
|
+
[2K [90m↑ number + Enter · Enter = app · the class letter works too (A-F)[0m
|
|
70
|
+
[2K
|
|
71
|
+
[2K ✔ 2. class [97mA — shipped-software[0m
|
|
72
|
+
[23A[J[2K[91m▄███▄ ▄██▄ ██▄ █ ▄█▄ █ █ ▄██▀ █████ ▄███▄ ▄███ █ █[0m
|
|
73
|
+
[2K[91m█ █ █ █ █▄▀█ █ █ █▄ █ ▀██▄ █ █ █ █ █ █[0m
|
|
74
|
+
[2K[91m█ ▄██ █ █ █▄▀█ █ █ █ ▄█ ▄█▀ █ █████ █ ██[0m
|
|
75
|
+
[2K[91m▀██▀▀ ▀██▀ ██▀ ▀▀▀▀ ▀█▀ █ █ ██▀▀ ▀ █ █ ▀██▀ █ █[0m
|
|
76
|
+
[2K [90mdiscipline around whatever executes[0m
|
|
77
|
+
[2K
|
|
78
|
+
[2K[97m gob init[0m [90m— first-run setup (gobstack v0.4.4)[0m
|
|
79
|
+
[2K [90m6 steps · every step has a flag · nothing is written until the plan is confirmed[0m
|
|
80
|
+
[2K
|
|
81
|
+
[2K
|
|
82
|
+
[2K ✔ 1. platforms [97m0 detected[0m
|
|
83
|
+
[2K [93mno platform detected here — the wizard will still install the harness; emit later with gob emit[0m
|
|
84
|
+
[2K
|
|
85
|
+
[2K [90mwhat kind of work does this repo do?[0m
|
|
86
|
+
[2K [97m 1 ▸ app shipped features, PRs, review gates [90m(class A)[0m
|
|
87
|
+
[2K [97m 2 service backend jobs, config, unattended runs [90m(class B)[0m
|
|
88
|
+
[2K [97m 3 game playable builds, perf budgets [90m(class C)[0m
|
|
89
|
+
[2K [97m 4 research specs, replays, reference corpora [90m(class D)[0m
|
|
90
|
+
[2K [97m 5 agent fleets, loops, unattended automation [90m(class E)[0m
|
|
91
|
+
[2K [97m 6 desktop the shell you live in, perf budget [90m(class F)[0m
|
|
92
|
+
[2K [90m↑ number + Enter · Enter = app · the class letter works too (A-F)[0m
|
|
93
|
+
[2K
|
|
94
|
+
[2K ✔ 2. class [97mA — shipped-software[0m
|
|
95
|
+
[2K [92m✔[0m 1. platforms [97m[90m0 detected[0m[0m
|
|
96
|
+
[2K [92m✔[0m 2. class [97m[97mA (shipped-software)[0m[0m
|
|
97
|
+
[2K [92m✔[0m 3. branch/email [97m[0m
|
|
98
|
+
[2K [91m◆[0m 4. first gate [97m[0m
|
|
99
|
+
[2K [90m○[0m 5. emit [97m[0m
|
|
100
|
+
[2K [90m○[0m 6. done [97m[0m
|
|
101
|
+
[2K
|
|
102
|
+
[2K [90mthe forge contract — the identity this repo commits with (CM-01)[0m
|
|
103
|
+
[97mdefault branch[0m [90m─ main[2K
|
|
104
|
+
[97mowner email[0m [90m─ t@t.co[2K
|
|
105
|
+
[2K ✔ 3. branch/email [97mmain · t@t.co[0m
|
|
106
|
+
[28A[J[2K[91m▄███▄ ▄██▄ ██▄ █ ▄█▄ █ █ ▄██▀ █████ ▄███▄ ▄███ █ █[0m
|
|
107
|
+
[2K[91m█ █ █ █ █▄▀█ █ █ █▄ █ ▀██▄ █ █ █ █ █ █[0m
|
|
108
|
+
[2K[91m█ ▄██ █ █ █▄▀█ █ █ █ ▄█ ▄█▀ █ █████ █ ██[0m
|
|
109
|
+
[2K[91m▀██▀▀ ▀██▀ ██▀ ▀▀▀▀ ▀█▀ █ █ ██▀▀ ▀ █ █ ▀██▀ █ █[0m
|
|
110
|
+
[2K [90mdiscipline around whatever executes[0m
|
|
111
|
+
[2K
|
|
112
|
+
[2K[97m gob init[0m [90m— first-run setup (gobstack v0.4.4)[0m
|
|
113
|
+
[2K [90m6 steps · every step has a flag · nothing is written until the plan is confirmed[0m
|
|
114
|
+
[2K
|
|
115
|
+
[2K
|
|
116
|
+
[2K ✔ 1. platforms [97m0 detected[0m
|
|
117
|
+
[2K [93mno platform detected here — the wizard will still install the harness; emit later with gob emit[0m
|
|
118
|
+
[2K
|
|
119
|
+
[2K [90mwhat kind of work does this repo do?[0m
|
|
120
|
+
[2K [97m 1 ▸ app shipped features, PRs, review gates [90m(class A)[0m
|
|
121
|
+
[2K [97m 2 service backend jobs, config, unattended runs [90m(class B)[0m
|
|
122
|
+
[2K [97m 3 game playable builds, perf budgets [90m(class C)[0m
|
|
123
|
+
[2K [97m 4 research specs, replays, reference corpora [90m(class D)[0m
|
|
124
|
+
[2K [97m 5 agent fleets, loops, unattended automation [90m(class E)[0m
|
|
125
|
+
[2K [97m 6 desktop the shell you live in, perf budget [90m(class F)[0m
|
|
126
|
+
[2K [90m↑ number + Enter · Enter = app · the class letter works too (A-F)[0m
|
|
127
|
+
[2K
|
|
128
|
+
[2K ✔ 2. class [97mA — shipped-software[0m
|
|
129
|
+
[2K
|
|
130
|
+
[2K [90mthe forge contract — the identity this repo commits with (CM-01)[0m
|
|
131
|
+
[2K
|
|
132
|
+
[2K
|
|
133
|
+
[2K ✔ 3. branch/email [97mmain · t@t.co[0m
|
|
134
|
+
[2K [92m✔[0m 1. platforms [97m[90m0 detected[0m[0m
|
|
135
|
+
[2K [92m✔[0m 2. class [97m[97mA (shipped-software)[0m[0m
|
|
136
|
+
[2K [92m✔[0m 3. branch/email [97m[97mmain · t@t.co[0m[0m
|
|
137
|
+
[2K [92m✔[0m 4. first gate [97m[0m
|
|
138
|
+
[2K [91m◆[0m 5. emit [97m[0m
|
|
139
|
+
[2K [90m○[0m 6. done [97m[0m
|
|
140
|
+
[2K
|
|
141
|
+
[2K [90mone real command that must stay green — suggested for a bash suite:[0m
|
|
142
|
+
[2K [90mbash tests/run-tests.sh[0m
|
|
143
|
+
[97mgate command[0m [90m─ bash tests/run-tests.sh[2K
|
|
144
|
+
[2K ✔ 4. first gate [97mbash tests/run-tests.sh[0m
|
|
145
|
+
[33A[J[2K[91m▄███▄ ▄██▄ ██▄ █ ▄█▄ █ █ ▄██▀ █████ ▄███▄ ▄███ █ █[0m
|
|
146
|
+
[2K[91m█ █ █ █ █▄▀█ █ █ █▄ █ ▀██▄ █ █ █ █ █ █[0m
|
|
147
|
+
[2K[91m█ ▄██ █ █ █▄▀█ █ █ █ ▄█ ▄█▀ █ █████ █ ██[0m
|
|
148
|
+
[2K[91m▀██▀▀ ▀██▀ ██▀ ▀▀▀▀ ▀█▀ █ █ ██▀▀ ▀ █ █ ▀██▀ █ █[0m
|
|
149
|
+
[2K [90mdiscipline around whatever executes[0m
|
|
150
|
+
[2K
|
|
151
|
+
[2K[97m gob init[0m [90m— first-run setup (gobstack v0.4.4)[0m
|
|
152
|
+
[2K [90m6 steps · every step has a flag · nothing is written until the plan is confirmed[0m
|
|
153
|
+
[2K
|
|
154
|
+
[2K
|
|
155
|
+
[2K ✔ 1. platforms [97m0 detected[0m
|
|
156
|
+
[2K [93mno platform detected here — the wizard will still install the harness; emit later with gob emit[0m
|
|
157
|
+
[2K
|
|
158
|
+
[2K [90mwhat kind of work does this repo do?[0m
|
|
159
|
+
[2K [97m 1 ▸ app shipped features, PRs, review gates [90m(class A)[0m
|
|
160
|
+
[2K [97m 2 service backend jobs, config, unattended runs [90m(class B)[0m
|
|
161
|
+
[2K [97m 3 game playable builds, perf budgets [90m(class C)[0m
|
|
162
|
+
[2K [97m 4 research specs, replays, reference corpora [90m(class D)[0m
|
|
163
|
+
[2K [97m 5 agent fleets, loops, unattended automation [90m(class E)[0m
|
|
164
|
+
[2K [97m 6 desktop the shell you live in, perf budget [90m(class F)[0m
|
|
165
|
+
[2K [90m↑ number + Enter · Enter = app · the class letter works too (A-F)[0m
|
|
166
|
+
[2K
|
|
167
|
+
[2K ✔ 2. class [97mA — shipped-software[0m
|
|
168
|
+
[2K
|
|
169
|
+
[2K [90mthe forge contract — the identity this repo commits with (CM-01)[0m
|
|
170
|
+
[2K
|
|
171
|
+
[2K
|
|
172
|
+
[2K ✔ 3. branch/email [97mmain · t@t.co[0m
|
|
173
|
+
[2K
|
|
174
|
+
[2K [90mone real command that must stay green — suggested for a bash suite:[0m
|
|
175
|
+
[2K [90mbash tests/run-tests.sh[0m
|
|
176
|
+
[2K
|
|
177
|
+
[2K ✔ 4. first gate [97mbash tests/run-tests.sh[0m
|
|
178
|
+
[2K [92m✔[0m 1. platforms [97m[90m0 detected[0m[0m
|
|
179
|
+
[2K [92m✔[0m 2. class [97m[97mA (shipped-software)[0m[0m
|
|
180
|
+
[2K [92m✔[0m 3. branch/email [97m[97mmain · t@t.co[0m[0m
|
|
181
|
+
[2K [92m✔[0m 4. first gate [97m[97mbash tests/run-tests.sh[0m[0m
|
|
182
|
+
[2K [92m✔[0m 5. emit [97m[0m
|
|
183
|
+
[2K [91m◆[0m 6. done [97m[0m
|
|
184
|
+
[2K ✔ 5. emit [97m0 platform(s) · scope project[0m
|
|
185
|
+
|
|
186
|
+
[90mrunning: goblin-install --target /tmp/ptyfinal/repo --class A[0m
|
|
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
|
+
[92mPASS IN-01 the install record exists and names its version[0m
|
|
202
|
+
[92mPASS IN-02 41 installed files hashed[0m
|
|
203
|
+
[92mPASS IN-03 the manifest is complete: every rule carries a check or is advisory, inside the enum[0m
|
|
204
|
+
[92mPASS IN-04 0 pre-existing file(s) left untouched[0m
|
|
205
|
+
[92mPASS HP-01 (test -f HANDOFF.md)[0m
|
|
206
|
+
[92mPASS 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)[0m
|
|
207
|
+
[92mPASS 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)[0m
|
|
208
|
+
[93mADV HP-04 A stale sentence is corrected in place with a dated parenthetical, never deleted. (advisory)[0m
|
|
209
|
+
[92mPASS HP-05 names 3c96403 (ancestor of HEAD 3c96403)[0m
|
|
210
|
+
[92mPASS SP-01 (ls ./*-SPEC.md >/dev/null 2>&1)[0m
|
|
211
|
+
[91mFAIL SP-02 (test -z "$(git ls-files --others --exclude-standard -- '*-SPEC.md')" -> exit 1)[0m
|
|
212
|
+
[92mPASS SP-03 (awk '/^[[:space:]]*[-*][[:space:]]/ && /AC[0-9]*:/ && !/`|==|===|exit|<|>/ {print; bad=1} END{exit bad}' ./*-SPEC.md)[0m
|
|
213
|
+
[92mPASS GT-01 2 declared gate(s), each with a cmd[0m
|
|
214
|
+
[92mPASS GT-02 commit=0 todo_ceiling=0 · client_js_bytes 0 (ceiling 0) · measured 2026-10-02[0m
|
|
215
|
+
[92mPASS GT-03 (test -f .goblin/last-gate-line && [ .goblin/last-gate-line -nt "$(git rev-parse --git-dir)/logs/HEAD" ])[0m
|
|
216
|
+
[92mPASS GT-04 ratchet client_js_bytes ceiling 0[0m
|
|
217
|
+
[92mPASS GT-05 client_js_bytes 0 (ceiling 0)[0m
|
|
218
|
+
[92mPASS HS-01 not an asserting harness (report utility): gate.sh[0m
|
|
219
|
+
1 asserting harness(es), 1 report utility(ies)
|
|
220
|
+
[90mSKIP HS-02 no pinned pre-change commit yet (replay.commit empty or unknown) - REPLAY not provable[0m
|
|
221
|
+
[93mADV HS-03 Source probes read text with comments blanked first. (advisory)[0m
|
|
222
|
+
[92mPASS CM-01 (test "$(git log -1 --format='%ae')" = "$(grep '^owner_email:' .goblin/goblin.yaml | cut -d' ' -f2)")[0m
|
|
223
|
+
[93mADV CM-02 The commit message was written to a file, not passed with -m. (advisory)[0m
|
|
224
|
+
[91mFAIL CM-03 9 dirty entr(y|ies), max_dirty 0[0m
|
|
225
|
+
[92mPASS 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)[0m
|
|
226
|
+
[93mADV MD-02 no model mapping configured (/tmp/ptyfinal/home/projects/fleet-model.yaml absent) - advisory[0m
|
|
227
|
+
[93mADV MD-03 Role-pinned fan-out goes through kanban, not a model-less subagent spawn. (advisory)[0m
|
|
228
|
+
[92mPASS PG-01 0 review note(s)[0m
|
|
229
|
+
[92mPASS PG-02 0 review note(s) classified[0m
|
|
230
|
+
[92mPASS PG-03 0 review note(s) patch-id checked[0m
|
|
231
|
+
[93mADV PG-04 Never bypass what the forge enforces. (advisory)[0m
|
|
232
|
+
[92mPASS PG-05 1 workflow file(s) checked for a self-skipping required check[0m
|
|
233
|
+
[92mPASS PG-06 goblin-gate.yml: runs the verifier, which executes every declared gate[0m
|
|
234
|
+
1 workflow file(s) compared with the 2 declared gate(s)
|
|
235
|
+
[92mPASS DS-01 unchanged: .goblin/state.json=missing[0m
|
|
236
|
+
[92mPASS DS-02 snapshot .goblin/state.json=missing[0m
|
|
237
|
+
[93mADV DOC-01 A significant change updates the docs that teach it. (advisory)[0m
|
|
238
|
+
[93mADV DOC-02 System-level changes are recorded wherever the project's standard says they live. (advisory)[0m
|
|
239
|
+
[92mPASS SK-01 [0m
|
|
240
|
+
[92mPASS SK-02 20 installed skill file(s) hashed[0m
|
|
241
|
+
[92mPASS SK-03 advisory 10 of ceiling 10 (0 free slots: the next advisory row FAILs)[0m
|
|
242
|
+
[92mPASS SK-04 [0m
|
|
243
|
+
[92mPASS 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)[0m
|
|
244
|
+
[92mPASS PT-02 declared main, actual main[0m
|
|
245
|
+
[92mPASS CL-01 part pr-gate: optional, present[0m
|
|
246
|
+
part review-panel: optional, present
|
|
247
|
+
part tokens: optional, absent
|
|
248
|
+
[92mPASS CL-02 archive: false - the full class requirement applies[0m
|
|
249
|
+
[92mPASS SC-01 0 tracked secret file(s)[0m
|
|
250
|
+
[92mPASS SC-02 the whole secret family is ignored (.env, .env.local, .env.production proved by git)[0m
|
|
251
|
+
[92mPASS SC-03 0 client-visible secret-shaped name(s); no build output to scan for clause 2[0m
|
|
252
|
+
[92mPASS SC-04 0 cookie write(s) checked; a JS-written cookie is readable by any script - reported, not failed[0m
|
|
253
|
+
[92mPASS SC-05 0 write handler(s), 0 waived; 11 dir(s) declared[0m
|
|
254
|
+
[90mSKIP SC-06 no package.json - there is no dependency manifest to lock[0m
|
|
255
|
+
[90mSKIP SC-07 no audit record yet. Run .goblin/bin/goblin-audit once, deliberately, then commit[0m
|
|
256
|
+
.goblin/audit.tsv: SC-07 reads the record and never the network
|
|
257
|
+
[90mSKIP SC-08 no package-lock.json - there is no install-hook surface to enumerate[0m
|
|
258
|
+
[93mADV SC-09 Auth is applied consistently across sibling routes. (advisory)[0m
|
|
259
|
+
[90mSKIP 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[0m
|
|
260
|
+
perf.baseline_commit, perf.baseline_value, perf.measured and the matching ratchet ceiling
|
|
261
|
+
[92mPASS AU-01 2 automation producer(s) scanned, none opens with a network or forge verb[0m
|
|
262
|
+
[90mSKIP AU-02 no reports/*/report.yaml - nothing to dedup[0m
|
|
263
|
+
[90mSKIP AU-03 no reports/ - no reporter run in this repo to audit[0m
|
|
264
|
+
[92mPASS AU-04 [0m
|
|
265
|
+
[92mPASS BN-00 8 ban(s), each with an enforcement row and a named replacement[0m
|
|
266
|
+
[90mSKIP BN-01 No `any` in application TypeScript. (no matching files: src) [0m
|
|
267
|
+
[90mSKIP BN-02 No `@ts-ignore` / `@ts-expect-error` suppressions. (no matching files: src) [0m
|
|
268
|
+
[90mSKIP BN-03 No direct network call from a component. (not enabled in bans: - add BN-03 to .goblin/goblin.yaml to turn it on) [0m
|
|
269
|
+
[90mSKIP BN-05 No import across a declared layer boundary. (no matching files: src) [0m
|
|
270
|
+
[90mSKIP BN-06 No renderer with Node access (`nodeIntegration: true`). (not enabled in bans: - add BN-06 to .goblin/goblin.yaml to turn it on) [0m
|
|
271
|
+
[90mSKIP 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) [0m
|
|
272
|
+
[90mSKIP BN-08 No dangerous webPreferences. (not enabled in bans: - add BN-08 to .goblin/goblin.yaml to turn it on) [0m
|
|
273
|
+
[90mSKIP BN-09 No synchronous IPC and no `@electron/remote`. (not enabled in bans: - add BN-09 to .goblin/goblin.yaml to turn it on) [0m
|
|
274
|
+
[90mSKIP FM-01 feature_map: is empty - no map is declared, so there is nothing to index[0m
|
|
275
|
+
[90mSKIP FM-02 feature_map: is empty - no map is declared, so there are no entry paths to resolve[0m
|
|
276
|
+
[90mSKIP VA-01 verify_doctor: is empty - no doctor is declared, so "the generated skill was executed once" is not provable here[0m
|
|
277
|
+
[90mSKIP JG-01 no loop record in this repo - no judge verdict to check[0m
|
|
278
|
+
[93mADV JG-02 no model mapping configured (/tmp/ptyfinal/home/projects/fleet-model.yaml absent) - advisory[0m
|
|
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
|
+
[93mADV JG-03 A judge lane that has never returned a non-`done` verdict is escalated. (advisory)[0m
|
|
281
|
+
[90mSKIP LP-01 no loop has run in this repo[0m
|
|
282
|
+
[90mSKIP LP-02 no loop has run in this repo[0m
|
|
283
|
+
[90mSKIP LP-03 no loop has run in this repo[0m
|
|
284
|
+
[90mSKIP LP-04 no loop has run in this repo[0m
|
|
285
|
+
[90mSKIP LP-05 no loop has run in this repo[0m
|
|
286
|
+
[90mSKIP RC-01 reference_manifest: is empty - no reference corpus is declared, so there is nothing for a build to match against[0m
|
|
287
|
+
[90mSKIP RC-02 reference_manifest: is empty - there is no manifest to shape-check (RC-01 skips for the same reason)[0m
|
|
288
|
+
[90mSKIP RC-03 no manifests/ directory - this is not a lab repo with a reference corpus, so there are no tracked bytes to check[0m
|
|
289
|
+
[90mSKIP RC-04 no manifests/*.sha256 - no acquisition record is declared, so there is none to read[0m
|
|
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
|
+
[91mgob verify: 41 passed, 2 failed, 28 skipped · exit 1[0m
|
|
325
|
+
|
|
326
|
+
[90mnext:[0m
|
|
327
|
+
1. [97mthe 28 skipped checks ARE your checklist — gob verify names each one[0m
|
|
328
|
+
2. [97mreplace the placeholder gate in .goblin/goblin.yaml with your real commands (P8 step 3)[0m
|
|
329
|
+
3. [97mnot emitted here: gob emit --platform <p> --scope global[0m
|
|
330
|
+
4. [97mhermes skills trust /tmp/ptyfinal/repo # one-time, so the project-tier skills load[0m
|
|
331
|
+
|
|
332
|
+
[91m▙ the goblin sees you. the gate is RED — start there.[0m
|
|
333
|
+
|
|
334
|
+
Script done on 2026-10-02 00:53:50+07:00 [COMMAND_EXIT_CODE="0"]
|
package/package.json
CHANGED