@bluewombat/runtime 0.1.2 → 0.3.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.
Files changed (75) hide show
  1. package/README.md +81 -32
  2. package/SPECS.md +86 -9
  3. package/dist/cli.js +19 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/config/find-config.d.ts +2 -2
  6. package/dist/config/find-config.js +2 -2
  7. package/dist/config/load-config.d.ts +1 -1
  8. package/dist/config/load-config.d.ts.map +1 -1
  9. package/dist/config/load-config.js +95 -13
  10. package/dist/config/load-config.js.map +1 -1
  11. package/dist/config/parse-args.d.ts.map +1 -1
  12. package/dist/config/parse-args.js +40 -2
  13. package/dist/config/parse-args.js.map +1 -1
  14. package/dist/config/types.d.ts +35 -4
  15. package/dist/config/types.d.ts.map +1 -1
  16. package/dist/index.d.ts +2 -0
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +1 -0
  19. package/dist/index.js.map +1 -1
  20. package/dist/loop/authority.d.ts.map +1 -1
  21. package/dist/loop/authority.js +16 -1
  22. package/dist/loop/authority.js.map +1 -1
  23. package/dist/loop/context.d.ts +3 -0
  24. package/dist/loop/context.d.ts.map +1 -1
  25. package/dist/loop/describe.d.ts.map +1 -1
  26. package/dist/loop/describe.js +5 -0
  27. package/dist/loop/describe.js.map +1 -1
  28. package/dist/loop/drive.d.ts +8 -6
  29. package/dist/loop/drive.d.ts.map +1 -1
  30. package/dist/loop/drive.js +17 -7
  31. package/dist/loop/drive.js.map +1 -1
  32. package/dist/loop/journal.d.ts +27 -0
  33. package/dist/loop/journal.d.ts.map +1 -1
  34. package/dist/loop/journal.js +68 -0
  35. package/dist/loop/journal.js.map +1 -1
  36. package/dist/loop/open-host.d.ts.map +1 -1
  37. package/dist/loop/open-host.js +60 -3
  38. package/dist/loop/open-host.js.map +1 -1
  39. package/dist/loop/report.d.ts.map +1 -1
  40. package/dist/loop/report.js +48 -6
  41. package/dist/loop/report.js.map +1 -1
  42. package/dist/loop/streams.d.ts +61 -0
  43. package/dist/loop/streams.d.ts.map +1 -0
  44. package/dist/loop/streams.js +156 -0
  45. package/dist/loop/streams.js.map +1 -0
  46. package/dist/loop/trace.d.ts +7 -0
  47. package/dist/loop/trace.d.ts.map +1 -1
  48. package/dist/loop/trace.js +40 -1
  49. package/dist/loop/trace.js.map +1 -1
  50. package/dist/loop/transformers.d.ts +7 -1
  51. package/dist/loop/transformers.d.ts.map +1 -1
  52. package/dist/loop/transformers.js +44 -11
  53. package/dist/loop/transformers.js.map +1 -1
  54. package/dist/operator/board.d.ts +4 -0
  55. package/dist/operator/board.d.ts.map +1 -1
  56. package/dist/operator/board.js +6 -0
  57. package/dist/operator/board.js.map +1 -1
  58. package/dist/operator/doctor.d.ts.map +1 -1
  59. package/dist/operator/doctor.js +45 -22
  60. package/dist/operator/doctor.js.map +1 -1
  61. package/dist/operator/film.d.ts +28 -0
  62. package/dist/operator/film.d.ts.map +1 -0
  63. package/dist/operator/film.js +211 -0
  64. package/dist/operator/film.js.map +1 -0
  65. package/dist/operator/init.d.ts.map +1 -1
  66. package/dist/operator/init.js +3 -2
  67. package/dist/operator/init.js.map +1 -1
  68. package/dist/operator/live.d.ts.map +1 -1
  69. package/dist/operator/live.js +3 -1
  70. package/dist/operator/live.js.map +1 -1
  71. package/dist/operator/log.d.ts +13 -0
  72. package/dist/operator/log.d.ts.map +1 -0
  73. package/dist/operator/log.js +238 -0
  74. package/dist/operator/log.js.map +1 -0
  75. package/package.json +16 -15
package/README.md CHANGED
@@ -55,6 +55,7 @@ package's README — Host does not grow a `--repo` flag for it.
55
55
  | `mason run` | Drain the FeatureManager, run Conductor, report |
56
56
  | `mason watch` | Snapshot the ledger and follow the journal. Ctrl-C leaves the worker running |
57
57
  | `mason status` | Snapshot the ledger, then exit. `--json` for scripts |
58
+ | `mason log` | Replay the journal, with the reason a phase stopped. `--problems` for just those |
58
59
  | `mason init` | Set this directory up: asks, writes the config and the Builder stub, then runs `setup` |
59
60
  | `mason setup` | Prepare the tracker. A plan by default; `--apply` writes. Exit 1 on a blocked step |
60
61
  | `mason doctor` | Check the config, the slots, and the manager. Exit 1 on any failure |
@@ -83,6 +84,21 @@ of the current step (`submitted` included). It does not talk to the tracker, and
83
84
  it cannot `ready` or claim. `status` is the same snapshot without the
84
85
  follow. `--json` prints that snapshot as JSON.
85
86
 
87
+ When a run only printed `unavailable:<key>`, the reason is already in the
88
+ journal and `log` is how you read it:
89
+
90
+ ```bash
91
+ mason log --problems
92
+ ```
93
+
94
+ `--all` keeps the idle polls. `--tail N` limits the text film (`0` shows every
95
+ kept line). `--json` prints every kept line; with `--tail`, a truncated reply
96
+ names how many were kept and how many are shown. The closing tally counts each
97
+ distinct failure. A pause with no planner exit code is counted apart from a
98
+ non-zero exit. If a slot was started with `--transcript-dir`, the newest
99
+ transcript files are named underneath, with the agent exit and duration read
100
+ from the start of each file.
101
+
86
102
  To abandon a Feature the tracker can no longer mention (a deleted issue, a
87
103
  manager with no `probe`), stop `run` if it holds the ledger lock, then:
88
104
 
@@ -95,31 +111,44 @@ crash — the ledger is. The file can grow; there is no rotation yet.
95
111
 
96
112
  ## Config
97
113
 
98
- `mason.config.json`, found by walking up from the working directory. `--config
114
+ `mason.config.yaml`, found by walking up from the working directory. `--config
99
115
  FILE` names another one. Relative paths resolve against the file; relative
100
116
  flag paths resolve against the working directory. Flags override the file, and
101
117
  `--manager-option` overrides one manager option without dropping the others.
102
-
103
- ```json
104
- {
105
- "manager": "@bluewombat/manager-fake",
106
- "managerOptions": { "source": "./.mason/source", "target": "./.mason/threads" },
107
- "workLine": { "stable": "./work-line-stable", "isolation": "@bluewombat/isolation-copy" },
108
- "planner": {
109
- "cmd": ["node", "./node_modules/@bluewombat/slots/planners/one-subtask.mjs"],
110
- "timeoutMs": 600000
111
- },
112
- "builder": {
113
- "producer": { "cmd": ["node", "./mason-builder.mjs"], "timeoutMs": 600000 },
114
- "repair": { "cmd": ["node", "./mason-repair.mjs"], "timeoutMs": 600000 },
115
- "maxAttempts": 3,
116
- "gates": { "defaultTimeoutMs": 120000, "gates": [] }
117
- },
118
- "assembly": { "gates": { "defaultTimeoutMs": 900000, "gates": [] } },
119
- "authority": { "enabled": false },
120
- "timeoutMs": 600000,
121
- "pollIntervalMs": 30000
122
- }
118
+ Parsed with the `yaml` package (YAML 1.2 core schema), so a repeated key is
119
+ refused rather than silently keeping the last one, and `no` / `on` / `off`
120
+ stay plain strings — never coerced to a boolean the way YAML 1.1 would. A
121
+ value that starts with `@`, like every `@bluewombat/...` package name, needs
122
+ quotes: `@` is a reserved YAML indicator at the start of a plain scalar.
123
+
124
+ ```yaml
125
+ manager: "@bluewombat/manager-fake"
126
+ managerOptions:
127
+ source: ./.mason/source
128
+ target: ./.mason/threads
129
+ workLine:
130
+ stable: ./work-line-stable
131
+ isolation: "@bluewombat/isolation-copy"
132
+ planner:
133
+ cmd:
134
+ - node
135
+ - ./node_modules/@bluewombat/slots/planners/one-subtask.mjs
136
+ timeoutMs: 600000
137
+ builder:
138
+ producer:
139
+ cmd: [node, ./mason-builder.mjs]
140
+ timeoutMs: 600000
141
+ repair:
142
+ cmd: [node, ./mason-repair.mjs]
143
+ timeoutMs: 600000
144
+ maxAttempts: 3
145
+ gates: { defaultTimeoutMs: 120000, gates: [] }
146
+ assembly:
147
+ gates: { defaultTimeoutMs: 900000, gates: [] }
148
+ authority:
149
+ enabled: false
150
+ timeoutMs: 600000
151
+ pollIntervalMs: 30000
123
152
  ```
124
153
 
125
154
  | Field | Meaning |
@@ -140,17 +169,23 @@ flag paths resolve against the working directory. Flags override the file, and
140
169
  | `builder.repair` | The same, for a pass a Gate refused. **Required**, and never inherited |
141
170
  | `builder.maxAttempts` | Attempts one Task may start. Default 3 |
142
171
  | `builder.gates` | `defaultTimeoutMs` and `gates`: ordered checks on each Subtask |
143
- | `assembly.fix` | `cmd` / `timeoutMs`. Spawned when a judgement of the whole refused it. Needs `authority.enabled` |
172
+ | `assembly.fix` | `cmd` / `timeoutMs`. Spawned when a judgement of the whole refused it — by an Authority, by `assembly.validate`, or by both |
173
+ | `assembly.validate` | `cmd` / `timeoutMs`. Optional. A local, read-only judge of the assembled feature, run after align, with or without an Authority. A refusal is repaired by `assembly.fix` the same as an Authority's |
144
174
  | `assembly.maxAttempts` | Attempts that one fix may start. Default 3 |
145
175
  | `assembly.gates` | Ordered checks on the assembled feature. Empty: the Authority judges alone |
146
176
  | `timeoutMs` | How long a child **outside** a Task may run: manager, isolations |
147
- | `maxRefusals` | Times an Authority may send a Submission back before it escalates. Default 3 |
177
+ | `maxRefusals` | Times the work may be sent back before it escalates, by an Authority, by `assembly.validate`, or by both — one shared budget. Default 3 |
148
178
  | `pollIntervalMs` | Set it and the process keeps draining until SIGINT. Absent: one tick |
179
+ | `observability.streams` | `enabled`, `dir`, `keep`. Films what every child says, as it says it — one file per child under `<dir>/<feature>/`, named in the journal by a `stream-opened` line. `dir` resolves against the config file; default `<home>/streams`. `keep` is `stdout` / `stderr`, default both. Off unless `enabled` is true: a stream is the Project's own code and prompts in the clear |
149
180
 
150
181
  Every `cmd` is named where it is used, and nothing falls back to a neighbour: a
151
182
  `repair` with no command of its own is refused rather than quietly running the
152
183
  first-pass agent again. `builder` makes a Subtask. `assembly` judges the whole
153
184
  and, when that judgement refuses it, runs `assembly.fix` — not a second first-pass.
185
+ `assembly.validate`, when declared, is a second, local judge of the whole: it
186
+ runs after align, before the Authority sees the work (or before the final
187
+ fold, with none). Its refusal is repaired by `assembly.fix` exactly as an
188
+ Authority's is, and shares the same `maxRefusals` budget.
154
189
 
155
190
  Every tracker field lives in `managerOptions`. Host does not read them.
156
191
 
@@ -206,7 +241,17 @@ feature, which makes nothing.
206
241
  Spawned in the feature workspace when a judgement of the whole refused it
207
242
  (`--report`, `--report-from`). Same argv as a Builder otherwise. Host hands
208
243
  Implementer `assembly.fix` as that pass's only agent: there is no first-pass
209
- producer at this moment.
244
+ producer at this moment. The refusal it repairs may have come from an
245
+ Authority or from `assembly.validate`.
246
+
247
+ ### Assembly validate
248
+
249
+ Spawned in the feature workspace after align, with or without an Authority —
250
+ `--intention`, `--id`, `--attempt`, `--context`. No `--report`: it is a
251
+ read-only review, not a repair, and takes nothing a producer would. Optional.
252
+ Its verdict is not the exit code alone: the slot reads what the agent itself
253
+ answered and maps a refusal through the Builder failure contract, so a review
254
+ that completes cleanly but finds a problem is still a refusal.
210
255
 
211
256
  ### Gates
212
257
 
@@ -330,7 +375,9 @@ it each stop `mason run` at boot, and `mason doctor` reports the same offline
330
375
  and is the operator's directory, as before.
331
376
 
332
377
  ```
333
- assembled → Publisher places the work → manager opens the Submission
378
+ assembled → align → assembly.validate (optional, local)
379
+ refused → assembly.fix, then align again, then validate again
380
+ accepted → Publisher places the work → manager opens the Submission
334
381
  → submitted, and the run comes back to it on each poll
335
382
  assembly.gates judge what was published
336
383
  refused → assembly.fix, then the same Submission is offered again
@@ -338,7 +385,9 @@ assembled → Publisher places the work → manager opens the Submission
338
385
  ```
339
386
 
340
387
  Neither half judges: that is what `assembly.gates` are for. The Authority places
341
- and folds; a Gate says whether the fold may happen. After the
388
+ and folds; a Gate says whether the fold may happen. `assembly.validate`, when
389
+ declared, judges before either half — the same verdict has the same fate
390
+ whether or not there is an Authority to offer the work to afterwards. After the
342
391
  Authority folds, Host brings its copy of the work line up to date with a
343
392
  fast-forward — the work line moved where the Authority is, and the next
344
393
  Isolation must start from that version, not from a copy left behind.
@@ -410,10 +459,10 @@ change that breaks it does not merge.
410
459
 
411
460
  | Layer | Holds | Does not hold | May import |
412
461
  | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------- | --------------------------------------------- |
413
- | `config/` | What a Project wrote: argv, `mason.config.json`, discovery, `HostOptions`. Pure: JSON in, options out | A runtime value (a Journal, a Port, a process handle) | Node, `manager-kit` types |
462
+ | `config/` | What a Project wrote: argv, `mason.config.yaml`, discovery, `HostOptions`. Pure: YAML in, options out | A runtime value (a Journal, a Port, a process handle) | Node, `manager-kit` types |
414
463
  | `plugins/` | Load a package by name and check its shape: a manager, an isolation strategy | What to do with the loaded thing | `config` |
415
464
  | `loop/` | The process: listen → probe → adapt → admit → run → report; composition (`open-host`, `transformers`, Authority, work line, lock, Cursor, journal, trace) | A command a human types; a string a human reads about the config | `plugins`, `config`, the kernel, Transformers |
416
- | `operator/` | Tools for a human: `init`, `setup`, `doctor`, `watch` / `status`, `cancel`, `board`, the terminal prompt | Anything the loop needs — the loop cannot see this layer | everything below |
465
+ | `operator/` | Tools for a human: `init`, `setup`, `doctor`, `watch` / `status`, `log`, `cancel`, `board`, the terminal prompt | Anything the loop needs — the loop cannot see this layer | everything below |
417
466
  | `index.ts`, `cli.ts` | The package surface and the dispatch. Nothing else sits at the top of `src/` | Logic | everything |
418
467
 
419
468
  Host's code names no plugin. A manager, an isolation strategy, a persistence
@@ -464,10 +513,10 @@ SPECS.md behavioural contract
464
513
  README.md how to install, configure and run; the layers above
465
514
  src/
466
515
  index.ts the package surface
467
- cli.ts mason run | watch | status | cancel | init | setup | doctor
516
+ cli.ts mason run | watch | status | log | cancel | init | setup | doctor
468
517
  config/ argv, JSON config, config discovery → HostOptions; defaults: the plugin names Host ships with
469
518
  plugins/ load: the one loader; manager, isolation, persist: one shape each; discover
470
- loop/ open-host (composition), tick (the loop), deliveries, drive, probe, report, authority, work-line, cursor, lock, journal, trace, transformers
471
- operator/ init, setup, doctor, live (watch / status), cancel, board, prompt, git-remote
519
+ loop/ open-host (composition), tick (the loop), deliveries, drive, probe, report, authority, work-line, cursor, lock, journal (the film), streams (what a child said), trace, transformers
520
+ operator/ init, setup, doctor, live (watch / status), log, film, cancel, board, prompt, git-remote
472
521
  fixtures/ stand-in slots for the loop's tests
473
522
  ```
package/SPECS.md CHANGED
@@ -34,10 +34,10 @@ Planner / Builder / Gate argv.
34
34
 
35
35
  ## 2. Faces
36
36
 
37
- | Face | Entry | Must not |
38
- | ------ | ------------------------------------------------------------------- | --------------------------------------------- |
39
- | Import | `openHost(options)` then `runOnce` / `run` | Live inside Conductor `src/run/` |
40
- | CLI | `mason run \| watch \| status \| cancel \| init \| setup \| doctor` | Interpret a FeatureStandard; pick Child paths |
37
+ | Face | Entry | Must not |
38
+ | ------ | -------------------------------------------------------------------------- | --------------------------------------------- |
39
+ | Import | `openHost(options)` then `runOnce` / `run` | Live inside Conductor `src/run/` |
40
+ | CLI | `mason run \| watch \| status \| log \| cancel \| init \| setup \| doctor` | Interpret a FeatureStandard; pick Child paths |
41
41
 
42
42
  `src/loop/` is the process: `open-host.ts` opens packages (composition),
43
43
  `tick.ts` runs the listen / probe / Cursor / sweep loop, `deliveries.ts` handles one
@@ -52,16 +52,23 @@ import rule between them are in [README.md](./README.md) § Layers.
52
52
 
53
53
  ## 3. Configuration
54
54
 
55
- `mason.config.json`, found by walking up from the working directory, or the
55
+ `mason.config.yaml`, found by walking up from the working directory, or the
56
56
  file `--config` names. Relative paths in the file resolve against the file;
57
57
  relative paths in a flag resolve against the working directory. Flags override
58
58
  the file. `--manager-option key=value` merges per key, so overriding one option
59
59
  does not drop the others; a repeated key becomes an array.
60
60
 
61
- Host validates only its own keys. `managerOptions` is copied through untouched:
61
+ Host validates only its own keys, against a closed list: an unknown key is a
62
+ refusal, not something ignored. `managerOptions` is copied through untouched:
62
63
  a tracker's fields are that package's business, and its errors are that
63
64
  package's words.
64
65
 
66
+ `observability` is the one key that changes nothing about how work is done, only
67
+ what is written down about it. It holds `streams` — `enabled`, `dir`, `keep` —
68
+ and `enabled` is declared rather than defaulted, for the same reason an
69
+ Authority's is: what a stream holds is the Project's own material in the clear.
70
+ See § 8.
71
+
65
72
  ## 4. Loading a manager
66
73
 
67
74
  `manager` is a package name or a path. Resolution imports the bare specifier
@@ -95,7 +102,7 @@ not losing an Event.
95
102
  | `invalid` (new, or the intention changed) | `recordInvalid`, emit `invalid` |
96
103
  | `invalid` (same fingerprint as recorded) | leave it; the tracker was told, and telling it is what delivered it again |
97
104
  | `upsert` (new/invalid) | `admit`, emit `accepted`, then `runProject` when the Project is free; a Project frozen by an escalation queues the Feature (journal `queued`, one `progress` Event) and the sweep starts it once the Project is free. Post-run Events (`planned` / `done` / `escalated`) are reported on the Feature that was driven, not on the delivered key. `progress` (once per refusal) when the Authority sent the Submission back and a repair is on its way |
98
- | `upsert` (in-flight / terminal) | leave it; do not restart. In-flight is `planning`, `running`, `escalated`, `integrating`, `submitted`; terminal is `merging`, `done`, `cancelled`. An echo of a Host report (Submitted, a progress comment) is this row: do not admit it |
105
+ | `upsert` (in-flight / terminal) | leave it; do not restart. In-flight is `planning`, `running`, `escalated`, `integrating`, `submitted`; terminal is `merging`, `done`, `cancelled`. An echo of a Host report (Submitted, a progress comment) is this row: do not admit it |
99
106
  | `upsert` (`received`) | same drive as a new upsert (no second `accepted`) |
100
107
  | `upsert` + `signalsReady` while `escalated` | same as `ready` — a poll snapshot has no `labeled` edge |
101
108
  | `ready` | `resumeReady`, emit `resumed`, `runProject`, then the same post-run Events |
@@ -140,6 +147,13 @@ Transformer progress, admitted, reported, queued, idle, a heartbeat while
140
147
  the ledger is still right. `mason run` still writes a human Trace on stdout.
141
148
  The journal is how another process attaches.
142
149
 
150
+ An offer the work could not get past is journaled `submit-refused`, with the
151
+ Feature's `key`, `by` (`publisher` when the work could not be placed,
152
+ `authority` when the Authority would not open a Submission) and the refuser's
153
+ own `reason`. The same reason becomes the escalation's Trace; the line is so
154
+ `mason log --problems` and a watcher see why a run stopped, not only that it
155
+ did.
156
+
143
157
  After listen, if the manager declares `probe` and the listen reached the source
144
158
  (`completed`, `listened` — not `source-lost` / `interrupted` / `invalid-invocation`),
145
159
  Host asks `probe` of every Feature abandon is still legal for (`received`,
@@ -157,7 +171,7 @@ and left; the next sweep that finds the Project free claims it. The same set
157
171
  copy: starting a queued Feature on a copy that was not fast-forwarded this
158
172
  tick would build on a version that no longer exists.
159
173
 
160
- ## 8. init, setup, doctor, watch, status and cancel
174
+ ## 8. init, setup, doctor, watch, status, log and cancel
161
175
 
162
176
  `init` writes a config that already runs: the Planner is the bootstrap one from
163
177
  `@bluewombat/slots/planners/`, the Builder is a stub that says what to replace
@@ -172,6 +186,10 @@ other — `workspace-changed` says an Attempt that changed nothing did nothing,
172
186
  which is true of a Subtask and false of an assembly whose correct outcome is that
173
187
  nothing was left to do. The assembly produces nothing unless something refused it
174
188
  first: it is a judgement, and a refusal is `assembly.fix`, not a second first-pass.
189
+ Two things may judge it: the Gate sequence (`assembly.gates`, and an Authority's
190
+ own checks on what was published) and, optionally, `assembly.validate` — a local,
191
+ read-only pass that runs before either. Both send a refusal to the same `fix`
192
+ and spend the same `maxRefusals` budget.
175
193
 
176
194
  Every child of a Task carries its own ceiling and no other. Every `cmd` names
177
195
  its own `timeoutMs`, and none is inherited from a neighbour — nothing else
@@ -239,13 +257,67 @@ whether the manager loads, and then the manager's own findings. It parses
239
257
  without demanding that paths exist, so one missing directory does not hide
240
258
  every other check, and it never uses the network.
241
259
 
260
+ A run names itself. `openHost` mints a `run_id`, stamps it on every journal
261
+ line it writes, and opens the film with `host-started` — pid, Host's version,
262
+ the manager, the ledger root — and closes it with `host-stopped` before the lock
263
+ is released. A journal holds every run that ever wrote to that ledger, and
264
+ without these a reader cannot tell one process's film from the next, nor a run
265
+ that ended from one whose process was killed: the missing `host-stopped` is how
266
+ the second is said. Every line about a Task also carries the Feature it serves,
267
+ as `key`; a line that names a Task and no Feature is a line nothing can join.
268
+
269
+ `observability.streams` films what every child says, as it says it: the
270
+ producers, the Gates, the Planner. One file per child under
271
+ `<dir>/<feature>/<task>-attempt-<n>[-gate-<id>]-<stamp>.ndjson`, one JSON object
272
+ per chunk with its own stamp and which stream it came from, filed under the same
273
+ directory name a transcript uses. Each file is named in the journal by a
274
+ `stream-opened` line, so nothing has to rebuild the path. `dir` resolves against
275
+ the config directory and defaults to `<home>/streams`; `keep` chooses `stdout`,
276
+ `stderr`, or both. `--streams-dir DIR` is the same switch for one run, and there
277
+ is no bare flag: what a stream holds is the Project's own material in the clear,
278
+ and saying where it lands is part of asking for it. Off unless declared.
279
+
280
+ Writing it is asynchronous and may be lost. The ledger is truth, the journal is
281
+ the film and is written synchronously so it lands before the next phase, and
282
+ this is the noise underneath — an agent's stream is large enough that putting it
283
+ on a synchronous path would make visibility able to take a run down. A child
284
+ killed for writing past its output bound is filmed up to the kill: the bound
285
+ protects Host's memory, and that child is the one worth having a film of.
286
+
287
+ A film says what it held as it closes — `stream-closed` with the bytes, the
288
+ chunks and the milliseconds — and a Feature that reaches `done` or `cancelled`
289
+ has its films removed, which the journal records as `streams-discarded` with the
290
+ count and the size. An escalation keeps everything: that is the outcome where
291
+ somebody has to go and look. Nothing prunes transcripts.
292
+
293
+ A pass that listened to nothing and drove nothing is not written as it happens.
294
+ Such passes are held and said as a single `idle` line carrying `passes`, at most
295
+ once a minute, so a `watch` still shows the loop turning without a line every
296
+ poll. A `listen` that did not complete is never held and never hidden.
297
+
242
298
  `watch` and `status` are the operator live view. They open the ledger the same
243
299
  way `run` does (`openFilesystemPersist` then `openWorkLedger`) and they do not
244
300
  open a manager, Conductor, or Host. `status` prints a snapshot of every known
245
301
  Feature and exits. `watch` prints that snapshot, then follows new journal lines
246
302
  until SIGINT (exit 0). A missing journal is not an error: the snapshot still
247
303
  stands. `--json` prints the snapshot as JSON. Ctrl-C on watch leaves the worker
248
- running. The file can grow without rotation.
304
+ running. The file can grow without rotation. A followed line that records a
305
+ stop includes the child's last words (`detail`, `reason`, a non-zero exit, a
306
+ Gate report that did not pass). `run` prints that same note under the phase
307
+ label.
308
+
309
+ `log` reads that same journal and exits. It does not follow, and it does not
310
+ open a manager or Host. Quiet lines (`idle`, a listen that delivered nothing)
311
+ are hidden. `--all` keeps them. `--problems` keeps only lines that explain a
312
+ stop. `--tail N` keeps the last N of the text film (0 means no limit). `--json`
313
+ prints every kept line, and when `--tail` is also passed and drops lines the
314
+ object names `kept` and `shown`. After the text film it tallies the distinct
315
+ problems. A `result` is counted with the exit code of the `planner-finished`
316
+ just before it. A run that then pauses, with no exit code, is tallied as
317
+ `interrupted`, apart from a non-zero exit that left the same detail. When a
318
+ slot was given `--transcript-dir` it names the newest transcript files with
319
+ the agent exit and duration read from the start of each file. A missing
320
+ journal is not an error. Exit 2 when the config or `--tail` cannot be read.
249
321
 
250
322
  `cancel <key>` abandons one Feature the same way a `cancel` delivery does. The
251
323
  team still abandons in the FeatureManager; this is the hatch when the tracker
@@ -299,5 +371,10 @@ positional: `cancel github:owner/name#19`.
299
371
  18. A Feature `submitted`, then the same upsert delivered again, then the
300
372
  Authority refuses: Host skips the echo, records no `pending_fingerprint`,
301
373
  and the next pass repairs. It does not escalate as a plan refusal.
374
+ 19. `log` on a journal that recorded `unavailable` with a `detail` prints that
375
+ detail, hides `idle`, and `--problems` drops the phase labels that are not
376
+ themselves the failure. `--json` returns every kept line. A paused run
377
+ with no planner exit code is tallied apart from a non-zero exit. It does
378
+ not import `openHost`.
302
379
 
303
380
  How to install, configure and run: [README.md](./README.md).
package/dist/cli.js CHANGED
@@ -8,6 +8,7 @@ import { runCancel } from "./operator/cancel.js";
8
8
  import { runDoctor } from "./operator/doctor.js";
9
9
  import { runInit } from "./operator/init.js";
10
10
  import { runLive } from "./operator/live.js";
11
+ import { runLog } from "./operator/log.js";
11
12
  import { isInteractive, terminalAsk } from "./operator/prompt.js";
12
13
  import { runSetup } from "./operator/setup.js";
13
14
  const USAGE = `Usage: ${PRODUCT} <command>
@@ -15,6 +16,7 @@ const USAGE = `Usage: ${PRODUCT} <command>
15
16
  run drain the FeatureManager, run Conductor, report
16
17
  watch snapshot the ledger and follow the journal
17
18
  status snapshot the ledger, then exit
19
+ log replay the journal, including why a phase stopped
18
20
  cancel abandon a Feature by key (when the tracker cannot say it is gone)
19
21
  init set this directory up — asks, writes, then runs setup
20
22
  doctor check the config, the slots, and the manager
@@ -25,11 +27,13 @@ init flags: --manager PKG --manager-option KEY=VALUE --work-line-stable DIR
25
27
 
26
28
  Shared flags: --config FILE --manager NAME --manager-option KEY=VALUE --home DIR
27
29
  --work-line-stable DIR --work-line-branch NAME --workspace-root DIR --ledger DIR
30
+ --streams-dir DIR
28
31
  --planner -- CMD --planner-timeout-ms N
29
32
  --builder -- CMD --builder-timeout-ms N --builder-max-attempts N
30
33
  --builder-repair -- CMD --builder-repair-timeout-ms N
31
34
  --builder-gate ID -- CMD --builder-gate-timeout-ms N
32
35
  --assembly-fix -- CMD --assembly-fix-timeout-ms N --assembly-max-attempts N
36
+ --assembly-validate -- CMD --assembly-validate-timeout-ms N
33
37
  --assembly-gate ID -- CMD --assembly-gate-timeout-ms N
34
38
  --timeout-ms N --poll-interval-ms N
35
39
 
@@ -37,9 +41,17 @@ A gate's --*-gate-timeout-ms comes before the --*-gate it bounds.
37
41
 
38
42
  watch / status also take --json (snapshot as JSON).
39
43
 
44
+ log also takes --problems, --all, and --json (every kept line).
45
+ --tail N limits the text film (0 = no limit). With --json it names kept and shown when it drops lines.
46
+
40
47
  Without --config, the nearest ${CONFIG_FILENAME} is used. --home is where Host
41
48
  keeps its own files (default ${DEFAULT_HOME}): the ledger, the workspaces, its copy of
42
49
  the work line.
50
+
51
+ --streams-dir films what every child says, as it says it, one file per child.
52
+ Naming the directory is what turns it on; the config key "observability.streams"
53
+ is the same switch for good. It is off by default: a stream is the Project's own
54
+ material — its code, its prompts — written down in the clear.
43
55
  `;
44
56
  function installSignalHandlers(state) {
45
57
  const onSignal = () => {
@@ -85,6 +97,13 @@ async function main(argv) {
85
97
  if (command === "run") {
86
98
  return await run(rest);
87
99
  }
100
+ if (command === "log") {
101
+ return await runLog({
102
+ cwd: process.cwd(),
103
+ argv: rest,
104
+ write: (line) => process.stdout.write(line),
105
+ });
106
+ }
88
107
  if (command === "watch" || command === "status") {
89
108
  const interruptFlag = { interrupted: false };
90
109
  const detachSignals = installSignalHandlers(interruptFlag);
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- export declare const CONFIG_FILENAME = "mason.config.json";
1
+ export declare const CONFIG_FILENAME = "mason.config.yaml";
2
2
  /**
3
- * The nearest `mason.config.json`, walking up from `startDir`.
3
+ * The nearest `mason.config.yaml`, walking up from `startDir`.
4
4
  *
5
5
  * Running from a subdirectory of the project is the common case, so the file is
6
6
  * looked up the way a toolchain config is, not demanded on the command line.
@@ -1,9 +1,9 @@
1
1
  import { existsSync } from "node:fs";
2
2
  import { dirname, join, resolve } from "node:path";
3
3
  import { PRODUCT } from "@bluewombat/manager-kit";
4
- export const CONFIG_FILENAME = `${PRODUCT}.config.json`;
4
+ export const CONFIG_FILENAME = `${PRODUCT}.config.yaml`;
5
5
  /**
6
- * The nearest `mason.config.json`, walking up from `startDir`.
6
+ * The nearest `mason.config.yaml`, walking up from `startDir`.
7
7
  *
8
8
  * Running from a subdirectory of the project is the common case, so the file is
9
9
  * looked up the way a toolchain config is, not demanded on the command line.
@@ -7,7 +7,7 @@ export type LoadedConfig = {
7
7
  reason: string;
8
8
  };
9
9
  /**
10
- * Read one JSON object and resolve relative paths against the file's directory.
10
+ * Read one YAML document and resolve relative paths against the file's directory.
11
11
  */
12
12
  export declare function loadConfig(path: string): LoadedConfig;
13
13
  //# sourceMappingURL=load-config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"load-config.d.ts","sourceRoot":"","sources":["../../src/config/load-config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAA+B,cAAc,EAAuB,MAAM,YAAY,CAAC;AA0BnG,MAAM,MAAM,YAAY,GACpB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;CAAE,GACjD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAyJrD"}
1
+ {"version":3,"file":"load-config.d.ts","sourceRoot":"","sources":["../../src/config/load-config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAGV,cAAc,EAIf,MAAM,YAAY,CAAC;AA8BpB,MAAM,MAAM,YAAY,GACpB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;CAAE,GACjD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAmKrD"}