grilling-workbench 0.2.0
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/LICENSE +21 -0
- package/README.md +111 -0
- package/bin/grilling-workbench.js +5 -0
- package/data/questions.json +44 -0
- package/docs/agent-monitor.md +48 -0
- package/docs/deployment.md +186 -0
- package/docs/integration.md +145 -0
- package/docs/validation.md +85 -0
- package/package.json +29 -0
- package/public/app.js +345 -0
- package/public/index.html +19 -0
- package/public/styles.css +212 -0
- package/skills/grilling-workbench/SKILL.md +53 -0
- package/skills/grilling-workbench/agents/openai.yaml +6 -0
- package/skills/grilling-workbench/references/agent-protocol.md +96 -0
- package/skills/grilling-workbench/references/questions.md +81 -0
- package/src/cli.js +118 -0
- package/src/core.js +176 -0
- package/src/delivery.js +42 -0
- package/src/dev.js +11 -0
- package/src/monitor.js +20 -0
- package/src/runtime.js +59 -0
- package/src/server.js +110 -0
- package/src/storage.js +35 -0
- package/src/submission-socket.js +87 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Grilling Workbench contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# Grilling Workbench
|
|
2
|
+
|
|
3
|
+
Local question forms for project interviews in an embedded browser. The agent
|
|
4
|
+
writes questions, the user submits the entire form, and a waiting socket delivers
|
|
5
|
+
the saved answers back to the agent. Reasoning and clarification stay in the
|
|
6
|
+
existing chat. No model API, external assets, or production dependencies.
|
|
7
|
+
|
|
8
|
+
Once installed, the skill applies whenever the agent interviews the user. Calling
|
|
9
|
+
an interview skill such as `grill-me` is enough; the user does not need to request
|
|
10
|
+
a browser form or enable a separate project preference.
|
|
11
|
+
|
|
12
|
+
**Run with `npx`; no project dependency is required.** Node.js 22 or later is required.
|
|
13
|
+
The supported deployment is a browser and agent on the same computer; no public
|
|
14
|
+
server or idle-chat wakeup service is included.
|
|
15
|
+
|
|
16
|
+
## Install in a project
|
|
17
|
+
|
|
18
|
+
From the project where you want to use the workbench:
|
|
19
|
+
|
|
20
|
+
```sh
|
|
21
|
+
npx --yes grilling-workbench@0.2.0 install-skill
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
The installer creates `.agents/skills/grilling-workbench` and refuses to overwrite
|
|
25
|
+
an existing skill. Codex detects new skills automatically; restart it if the skill
|
|
26
|
+
does not appear. Explicit `$grilling-workbench` invocation can verify installation;
|
|
27
|
+
normal interview use should select it automatically. npm caches the application;
|
|
28
|
+
the skill and interview sessions remain in your project. Use the same pinned
|
|
29
|
+
version for setup and every command in a round.
|
|
30
|
+
|
|
31
|
+
Source: [PavingLayer/grilling-workbench](https://github.com/PavingLayer/grilling-workbench).
|
|
32
|
+
Package: [grilling-workbench on npm](https://www.npmjs.com/package/grilling-workbench).
|
|
33
|
+
License: [MIT](LICENSE).
|
|
34
|
+
|
|
35
|
+
The [deployment guide](docs/deployment.md) covers non-Node projects, session
|
|
36
|
+
storage, updates, shutdown, backups, and recovery. The [integration guide](docs/integration.md)
|
|
37
|
+
explains skill discovery and project configuration alongside Matt Pocock's skills.
|
|
38
|
+
|
|
39
|
+
## Agent workflow
|
|
40
|
+
|
|
41
|
+
```sh
|
|
42
|
+
npx --yes grilling-workbench@0.2.0 init --session .workbench/topic-r01 --questions /absolute/path/round.json
|
|
43
|
+
npx --yes grilling-workbench@0.2.0 serve --session .workbench/topic-r01
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Keep the server process running. In a second persistent process, **before showing
|
|
47
|
+
the URL returned by serve**:
|
|
48
|
+
|
|
49
|
+
```sh
|
|
50
|
+
npx --yes grilling-workbench@0.2.0 wait --session .workbench/topic-r01
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Keep the agent turn waiting on that process. The listener blocks on TCP and exits
|
|
54
|
+
with the complete immutable submission. Read it in the current chat, then run
|
|
55
|
+
`ack SUBMISSION_ID --session .workbench/topic-r01` and continue the conversation.
|
|
56
|
+
No extra user click or paste is needed. The socket alone cannot start a turn in an
|
|
57
|
+
idle host chat; an active tool wait is required.
|
|
58
|
+
|
|
59
|
+
Read the complete [agent protocol](skills/grilling-workbench/references/agent-protocol.md)
|
|
60
|
+
and [question format](skills/grilling-workbench/references/questions.md) before
|
|
61
|
+
using the tool. One directory belongs to one chat round. New rounds use new
|
|
62
|
+
directories; reconnects use the original exact directory.
|
|
63
|
+
|
|
64
|
+
## Answering a form
|
|
65
|
+
|
|
66
|
+
Navigate between questions using the sidebar, or the question picker on narrow
|
|
67
|
+
screens. The footer keeps navigation and submission actions visible. Each question
|
|
68
|
+
shows its full wording, options, benefits, and trade-offs. Recommendations are
|
|
69
|
+
labels; every question starts unanswered.
|
|
70
|
+
|
|
71
|
+
Choices and notes save as drafts while you work. Drafts survive navigation,
|
|
72
|
+
reloads, and question updates. If a question's meaning changes, the app retains
|
|
73
|
+
your earlier answer and asks you to revisit the new wording. Save failures offer
|
|
74
|
+
retry and recovery options.
|
|
75
|
+
|
|
76
|
+
**Submit form** sends the entire round in one click, including edits still being
|
|
77
|
+
saved. Questions left blank are reported as `not_answered`. Each submission keeps
|
|
78
|
+
the exact question versions and answers; retries reuse its identity to prevent
|
|
79
|
+
duplicates. Drafts become submitted outcomes only when you click Submit.
|
|
80
|
+
|
|
81
|
+
After saving, the server delivers the submission to the waiting agent over a
|
|
82
|
+
socket. Unacknowledged forms replay after a reconnect, and the page shows when the
|
|
83
|
+
agent records receipt. The interview skill interprets answers and maintains the
|
|
84
|
+
project's decision records.
|
|
85
|
+
|
|
86
|
+
Use chat or native browser annotations to discuss questions and options. The
|
|
87
|
+
agent can explain or revise them while your draft remains in the form.
|
|
88
|
+
|
|
89
|
+
## Development and evidence
|
|
90
|
+
|
|
91
|
+
`npm run dev` starts the reading-room demo at
|
|
92
|
+
[localhost:4310](http://127.0.0.1:4310/), using `data/questions.json` and
|
|
93
|
+
`.workbench/session.json`. Use separate CLI sessions for your interviews.
|
|
94
|
+
|
|
95
|
+
To develop from a source checkout:
|
|
96
|
+
|
|
97
|
+
```sh
|
|
98
|
+
npm ci
|
|
99
|
+
npm run check
|
|
100
|
+
npm test
|
|
101
|
+
npm run test:package
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
The pure state model has generated action-history tests plus HTTP, persistence,
|
|
105
|
+
socket, and runtime integration tests. The package smoke test installs the actual
|
|
106
|
+
archive offline and through `npx` in unrelated directories and exercises the executable,
|
|
107
|
+
skill installation, concurrent isolated sessions, full submission, receipt,
|
|
108
|
+
definition updates, and restart. CI runs those commands for Node 22 and 24.
|
|
109
|
+
|
|
110
|
+
The [validation note](docs/validation.md) records the automated and browser
|
|
111
|
+
checks, the delivery guarantees they establish, and the remaining validation gaps.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "reading-room-demo",
|
|
3
|
+
"title": "A neighborhood reading room",
|
|
4
|
+
"description": "A sample interview about a shared space for books, conversation, and quiet time. These are demonstration answers, not project decisions.",
|
|
5
|
+
"navigationLabels": {
|
|
6
|
+
"atmosphere": "Atmosphere",
|
|
7
|
+
"activities": "Activities",
|
|
8
|
+
"success": "Success"
|
|
9
|
+
},
|
|
10
|
+
"questions": [
|
|
11
|
+
{
|
|
12
|
+
"id": "atmosphere",
|
|
13
|
+
"revision": 1,
|
|
14
|
+
"title": "What should the room feel like on an ordinary afternoon?",
|
|
15
|
+
"context": "Imagine someone walking in with an hour to spare. Choose the experience we should design around first.",
|
|
16
|
+
"type": "single",
|
|
17
|
+
"options": [
|
|
18
|
+
{ "id": "quiet", "label": "A quiet place to settle in", "description": "Comfortable seats, individual reading spots, and a shared expectation of quiet. People can be together without needing to join in.", "benefit": "A dependable retreat for reading and focused work.", "tradeoff": "Spontaneous conversations need a separate space or time.", "recommended": true },
|
|
19
|
+
{ "id": "social", "label": "A place to meet over books", "description": "A large shared table and an easygoing atmosphere where conversations are welcome. Reading becomes a way to get to know neighbors.", "benefit": "Makes it easier for newcomers to connect with people.", "tradeoff": "Noise and interruptions can make longer reading sessions difficult." },
|
|
20
|
+
{ "id": "mixed", "label": "A little of both, in separate zones", "description": "A quiet reading area alongside a smaller conversation area, with furniture and signs making the difference clear.", "benefit": "Accommodates different moods and reasons for visiting.", "tradeoff": "Needs more space and careful attention to sound carrying between zones." }
|
|
21
|
+
]
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"id": "activities",
|
|
25
|
+
"revision": 1,
|
|
26
|
+
"title": "Which activities belong in the first month?",
|
|
27
|
+
"context": "Select any activities worth trying. We can start with a small program and learn from who turns up.",
|
|
28
|
+
"type": "multiple",
|
|
29
|
+
"options": [
|
|
30
|
+
{ "id": "open-reading", "label": "Open reading afternoons", "description": "Regular drop-in hours with no program or booking. Visitors bring a book or browse the shelves.", "benefit": "Easy to run and welcoming to people with different schedules.", "tradeoff": "People may need another reason to make their first visit.", "recommended": true },
|
|
31
|
+
{ "id": "book-circle", "label": "A monthly book circle", "description": "One book, a small group, and a hosted discussion. Announce the book early so people have time to read.", "benefit": "Gives returning visitors a shared interest and a familiar rhythm.", "tradeoff": "Reading the book in advance asks for a bigger commitment." },
|
|
32
|
+
{ "id": "skill-swap", "label": "Neighbor-led skill sharing", "description": "Short informal sessions such as mending, drawing, or writing, led by people from the neighborhood.", "benefit": "Brings in people who might not join a reading group.", "tradeoff": "Requires finding hosts, preparing materials, and rearranging the room." }
|
|
33
|
+
]
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"id": "success",
|
|
37
|
+
"revision": 1,
|
|
38
|
+
"title": "After three months, what would make this feel worthwhile?",
|
|
39
|
+
"context": "Describe one or two things you would hope to notice. A small, specific sign is more useful than a perfect target.",
|
|
40
|
+
"type": "text",
|
|
41
|
+
"options": []
|
|
42
|
+
}
|
|
43
|
+
]
|
|
44
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Agent submission delivery
|
|
2
|
+
|
|
3
|
+
The canonical operating instructions ship with the installable skill:
|
|
4
|
+
[agent protocol](../skills/grilling-workbench/references/agent-protocol.md).
|
|
5
|
+
Read that protocol before presenting a form. It covers preparation, the active
|
|
6
|
+
socket wait, receipt, continuation, definition updates, and recovery.
|
|
7
|
+
|
|
8
|
+
## Transport contract
|
|
9
|
+
|
|
10
|
+
CLI servers expose HTTP and TCP only on loopback. `serve --session DIR` writes a
|
|
11
|
+
private `runtime.json` descriptor with protocol version 1, actual ports, process
|
|
12
|
+
identity, and a random per-run token. `wait --session DIR` reads that descriptor
|
|
13
|
+
and connects to the matching socket. Applications should use the CLI rather than
|
|
14
|
+
reimplement the transport.
|
|
15
|
+
|
|
16
|
+
For transport implementers, messages are UTF-8 newline-delimited JSON. The client
|
|
17
|
+
first sends `{ "type": "subscribe", "protocolVersion": 1, "token": "..." }`.
|
|
18
|
+
Authentication must complete within five seconds and 4096 characters. The server
|
|
19
|
+
attaches a live listener before replaying saved unacknowledged submissions, with
|
|
20
|
+
per-connection ID deduplication, then sends `{ "type": "ready" }`. A replayed or
|
|
21
|
+
live submission may precede ready. Errors use `{ "type": "error", "error": "..." }`
|
|
22
|
+
and close the connection.
|
|
23
|
+
|
|
24
|
+
After a whole-form snapshot has been written, the server sends
|
|
25
|
+
`{ "type": "submission", "submission": {...} }`. Draft edits never emit that
|
|
26
|
+
event. The snapshot contains `scope: "form"`, its ID/time, questionnaire identity,
|
|
27
|
+
title/description, and every exact question version, answer, and outcome. The CLI
|
|
28
|
+
returns the first event and closes its socket; it never records receipt itself.
|
|
29
|
+
|
|
30
|
+
`ack ID --session DIR` records receipt after the agent reads the snapshot.
|
|
31
|
+
Acknowledgment is durable and idempotent; concurrent writers are excluded by a
|
|
32
|
+
lock. Reconnect replays unacknowledged submissions. There is no server polling,
|
|
33
|
+
heartbeat automation, or clipboard handoff.
|
|
34
|
+
|
|
35
|
+
## What delivery proves
|
|
36
|
+
|
|
37
|
+
A socket event proves the server saved the whole form. A receipt proves the agent
|
|
38
|
+
read that snapshot into its context. Neither proves that later reasoning finished,
|
|
39
|
+
a decision ticket closed, or a chat reply was rendered. Delivery is at least once
|
|
40
|
+
until receipt; downstream work must account for its submission ID.
|
|
41
|
+
|
|
42
|
+
The receiving agent must keep an active tool call waiting on the listener process.
|
|
43
|
+
No verified idle-chat event bridge is included. The browser correctly shows
|
|
44
|
+
waiting until receipt, including if the agent was interrupted. Installing the
|
|
45
|
+
skill does not create a host capability that is absent.
|
|
46
|
+
|
|
47
|
+
The [validation note](validation.md) records the checks for active delivery,
|
|
48
|
+
replay, receipts, and restart, along with the limits of that evidence.
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
# Local deployment
|
|
2
|
+
|
|
3
|
+
Version 0.2.0 ships on public npm with a CLI, static browser files,
|
|
4
|
+
a demo questionnaire, operational docs, and the integration skill. It needs Node
|
|
5
|
+
22+ and no production dependencies or build service. Linux with Node 22.22.2 was
|
|
6
|
+
verified locally. CI is configured for Node 22 and 24 on Linux; other operating
|
|
7
|
+
systems have not been release-tested.
|
|
8
|
+
|
|
9
|
+
## Distribution and installation
|
|
10
|
+
|
|
11
|
+
Run this from any project, including a non-Node project:
|
|
12
|
+
|
|
13
|
+
```sh
|
|
14
|
+
npx --yes grilling-workbench@0.2.0 install-skill
|
|
15
|
+
npx --yes grilling-workbench@0.2.0 --version
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
npm fetches the application into its execution cache. Only the installed skill
|
|
19
|
+
and the sessions you create live in the consuming project; no project dependency
|
|
20
|
+
or global installation is required. Keep `@0.2.0` on every command so the skill,
|
|
21
|
+
server, and listener use the same release. npm needs registry access on first use;
|
|
22
|
+
use an explicit archive installation when reliable offline availability matters.
|
|
23
|
+
|
|
24
|
+
Source and releases are maintained at
|
|
25
|
+
[PavingLayer/grilling-workbench](https://github.com/PavingLayer/grilling-workbench).
|
|
26
|
+
The public npm package is
|
|
27
|
+
[grilling-workbench](https://www.npmjs.com/package/grilling-workbench).
|
|
28
|
+
|
|
29
|
+
If you prefer a project dependency:
|
|
30
|
+
|
|
31
|
+
```sh
|
|
32
|
+
npm install --save-dev --save-exact grilling-workbench@0.2.0
|
|
33
|
+
npx --no grilling-workbench install-skill
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Or explicitly install the executable globally:
|
|
37
|
+
|
|
38
|
+
```sh
|
|
39
|
+
npm install --global grilling-workbench@0.2.0
|
|
40
|
+
grilling-workbench --version
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Run the setup command from each project that should discover it.
|
|
44
|
+
The default target is `.agents/skills/grilling-workbench`. `--target DIR` supports
|
|
45
|
+
another host's skill directory. This command copies the bundled skill; it does
|
|
46
|
+
not edit AGENTS.md, install upstream skills, or overwrite existing skills.
|
|
47
|
+
|
|
48
|
+
### Offline archives and maintainer releases
|
|
49
|
+
|
|
50
|
+
From a clean source checkout:
|
|
51
|
+
|
|
52
|
+
```sh
|
|
53
|
+
npm ci
|
|
54
|
+
npm run check
|
|
55
|
+
npm test
|
|
56
|
+
npm run test:package
|
|
57
|
+
mkdir -p dist
|
|
58
|
+
npm pack --pack-destination dist
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
The result is `dist/grilling-workbench-0.2.0.tgz`. The explicit package allowlist
|
|
62
|
+
excludes sessions, receipts, development dependencies, and tests. The package
|
|
63
|
+
tests exercise both an offline project installation and `npx` execution from an
|
|
64
|
+
isolated cache, including full form delivery, updates, shutdown, and restart.
|
|
65
|
+
Building the archive does not publish it.
|
|
66
|
+
|
|
67
|
+
Offline consumers can install the archive as a project dependency or globally:
|
|
68
|
+
|
|
69
|
+
```sh
|
|
70
|
+
npm install --offline --save-dev /absolute/path/grilling-workbench-0.2.0.tgz
|
|
71
|
+
npx --no grilling-workbench install-skill
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Configure the agent to use that installed executable at the matching version;
|
|
75
|
+
the bundled skill defaults to the version-pinned `npx` registry command.
|
|
76
|
+
|
|
77
|
+
Maintainers publish the checked archive to npm and attach the same file to its
|
|
78
|
+
GitHub release. After the source commit is pushed and GitHub checks pass:
|
|
79
|
+
|
|
80
|
+
```sh
|
|
81
|
+
npm publish ./dist/grilling-workbench-0.2.0.tgz --access public
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Publication requires an authenticated npm account with publishing access. For
|
|
85
|
+
later releases, increment the package version and update the pinned commands in
|
|
86
|
+
the docs and bundled skill before running these checks. Never overwrite a
|
|
87
|
+
published version or run mixed versions within a round.
|
|
88
|
+
|
|
89
|
+
## Session lifecycle
|
|
90
|
+
|
|
91
|
+
Every CLI operation except validation and skill installation requires an explicit
|
|
92
|
+
`--session DIR`. Relative paths resolve from the current working directory. Use
|
|
93
|
+
an absolute path when resuming from another directory. `init` refuses any existing
|
|
94
|
+
directory, so it cannot reset a previous form accidentally.
|
|
95
|
+
|
|
96
|
+
```sh
|
|
97
|
+
npx --yes grilling-workbench@0.2.0 init --session .workbench/topic-r01 --questions /absolute/path/round.json
|
|
98
|
+
npx --yes grilling-workbench@0.2.0 serve --session .workbench/topic-r01
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Both servers bind exclusively to `127.0.0.1`. By default the OS assigns free HTTP
|
|
102
|
+
and TCP ports; use the URL returned by `serve`, not guessed port numbers. Explicit
|
|
103
|
+
`--port 4310 --signal-port 4311` is available when stable ports are useful. Invalid
|
|
104
|
+
ports and collisions fail with a nonzero exit code. Readiness follows validation,
|
|
105
|
+
initial storage, and successful binding of both listeners.
|
|
106
|
+
|
|
107
|
+
`serve` remains in the foreground. The agent should retain its process handle and
|
|
108
|
+
start `wait` in another persistent process. Ctrl+C or SIGTERM shuts down the
|
|
109
|
+
server, waits for queued state operations, disconnects listeners, and removes
|
|
110
|
+
runtime metadata and its lock. The questions, answers, and receipts remain.
|
|
111
|
+
|
|
112
|
+
`status --session DIR` makes one health request and checks the runtime identity;
|
|
113
|
+
`pending --session DIR` reads saved unacknowledged submissions once. Neither is a
|
|
114
|
+
scheduled monitor. Follow the [agent protocol](../skills/grilling-workbench/references/agent-protocol.md)
|
|
115
|
+
for socket waits, exact-ID receipts, and interrupted conversations.
|
|
116
|
+
|
|
117
|
+
## Stored files and ownership
|
|
118
|
+
|
|
119
|
+
| File inside the session | Purpose |
|
|
120
|
+
| --- | --- |
|
|
121
|
+
| `config.json` | Versioned session configuration. |
|
|
122
|
+
| `questions.json` | Session-owned definitions copied by init; use update to replace atomically. |
|
|
123
|
+
| `session.json` | Versioned state, drafts, request deduplication, and immutable submissions. |
|
|
124
|
+
| `chat-receipts.json` | Submission IDs read by the agent and receipt times. |
|
|
125
|
+
| `runtime.json` | Ephemeral process identity, ports, and random socket credential. |
|
|
126
|
+
| `server.lock` | Exclusive server ownership; PID and start time for recovery. |
|
|
127
|
+
| `receipt.lock` | Short-lived acknowledgment writer ownership. |
|
|
128
|
+
| `.gitignore` | Keeps runtime content out of ordinary Git additions. |
|
|
129
|
+
|
|
130
|
+
Files are written with mode 0600 and newly created session directories with 0700
|
|
131
|
+
on systems honoring POSIX permissions. Existing parent permissions are not changed.
|
|
132
|
+
Keep sessions on a local disk; network filesystems and multiple machines sharing
|
|
133
|
+
one session are unsupported. One server owns a session. Concurrent acknowledgment
|
|
134
|
+
writers fail instead of losing another writer's receipt; retry sequentially.
|
|
135
|
+
|
|
136
|
+
The browser serves a fixed file allowlist, rejects unrelated Host/Origin headers,
|
|
137
|
+
and escapes question text. The TCP subscriber supplies a per-run random token
|
|
138
|
+
read from the session descriptor; a stale or wrong session is rejected. No token
|
|
139
|
+
is printed in normal CLI output or sent to the browser. This is a single-user
|
|
140
|
+
local tool, not a multi-tenant service: other trusted processes on the same
|
|
141
|
+
computer can access its local HTTP API. Do not expose either port through a public
|
|
142
|
+
proxy. There is no remote authentication or TLS deployment mode.
|
|
143
|
+
|
|
144
|
+
## Update and recovery
|
|
145
|
+
|
|
146
|
+
Use `update --session DIR --questions FILE` to validate and atomically replace the
|
|
147
|
+
current definitions. Keep the form ID. The browser checks ordinary definition and
|
|
148
|
+
receipt refreshes every 2.5 seconds while local saves are settled; **agent completion
|
|
149
|
+
uses TCP events, not this refresh interval**. The [question format](../skills/grilling-workbench/references/questions.md)
|
|
150
|
+
describes changed-answer handling and size limits.
|
|
151
|
+
|
|
152
|
+
For package upgrades, stop the server, back up its session directory, select the
|
|
153
|
+
new exact package version, compare its bundled skill with the installed copy, and
|
|
154
|
+
restart `serve` at that version against the same directory. Update a local or
|
|
155
|
+
global installation explicitly if you use one. To inspect a skill upgrade without overwriting
|
|
156
|
+
customizations, use `install-skill --target /path/to/new-empty-directory` and merge
|
|
157
|
+
changes deliberately. State schema 1 is retained in 0.2.0; unsupported state
|
|
158
|
+
versions and corrupt files fail without resetting answers.
|
|
159
|
+
|
|
160
|
+
Back up `config.json`, `questions.json`, `session.json`, and `chat-receipts.json`
|
|
161
|
+
with the server and receipt writer stopped. Restore those files into a private
|
|
162
|
+
session directory, then start serve. Do not restore `runtime.json` or lock files;
|
|
163
|
+
those describe processes, not answers. Atomic replacement and file synchronization
|
|
164
|
+
protect against interrupted writes; backups remain necessary for device loss or
|
|
165
|
+
filesystem failure. Power-loss durability across every filesystem is not guaranteed.
|
|
166
|
+
|
|
167
|
+
A forced kill can leave a lock. Read its PID/start time and verify that its owner
|
|
168
|
+
has exited using the operating system's process inspection. Only then remove
|
|
169
|
+
that specific stale lock (and stale runtime descriptor for a server lock) and
|
|
170
|
+
restart/retry. Never remove a live owner's lock. The program deliberately does not
|
|
171
|
+
steal locks based only on age or a potentially reused PID. If ownership cannot be
|
|
172
|
+
established, keep the files and resolve it before restarting.
|
|
173
|
+
|
|
174
|
+
A failed browser save leaves unsaved work in the open tab, with retry and recovery
|
|
175
|
+
export. Closing the tab loses memory that never reached storage. A failed receipt
|
|
176
|
+
keeps the submission available for replay. A crash after receipt can leave
|
|
177
|
+
unfinished downstream work; the immutable submission and chat/handoff record
|
|
178
|
+
support recovery, but exactly-once replies are not guaranteed.
|
|
179
|
+
|
|
180
|
+
## Source checkout demo
|
|
181
|
+
|
|
182
|
+
`npm run dev` serves the demo from `data/questions.json` and saves its answers in
|
|
183
|
+
`.workbench/session.json`. `PORT` and `SIGNAL_PORT` override its defaults 4310 and
|
|
184
|
+
4311 independently. The source-checkout helper `node src/monitor.js wait` reads
|
|
185
|
+
the demo's runtime descriptor; `pending` and `ack ID` use the same demo directory.
|
|
186
|
+
Use the CLI's initialized sessions for project interviews.
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# Use the workbench with your interview skills
|
|
2
|
+
|
|
3
|
+
The workbench lets you answer interview rounds in a browser while reasoning and
|
|
4
|
+
follow-up stay in the same chat. Once installed, it should be selected whenever
|
|
5
|
+
the agent interviews you. You can simply say “grill me” or invoke your usual
|
|
6
|
+
interview skill; you do not need to request a browser form.
|
|
7
|
+
|
|
8
|
+
## Set up the project once
|
|
9
|
+
|
|
10
|
+
You need Node.js 22 or later, and an agent that can open a browser and keep a local
|
|
11
|
+
command running while waiting for your answers. The browser, workbench server,
|
|
12
|
+
and agent must run on the same computer.
|
|
13
|
+
|
|
14
|
+
From the project where you want to use it:
|
|
15
|
+
|
|
16
|
+
```sh
|
|
17
|
+
npx --yes grilling-workbench@0.2.0 install-skill
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
This fetches the application into npm's cache and installs the instructions that
|
|
21
|
+
teach the agent when and how to use it. It creates `.agents/skills/grilling-workbench`
|
|
22
|
+
and preserves any existing skill at that path. No `package.json`, project
|
|
23
|
+
dependency, or global installation is required, including in non-Node projects.
|
|
24
|
+
The skill uses the same pinned package version for subsequent commands.
|
|
25
|
+
|
|
26
|
+
For offline installation, source development, or upgrades, use the
|
|
27
|
+
[deployment guide](deployment.md). Keep your existing interview skills installed;
|
|
28
|
+
Matt Pocock's repository has its own [installation instructions](https://github.com/mattpocock/skills).
|
|
29
|
+
|
|
30
|
+
## Start your usual interview
|
|
31
|
+
|
|
32
|
+
For example, invoke `grill-me` or say:
|
|
33
|
+
|
|
34
|
+
> Grill me about the checkout design.
|
|
35
|
+
|
|
36
|
+
The expected flow is:
|
|
37
|
+
|
|
38
|
+
1. The interview skill chooses the next round of questions.
|
|
39
|
+
2. The agent starts a workbench session, connects its submission listener, and
|
|
40
|
+
opens the form in the browser.
|
|
41
|
+
3. You answer, revisit questions as needed, and click **Submit form** once.
|
|
42
|
+
4. The agent receives the complete submitted round and continues the same chat.
|
|
43
|
+
|
|
44
|
+
There is no separate review step or manual copy/paste. You may leave a question
|
|
45
|
+
blank: submission reports that as `not_answered`, so the agent knows you chose
|
|
46
|
+
not to answer it. That does not settle the underlying decision.
|
|
47
|
+
|
|
48
|
+
For explanations or changes to a question, use chat or the browser's native
|
|
49
|
+
Annotate/Quick Annotate features. The agent can revise the form while preserving
|
|
50
|
+
your draft. The app itself only handles answering and submitting questions.
|
|
51
|
+
|
|
52
|
+
The agent must remain actively waiting on the listener to continue immediately.
|
|
53
|
+
This package does not start new turns in an idle chat. Agents should read the
|
|
54
|
+
[operating protocol](../skills/grilling-workbench/references/agent-protocol.md)
|
|
55
|
+
before presenting questions; it covers the listener, receipts, and interruptions.
|
|
56
|
+
The [question format](../skills/grilling-workbench/references/questions.md) is the
|
|
57
|
+
reference for authoring or updating a round.
|
|
58
|
+
|
|
59
|
+
## How it fits the existing workflow
|
|
60
|
+
|
|
61
|
+
The workbench handles question presentation and answer delivery. Your chosen skill
|
|
62
|
+
still decides what to ask, interprets the answers, updates project records, and
|
|
63
|
+
determines when the interview is complete.
|
|
64
|
+
|
|
65
|
+
| Workflow | How to combine it with the workbench |
|
|
66
|
+
| --- | --- |
|
|
67
|
+
| [`grilling`](https://github.com/mattpocock/skills/blob/3cca18b368ae95cdbdebbff572ccafa662551015/skills/productivity/grilling/SKILL.md) / `grill-me` | Use one form for the current round of independent questions. Questions that depend on unresolved answers belong in a later round. |
|
|
68
|
+
| [`grill-with-docs`](https://github.com/mattpocock/skills/blob/3cca18b368ae95cdbdebbff572ccafa662551015/skills/engineering/grill-with-docs/SKILL.md) | Use the same form interface while the existing interview and domain-modeling skills maintain the project documents. |
|
|
69
|
+
| [`wayfinder`](https://github.com/mattpocock/skills/blob/3cca18b368ae95cdbdebbff572ccafa662551015/skills/engineering/wayfinder/SKILL.md) | Use forms during interviews about the current decision ticket. Keep the map, ticket ownership, dependencies, and resolution records in Wayfinder. |
|
|
70
|
+
| [`setup-matt-pocock-skills`](https://github.com/mattpocock/skills/blob/3cca18b368ae95cdbdebbff572ccafa662551015/skills/engineering/setup-matt-pocock-skills/SKILL.md) | Keep the tracker and domain-document configuration it establishes. Installing the workbench does not replace that configuration or invoke setup. |
|
|
71
|
+
|
|
72
|
+
A submitted form supplies answers; it does not automatically close tickets or
|
|
73
|
+
approve further work. Keep canonical decisions in the configured documents or
|
|
74
|
+
tracker, using submission and question IDs for attribution. Raw session files
|
|
75
|
+
remain private by default.
|
|
76
|
+
|
|
77
|
+
These integration recommendations were reviewed against upstream revision
|
|
78
|
+
`3cca18b368ae95cdbdebbff572ccafa662551015` on September 5, 2026. Check the actual
|
|
79
|
+
installed skills when upgrading; there is no need to patch their bodies to use
|
|
80
|
+
the workbench.
|
|
81
|
+
|
|
82
|
+
## If the agent does not use the workbench
|
|
83
|
+
|
|
84
|
+
First check whether `grilling-workbench` appears in the agent's available skills.
|
|
85
|
+
In Codex, that list combines applicable project skills, user skills, administrator
|
|
86
|
+
and system skills, and enabled plugin skills. It does not automatically include
|
|
87
|
+
local skills from unrelated projects. Our installer adds the workbench at the
|
|
88
|
+
current project's `.agents/skills/grilling-workbench` path.
|
|
89
|
+
|
|
90
|
+
Codex normally detects new skills automatically. If it is missing, restart Codex
|
|
91
|
+
and check the installed path. If it appears more than once, inspect the source
|
|
92
|
+
paths for duplicate user/project installations. [Codex skill discovery](https://learn.chatgpt.com/docs/build-skills#where-codex-loads-local-skills)
|
|
93
|
+
|
|
94
|
+
If the skill is listed but not selected during an interview, explicitly invoke
|
|
95
|
+
`$grilling-workbench` once to check that it can run. This is a troubleshooting step,
|
|
96
|
+
not the expected everyday workflow. Automatic selection depends on the agent
|
|
97
|
+
matching the interview to the skill description; it is not an application hook.
|
|
98
|
+
[How Codex selects skills](https://learn.chatgpt.com/docs/build-skills#how-chatgpt-and-codex-use-skills)
|
|
99
|
+
|
|
100
|
+
A short project instruction can reinforce the trigger. Merge this into the
|
|
101
|
+
project's existing AGENTS.md or equivalent instruction file, preserving its other
|
|
102
|
+
rules. It is optional; the skill already defines the interview trigger.
|
|
103
|
+
|
|
104
|
+
```markdown
|
|
105
|
+
Whenever interviewing the user, use the grilling-workbench skill at
|
|
106
|
+
`.agents/skills/grilling-workbench/SKILL.md`. Apply it alongside the current
|
|
107
|
+
interview workflow, including grill-me, without requiring a request for a browser
|
|
108
|
+
form. The command is `npx --yes grilling-workbench@0.2.0`.
|
|
109
|
+
|
|
110
|
+
Read the skill's operating protocol before presenting questions. Keep reasoning,
|
|
111
|
+
clarification, and decision records in the existing workflow. Respect an explicit
|
|
112
|
+
user request for another interface.
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
The installer does not edit project instructions automatically. Adjust the command
|
|
116
|
+
in the snippet if you explicitly configure a local or global installation.
|
|
117
|
+
|
|
118
|
+
## Check answer delivery in your agent
|
|
119
|
+
|
|
120
|
+
Try a throwaway two-question round. Answer one question, leave the other blank,
|
|
121
|
+
and submit. The agent should receive both outcomes and continue without another
|
|
122
|
+
chat message. Its listener should already be waiting before the form opens.
|
|
123
|
+
|
|
124
|
+
If the page stays on “Waiting for the agent,” inspect the listener process and
|
|
125
|
+
follow the [reconnection and receipt instructions](../skills/grilling-workbench/references/agent-protocol.md#definitions-and-interruptions).
|
|
126
|
+
Do not replace the listener with repeated status checks or ask the user to paste
|
|
127
|
+
answers. If the agent application cannot maintain an active tool wait, that
|
|
128
|
+
integration needs support before immediate continuation can work.
|
|
129
|
+
|
|
130
|
+
The package tests verify installation, socket delivery, receipts, and recovery.
|
|
131
|
+
Automatic skill selection in a fresh agent installation still needs this real
|
|
132
|
+
workflow check. Test ordinary interview requests without mentioning the browser;
|
|
133
|
+
explanations about an existing option should continue in chat.
|
|
134
|
+
|
|
135
|
+
## Share it with another project
|
|
136
|
+
|
|
137
|
+
Share [PavingLayer/grilling-workbench](https://github.com/PavingLayer/grilling-workbench)
|
|
138
|
+
and repeat the one-command setup above. npm includes the matching application and
|
|
139
|
+
skill; browser and command-execution tools must be supplied by the agent host.
|
|
140
|
+
|
|
141
|
+
The repository also exposes `skills/grilling-workbench/SKILL.md` in a layout
|
|
142
|
+
recognized by the [Skills CLI](https://github.com/vercel-labs/skills#skill-discovery).
|
|
143
|
+
The npm `install-skill` command is the primary setup path because it bundles the
|
|
144
|
+
skill with the same exact application release. Offline users can instead share
|
|
145
|
+
the release archive; see [distribution and installation](deployment.md#distribution-and-installation).
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Validation and known limits
|
|
2
|
+
|
|
3
|
+
This records what has been checked for the implemented workbench. For normal use,
|
|
4
|
+
start with the [integration guide](integration.md); for installation and recovery,
|
|
5
|
+
use the [deployment guide](deployment.md).
|
|
6
|
+
|
|
7
|
+
## Automated checks
|
|
8
|
+
|
|
9
|
+
The 0.2.0 release checks passed locally on Linux with Node.js 22.22.2 on September
|
|
10
|
+
6, 2026 (UTC): syntax validation, 18 automated tests, and both installed-package
|
|
11
|
+
and `npx` smoke tests. CI runs the same checks on Node 22 and 24; see
|
|
12
|
+
[GitHub Actions](https://github.com/PavingLayer/grilling-workbench/actions/workflows/verify.yml)
|
|
13
|
+
for the hosted results associated with a release commit.
|
|
14
|
+
|
|
15
|
+
The automated tests cover:
|
|
16
|
+
|
|
17
|
+
- Unanswered defaults, recommendation labels, and 1,000 generated action histories
|
|
18
|
+
checked against an independent model. The default seed is `20260905`;
|
|
19
|
+
`FC_SEED` and `FC_PATH` reproduce other generated cases.
|
|
20
|
+
- Complete immutable submission snapshots, including submitted blanks; rejection
|
|
21
|
+
of partial forms and stale snapshots; and idempotent retries.
|
|
22
|
+
- Draft preservation through definition changes, conflicts, failed writes, and
|
|
23
|
+
restart. Corrupt saved data is retained rather than reset.
|
|
24
|
+
- Socket completion only after persistence. Tests deliberately hold the storage
|
|
25
|
+
write open, then check delivery, reconnect replay, and receipt failure recovery.
|
|
26
|
+
- Session ownership, listener credentials, startup failure cleanup, port reuse,
|
|
27
|
+
and rejection of unrelated web origins and private-file requests.
|
|
28
|
+
|
|
29
|
+
The package smoke test packs the actual release and exercises it twice: installed
|
|
30
|
+
offline in an unrelated project, and through `npx` from an isolated cache in a
|
|
31
|
+
project without package files or dependencies. Both modes verify skill
|
|
32
|
+
installation without overwriting an existing copy, two isolated sessions, served
|
|
33
|
+
browser assets, whole-form delivery, acknowledgments, definition updates, restart,
|
|
34
|
+
and the source-checkout demo entrypoint. The `npx` test uses the local archive,
|
|
35
|
+
so registry publication and a fresh registry download are separate release checks.
|
|
36
|
+
|
|
37
|
+
## Embedded-browser checks
|
|
38
|
+
|
|
39
|
+
The implemented interface has been checked in the embedded browser for:
|
|
40
|
+
|
|
41
|
+
- A 20-question form at 808×1139, with independently scrolling navigation and
|
|
42
|
+
question content, a visible footer, and no horizontal overflow.
|
|
43
|
+
- Narrow layouts at 390×844 and 320×740, with the question picker, footer actions,
|
|
44
|
+
draft persistence after reload, and submission history available.
|
|
45
|
+
- Direct submission while draft saves are deliberately delayed. Submit remains
|
|
46
|
+
enabled while typing and sends the latest text without a review step.
|
|
47
|
+
- Submission containing one answer and two blanks, received over TCP with both
|
|
48
|
+
`not_answered` outcomes. Recording receipt updates the page's delivery status.
|
|
49
|
+
- Definition refresh, preserved draft text, recoverable save failures, and restart.
|
|
50
|
+
|
|
51
|
+
Native browser annotations were received in chat during UI iteration. After the
|
|
52
|
+
0.2.0 runtime upgrade, the existing preview still displayed the user's submitted
|
|
53
|
+
answers; its saved state and receipt files matched their pre-upgrade backups.
|
|
54
|
+
|
|
55
|
+
## Limits of this evidence
|
|
56
|
+
|
|
57
|
+
An actively waiting listener receives submissions immediately. The package does
|
|
58
|
+
not provide an idle-chat wakeup bridge. One user submission was captured over TCP
|
|
59
|
+
while the agent was idle, then read only after another chat message; that is not
|
|
60
|
+
evidence of automatic continuation in an idle chat.
|
|
61
|
+
|
|
62
|
+
The skill now directs agents to use the workbench for all interviews. Metadata
|
|
63
|
+
validation checks its structure; it does not prove that every model will select
|
|
64
|
+
it correctly. Automatic discovery and continuation in a fresh agent installation
|
|
65
|
+
still need the [target-agent checks](integration.md#check-answer-delivery-in-your-agent).
|
|
66
|
+
|
|
67
|
+
Screen-reader testing and a dedicated option-targeted annotation/clarification
|
|
68
|
+
round trip remain outstanding. Other operating systems, network filesystems,
|
|
69
|
+
device loss, and power-loss durability have not been release-tested. Exactly-once
|
|
70
|
+
chat replies across crashes are not guaranteed; the agent protocol documents
|
|
71
|
+
receipt and downstream-work recovery separately.
|
|
72
|
+
|
|
73
|
+
## Run the checks
|
|
74
|
+
|
|
75
|
+
From the source repository:
|
|
76
|
+
|
|
77
|
+
```sh
|
|
78
|
+
npm ci
|
|
79
|
+
npm run check
|
|
80
|
+
npm test
|
|
81
|
+
npm run test:package
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Integration tests require permission to bind local HTTP and TCP sockets. Browser
|
|
85
|
+
and target-agent checks are separate from these automated commands.
|