@delorenj/pjangler 1.4.6 → 1.5.2

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 (83) hide show
  1. package/README.md +41 -596
  2. package/dist/assets/project-notebook-skill/SHA256SUMS +5 -5
  3. package/dist/assets/project-notebook-skill/export-manifest.json +5 -5
  4. package/dist/assets/project-notebook-skill/hooks/session-end.sh +20 -1
  5. package/dist/assets/project-notebook-skill/hooks/session-start.sh +20 -1
  6. package/dist/assets/project-notebook-skill/references/configuration.md +2 -0
  7. package/dist/assets/project-notebook-skill/scripts/project-hooks.py +33 -3
  8. package/dist/assets/project-notebook-skill/tests/test_project_hooks.py +37 -0
  9. package/dist/index.js +9385 -18379
  10. package/dist/mcp-server.js +9432 -17852
  11. package/dist/notebook/journal-service-main.js +5682 -0
  12. package/dist/project-registry-service.js +748 -0
  13. package/dist/prompt.js +2 -1
  14. package/package.json +15 -10
  15. package/scripts/install-project-registry.mjs +34 -0
  16. package/scripts/migrate-project-registry.mjs +117 -0
  17. package/src/project/registryClient.ts +62 -0
  18. package/templates/commonproject/copier.yml +16 -19
  19. package/templates/commonproject/template/.agents/hooks/README.md +10 -4
  20. package/templates/commonproject/template/.agents/hooks/hermes/hindsight-hook.sh +12 -2
  21. package/templates/commonproject/template/.agents/hooks/hooks.master.json +10 -10
  22. package/templates/commonproject/template/.agents/hooks/lib/hook-guard.sh +13 -0
  23. package/templates/commonproject/template/.agents/hooks/sync.py +66 -17
  24. package/templates/commonproject/template/.agents/skills.json +0 -1
  25. package/templates/commonproject/template/.github/workflows/code-review.yml.jinja +7 -1
  26. package/templates/commonproject/template/.project.json.jinja +1 -1
  27. package/templates/commonproject/template/mise.toml.jinja +11 -21
  28. package/contracts/fleet-contract.yaml +0 -584
  29. package/templates/commonproject/template/.mise/scripts/provision-packs.py +0 -587
  30. package/templates/commonproject/template/.mise/scripts/sync-skills.py +0 -2183
  31. package/templates/hermes-agent/copier.yml +0 -186
  32. package/templates/hermes-agent/template/.gitignore.jinja +0 -11
  33. package/templates/hermes-agent/template/.runtime-scaffold/.gitattributes +0 -10
  34. package/templates/hermes-agent/template/.runtime-scaffold/.gitignore.jinja +0 -44
  35. package/templates/hermes-agent/template/.runtime-scaffold/README.md +0 -56
  36. package/templates/hermes-agent/template/.runtime-scaffold/decisions/.gitkeep +0 -2
  37. package/templates/hermes-agent/template/.runtime-scaffold/logs/.gitkeep +0 -1
  38. package/templates/hermes-agent/template/.runtime-scaffold/memories/MEMORY.md +0 -50
  39. package/templates/hermes-agent/template/.runtime-scaffold/memories/USER.md +0 -51
  40. package/templates/hermes-agent/template/.scripts/00-banner.sh +0 -21
  41. package/templates/hermes-agent/template/.scripts/01-config.sh +0 -60
  42. package/templates/hermes-agent/template/.scripts/05-fleet-env.sh +0 -42
  43. package/templates/hermes-agent/template/.scripts/10-hermes-profile.sh +0 -222
  44. package/templates/hermes-agent/template/.scripts/20-runtime-repo.sh +0 -199
  45. package/templates/hermes-agent/template/.scripts/30-telegram.sh +0 -363
  46. package/templates/hermes-agent/template/.scripts/31-slack.sh +0 -457
  47. package/templates/hermes-agent/template/.scripts/40-plane.sh +0 -60
  48. package/templates/hermes-agent/template/.scripts/42-ticket-provider.sh +0 -373
  49. package/templates/hermes-agent/template/.scripts/60-bloodbank.sh +0 -18
  50. package/templates/hermes-agent/template/.scripts/70-systemd.sh +0 -354
  51. package/templates/hermes-agent/template/.scripts/80-registry.sh +0 -185
  52. package/templates/hermes-agent/template/.scripts/99-summary.sh +0 -87
  53. package/templates/hermes-agent/template/.scripts/_lib.sh +0 -1138
  54. package/templates/hermes-agent/template/.scripts/channel-transaction.py +0 -2340
  55. package/templates/hermes-agent/template/.scripts/checkpoint.sh +0 -82
  56. package/templates/hermes-agent/template/.scripts/config.example.toml +0 -70
  57. package/templates/hermes-agent/template/.scripts/credential-launch.sh +0 -85
  58. package/templates/hermes-agent/template/.scripts/heartbeat.sh +0 -283
  59. package/templates/hermes-agent/template/.scripts/lib/fleet-env.sh +0 -202
  60. package/templates/hermes-agent/template/.scripts/lib/parse-fleet-env.py +0 -761
  61. package/templates/hermes-agent/template/.scripts/lib/profile-config-lock.py +0 -182
  62. package/templates/hermes-agent/template/.scripts/lib/profile-config-seed.py +0 -108
  63. package/templates/hermes-agent/template/.scripts/lib/ticket-provider.sh +0 -199
  64. package/templates/hermes-agent/template/.scripts/lib/voice-config.py +0 -546
  65. package/templates/hermes-agent/template/.scripts/lifecycle.sh +0 -126
  66. package/templates/hermes-agent/template/.scripts/momo-wip-lock.py +0 -137
  67. package/templates/hermes-agent/template/.scripts/providers/linear.sh +0 -329
  68. package/templates/hermes-agent/template/.scripts/providers/plane.sh +0 -671
  69. package/templates/hermes-agent/template/.scripts/providers/trello.sh +0 -241
  70. package/templates/hermes-agent/template/.scripts/reporter-watchdog.py +0 -242
  71. package/templates/hermes-agent/template/.scripts/secret-scan.py +0 -134
  72. package/templates/hermes-agent/template/.scripts/sentinel/bin/emit-event.py +0 -106
  73. package/templates/hermes-agent/template/.scripts/sentinel/bin/issue-autonomous-review.sh +0 -339
  74. package/templates/hermes-agent/template/.scripts/sentinel/bin/issue-close-gate.sh +0 -179
  75. package/templates/hermes-agent/template/.scripts/sentinel/docs/autonomous-delegated-review.md +0 -162
  76. package/templates/hermes-agent/template/.scripts/sentinel/docs/bloodbank-events.md +0 -42
  77. package/templates/hermes-agent/template/.scripts/sentinel/docs/continuous-ticket-orchestration.md +0 -77
  78. package/templates/hermes-agent/template/.scripts/sentinel.prompt.md.jinja +0 -116
  79. package/templates/hermes-agent/template/.scripts/store-onepassword-secret.py +0 -260
  80. package/templates/hermes-agent/template/SOUL.md.jinja +0 -197
  81. package/templates/hermes-agent/template/hermes.jinja +0 -109
  82. package/templates/hermes-agent/template/momo.jinja +0 -177
  83. package/templates/hermes-agent/template/role.yaml.jinja +0 -112
@@ -1,584 +0,0 @@
1
- # 33GOD fleet authority and managed-state contract.
2
- #
3
- # DECLARATION ONLY. This file records versions, authority owners,
4
- # one-directional projections, lifecycle classes, the canonical service model,
5
- # the activation gate, and retired modes. It carries no runtime observation, no
6
- # credential, no host secret, and no absolute host path: stores are named by
7
- # the environment keys that resolve them and every variable segment of a field
8
- # path is a {placeholder}.
9
- #
10
- # Field paths are dotted key paths that exist in the live stores today. Roots:
11
- # projects.* PJangler project registry
12
- # agents.* Hermes agent registry, per-agent rows
13
- # gateways.* Hermes agent registry, fleet-shared gateway block
14
- # profiles.* generated Hermes profile tree
15
- # scaffold.* tracked per-agent role scaffold. Each leaf is mapped to the
16
- # role-relative path it owns by `scaffold_manifest.groups`, so
17
- # `scaffold.gitignore` means `.gitignore` and
18
- # `scaffold.sentinel.prompt.md` means `.scripts/sentinel.prompt.md`
19
- # -- the leaves name owned asset GROUPS, not store keys.
20
- # units.* systemd user units
21
- # processes.* observed Hermes processes (read-only)
22
- #
23
- # Namespaced `x-` keys at any depth round-trip verbatim and are never
24
- # interpreted as policy.
25
- #
26
- # `service_model` and `activation` accept keys beyond the required ones on
27
- # purpose: an unknown healthy-mode declaration must reach the retired-mode scan
28
- # rather than be rejected as an unknown key, because rejecting it would hide the
29
- # very drift this contract exists to name.
30
-
31
- schema_version: 3
32
- contract_version: 1.2.0
33
-
34
- compatibility:
35
- min_schema_version: 1
36
- max_schema_version: 3
37
-
38
- x-delonet/provenance:
39
- assessment: fleet-convergence-live-assessment-2026-08-31
40
- epic: registry-wide-fleet-convergence-control-plane
41
-
42
- authorities:
43
- project_identity:
44
- owner: project-registry
45
- store: pjangler-project-registry
46
- store_env:
47
- - PJ_PROJECT_REGISTRY
48
- notes:
49
- - Project identity and project-to-board binding.
50
- - Board provenance fields exist only here, never in the agent registry.
51
- writable_fields:
52
- - projects.{slug}.name
53
- - projects.{slug}.slug
54
- - projects.{slug}.repo_path
55
- - projects.{slug}.description
56
- - projects.{slug}.status
57
- - projects.{slug}.source_artifacts
58
- - projects.{slug}.template
59
- - projects.{slug}.ticket_provider.type
60
- - projects.{slug}.ticket_provider.workspace
61
- - projects.{slug}.ticket_provider.identifier
62
- - projects.{slug}.ticket_provider.identifier_source
63
- - projects.{slug}.ticket_provider.identifier_fetched_at
64
- - projects.{slug}.ticket_provider.board_id
65
- - projects.{slug}.ticket_provider.board_confirmed_at
66
- - projects.{slug}.ticket_provider.board_url
67
- - projects.{slug}.ticket_provider.state
68
- - projects.{slug}.agents.{role}.role
69
- - projects.{slug}.agents.{role}.provisioning_state
70
- - projects.{slug}.agents.{role}.role_dir
71
- - projects.{slug}.automation
72
- - projects.{slug}.notebook
73
- - projects.{slug}.created_at
74
- - projects.{slug}.updated_at
75
-
76
- agent_operational_records:
77
- owner: hermes-agent-registry
78
- store: hermes-agent-registry
79
- store_env:
80
- - HERMES_AGENTS_REGISTRY
81
- - HERMES_FLEET_REGISTRY_FILE
82
- notes:
83
- - Operational agent, profile, and routing records.
84
- - The two store_env keys disagree today. The TypeScript reader honours
85
- HERMES_AGENTS_REGISTRY, the shell provisioner honours
86
- HERMES_FLEET_REGISTRY_FILE. Both are recorded so convergence is a
87
- declared task, not a silent surprise.
88
- - Bloodbank routing metadata is discovery, not execution authority. The
89
- single activation flag lives under the bloodbank_activation authority.
90
- writable_fields:
91
- - agents.{agent_id}.repo
92
- - agents.{agent_id}.role
93
- - agents.{agent_id}.display_name
94
- - agents.{agent_id}.project_path
95
- - agents.{agent_id}.role_dir
96
- - agents.{agent_id}.profile_name
97
- - agents.{agent_id}.provisioned_at
98
- - agents.{agent_id}.runtime_repo
99
- - agents.{agent_id}.telegram.provisioning_status
100
- - agents.{agent_id}.slack.provisioning_status
101
- - agents.{agent_id}.bloodbank.gateway_scope
102
- - agents.{agent_id}.bloodbank.target_agent_id
103
- - agents.{agent_id}.hermes.bin
104
- - agents.{agent_id}.hermes.repo
105
- - agents.{agent_id}.hermes.git_url
106
- - agents.{agent_id}.hermes.git_ref
107
- - agents.{agent_id}.hermes.git_sha
108
- - agents.{agent_id}.hermes.fleet_env
109
- - gateways.bloodbank.scope
110
- - gateways.bloodbank.profile_name
111
- - gateways.bloodbank.command_subject
112
- - gateways.bloodbank.target_field
113
- - gateways.bloodbank.systemd_unit
114
-
115
- board_identity_projection:
116
- owner: project-registry
117
- store: hermes-agent-registry
118
- store_env:
119
- - HERMES_AGENTS_REGISTRY
120
- - HERMES_FLEET_REGISTRY_FILE
121
- notes:
122
- - The one cross-store write that actually happens today. `pj project
123
- identity --apply` copies confirmed board identity from the project
124
- registry into the agent registry.
125
- - Held as its own block so the agent registry's own writers cannot claim
126
- these fields, and so the projections that target them have something
127
- real to point at.
128
- writable_fields:
129
- - agents.{agent_id}.plane.workspace
130
- - agents.{agent_id}.plane.project_id
131
- - agents.{agent_id}.plane.identifier
132
-
133
- generated_profile_inputs:
134
- owner: hermes-profile-renderer
135
- store: hermes-profile-tree
136
- store_env:
137
- - HERMES_FLEET_HOME
138
- notes:
139
- - config.yaml is generated by deep-merging the shared base with the
140
- per-profile config.delta.yaml. It is never hand-edited.
141
- - The rest of config.delta.yaml is the operator-owned override SSOT. Only
142
- the three fleet-owned dotted paths listed here are rewritten by the
143
- renderer.
144
- writable_fields:
145
- - profiles.{profile_name}.config.yaml
146
- - profiles.{profile_name}.config.delta.memory.provider
147
- - profiles.{profile_name}.config.delta.memory.memory_enabled
148
- - profiles.{profile_name}.config.delta.memory.user_profile_enabled
149
-
150
- tracked_role_scaffold:
151
- owner: hermes-agent-template
152
- store: hermes-agent-role-scaffold
153
- store_env:
154
- - HERMES_TEMPLATE_RUNTIME_SCAFFOLD
155
- - RUNTIME_SCAFFOLD_DIR
156
- notes:
157
- - The committed template at its pinned gitlink owns every tracked asset in
158
- a per-agent role directory. Role-local runtime bytes are ignored and are
159
- owned by nobody.
160
- writable_fields:
161
- - scaffold.role.yaml
162
- - scaffold.SOUL.md
163
- - scaffold.hermes
164
- - scaffold.momo
165
- - scaffold.sentinel.prompt.md
166
- - scaffold.gitignore
167
- - scaffold.scripts
168
- - scaffold.runtime-scaffold
169
-
170
- systemd_lifecycle:
171
- owner: hermes-fleet-provisioner
172
- store: systemd-user-manager
173
- store_env:
174
- - XDG_CONFIG_HOME
175
- notes:
176
- - Unit files and the registry rows that name them are written by the
177
- provisioner, not by registry editing paths.
178
- writable_fields:
179
- - units.hermes-{agent_id}-gateway.service
180
- - units.hermes-{agent_id}-heartbeat.service
181
- - units.hermes-{agent_id}-heartbeat.timer
182
- - units.hermes-fleet-bloodbank-gateway.service
183
- - agents.{agent_id}.systemd.gateway_unit
184
- - agents.{agent_id}.systemd.heartbeat_timer
185
-
186
- live_process_observations:
187
- owner: fleet-observer
188
- store: process-table
189
- store_env: []
190
- read_only: true
191
- notes:
192
- - Observation only. A process is attributed and classified; it is never
193
- written to, and a drain is a separately authorized effect owned by a
194
- later story.
195
- writable_fields: []
196
-
197
- bloodbank_activation:
198
- owner: hermes-agent-registry
199
- store: hermes-agent-registry
200
- store_env:
201
- - HERMES_AGENTS_REGISTRY
202
- - HERMES_FLEET_REGISTRY_FILE
203
- notes:
204
- - The single field that can grant execution authority. Held apart from the
205
- operational records so discovery can never widen into dispatch.
206
- writable_fields:
207
- - agents.{agent_id}.bloodbank.enabled
208
-
209
- projections:
210
- - field: project_repository_path
211
- source: projects.{slug}.repo_path
212
- target: agents.{agent_id}.project_path
213
- direction: pjangler_project_registry_to_hermes_agent_registry
214
- writable_by: hermes-agent-registry
215
-
216
- - field: project_slug
217
- source: projects.{slug}.slug
218
- target: agents.{agent_id}.repo
219
- direction: pjangler_project_registry_to_hermes_agent_registry
220
- writable_by: hermes-agent-registry
221
-
222
- - field: board_identifier
223
- source: projects.{slug}.ticket_provider.identifier
224
- target: agents.{agent_id}.plane.identifier
225
- direction: pjangler_project_registry_to_hermes_agent_registry
226
- writable_by: project-registry
227
-
228
- - field: board_id
229
- source: projects.{slug}.ticket_provider.board_id
230
- target: agents.{agent_id}.plane.project_id
231
- direction: pjangler_project_registry_to_hermes_agent_registry
232
- writable_by: project-registry
233
-
234
- - field: board_workspace
235
- source: projects.{slug}.ticket_provider.workspace
236
- target: agents.{agent_id}.plane.workspace
237
- direction: pjangler_project_registry_to_hermes_agent_registry
238
- writable_by: project-registry
239
-
240
- - field: agent_role_directory
241
- source: agents.{agent_id}.role_dir
242
- target: projects.{slug}.agents.{role}.role_dir
243
- direction: hermes_agent_registry_to_pjangler_project_registry
244
- writable_by: project-registry
245
-
246
- classifications:
247
- managed_agent:
248
- notes:
249
- - A registered agent row. Instances are registry rows, not contract
250
- entries, so this class declares its required shape and carries none.
251
- required_fields:
252
- - id
253
- - kind
254
- - owner
255
- - source
256
- - lifecycle_state
257
- entries: []
258
-
259
- managed_shared_service:
260
- notes:
261
- - Shared or specialist fleet state that is deliberately managed but is not
262
- a per-agent row.
263
- required_fields:
264
- - id
265
- - kind
266
- - owner
267
- - source
268
- - lifecycle_state
269
- - rationale
270
- - policy_domains
271
- entries:
272
- - id: fleet-bloodbank-gateway
273
- kind: shared-service
274
- owner: hermes-fleet-provisioner
275
- source: gateways.bloodbank
276
- lifecycle_state: managed
277
- rationale: One shared gateway owns Bloodbank command ingress fleet-wide.
278
- policy_domains:
279
- - systemd
280
- - bloodbank
281
- - profile
282
- - id: fleet-shared-profile-base
283
- kind: shared-config
284
- owner: hermes-profile-renderer
285
- source: profiles.base.config.yaml
286
- lifecycle_state: managed
287
- rationale: Every generated profile config is a merge of this base.
288
- policy_domains:
289
- - profile
290
-
291
- intentionally_unmanaged:
292
- notes:
293
- - State an operator has decided the control plane must observe, report,
294
- and leave alone. Instances are recorded when an observation is
295
- classified; nothing is declared up front.
296
- required_fields:
297
- - id
298
- - kind
299
- - owner
300
- - source
301
- - lifecycle_state
302
- - rationale
303
- - policy_domains
304
- entries: []
305
-
306
- retired:
307
- notes:
308
- - Drift that used to be a supported mode. The retired block below is the
309
- authoritative list; entries here are per-instance sightings.
310
- required_fields:
311
- - id
312
- - kind
313
- - owner
314
- - source
315
- - lifecycle_state
316
- - rationale
317
- - policy_domains
318
- entries: []
319
-
320
- unclassified:
321
- notes:
322
- - The default for anything observed that no rule above claims. It is a
323
- finding for an operator, never a licence to delete.
324
- required_fields:
325
- - id
326
- - kind
327
- - owner
328
- - source
329
- - lifecycle_state
330
- - rationale
331
- - policy_domains
332
- entries: []
333
-
334
- service_model:
335
- per_agent:
336
- gateway_unit: hermes-{agent_id}-gateway.service
337
- heartbeat_service: hermes-{agent_id}-heartbeat.service
338
- heartbeat_timer: hermes-{agent_id}-heartbeat.timer
339
- fleet_shared:
340
- bloodbank_gateway_unit: hermes-fleet-bloodbank-gateway.service
341
- bloodbank_gateway_profile: fleet-bloodbank-gateway
342
- command_subject: bloodbank.cmd.agent.invocation.start
343
- target_field: data.target_agent_id
344
- profile_layout:
345
- root: "{HERMES_FLEET_HOME}/profiles/{profile_name}"
346
- symlink_allowed: false
347
- identity_file: profile.yaml
348
- override_file: config.delta.yaml
349
- generated_file: config.yaml
350
- generated_marker: GENERATED FILE -- DO NOT EDIT
351
-
352
- # Which gaps are AUTHORIZED, and nothing else.
353
- #
354
- # Optional, and schema 1 contracts that omit it still load. What it changes is
355
- # what an aggregate may CLAIM: a skip, a warning, a deferred capability, or a
356
- # managed exception is "justified" only if it is named here, and anything
357
- # unjustified keeps the fleet from claiming proof. Nothing in this block grants
358
- # a capability, relaxes the activation gate, or turns an observation into a
359
- # pass -- an authorized gap is still reported with its own state.
360
- health_policy:
361
- # Domains an aggregate must have observed before it may claim proof. All nine
362
- # are required; the deferred_capabilities below are what carve out the halves
363
- # no adapter exists for in this release.
364
- required_domains:
365
- - registry
366
- - project_binding
367
- - template_scaffold
368
- - profile
369
- - runtime
370
- - systemd
371
- - live_process
372
- - bloodbank
373
- - release_provenance
374
-
375
- # A capability no observer in this release can answer, and the story that owns
376
- # it. Each entry authorizes ONE unsupported answer; it never authorizes
377
- # inferring the answer from something else.
378
- deferred_capabilities:
379
- - domain: systemd
380
- capability: unit_topology
381
- reason: >-
382
- No systemd observer exists in this release. The unit names reported for
383
- an agent are the patterns service_model.per_agent derives, carried as
384
- expectations and never as observations of the user manager.
385
- owner_story: "1.8"
386
- - domain: live_process
387
- capability: process_attribution
388
- reason: >-
389
- No process observer exists in this release: nothing in the build reads
390
- the process table, so no running Hermes process can be attributed to a
391
- registry row or classified as sprawl.
392
- owner_story: "1.9"
393
- - domain: bloodbank
394
- capability: routing_liveness
395
- reason: >-
396
- The stored routing record is observed; whether the fleet-shared gateway
397
- can dispatch to it is not. Routing readiness is a separate authority
398
- from the record and must never be inferred from it.
399
- owner_story: "1.10"
400
- - domain: release_provenance
401
- capability: profile.render_generation
402
- reason: >-
403
- A generated profile config carries only the generated-file marker. The
404
- renderer records no generation identity, so nothing comparable exists
405
- until generated profile health is proven.
406
- owner_story: "1.7"
407
- - domain: release_provenance
408
- capability: fleet.registry_file
409
- reason: >-
410
- The host config names the agent registry through an unexpanded shell
411
- variable and this control plane must not resolve one. It is the same
412
- declared divergence the agent_operational_records authority records in
413
- its two store_env keys.
414
- owner_story: "1.1"
415
-
416
- # A rule whose warn is upstream cadence rather than fleet drift.
417
- allowed_warnings:
418
- - rule_id: bmad.version
419
- reason: >-
420
- A currency check against the published BMAD release, cached for an hour
421
- and degraded to a skip offline. A newer upstream release is upstream
422
- cadence, not drift in this fleet.
423
- owner: bmad-method
424
-
425
- # A rule or domain whose skip is a deliberate property of a read-only default
426
- # run rather than an observation nobody got round to.
427
- allowed_skips:
428
- - rule_id: notebook.remote-notebook
429
- reason: >-
430
- A default audit makes no network request, so remote notebook state is
431
- not applicable to it.
432
- - rule_id: notebook.overview-note
433
- reason: >-
434
- A default audit makes no network request, so the remote Overview note is
435
- not applicable to it.
436
- - rule_id: notebook.skill-installed
437
- reason: >-
438
- A default audit reads no global path, so the host skill projection is
439
- not applicable to it.
440
- - rule_id: notebook.hooks-projected
441
- reason: >-
442
- A default audit reads no global settings file, so the host hook
443
- projection is not applicable to it.
444
-
445
- # How long a recorded timestamp may go unrefreshed before the value it stamps
446
- # stops counting as current evidence. Reported as a BUCKET and never as an
447
- # age: an age in seconds would make two runs over unchanged state differ.
448
- freshness:
449
- - field: projects.{slug}.ticket_provider.board_confirmed_at
450
- max_age_days: 180
451
- applies_to: project_binding
452
- - field: projects.{slug}.ticket_provider.identifier_fetched_at
453
- max_age_days: 180
454
- applies_to: project_binding
455
- - field: agents.{agent_id}.provisioned_at
456
- max_age_days: 365
457
- applies_to: registry
458
-
459
- # An operator's ruling on ONE agent's drift in ONE domain. The drifted
460
- # observation is still reported and still `fail`; what changes is that the
461
- # agent is counted `exception` rather than `unhealthy`, exactly as a permitted
462
- # identity conflict is. Ships empty on purpose: a ruling is written here when
463
- # it is made, never inferred.
464
- agent_exceptions: []
465
-
466
- # What a deployed role directory SHOULD contain, as POLICY about the tracked
467
- # template rather than a copy of it.
468
- #
469
- # The bytes come from git at the gitlink the parent repository has COMMITTED for
470
- # `template_submodule` -- never from the submodule worktree, never from a
471
- # sibling clone, never from a branch tip. This block says how to read that
472
- # tree: which subdirectory holds the rendered files, how a rendered file is
473
- # named, which registry fields feed each simple `{{ name }}` placeholder, which
474
- # `scaffold.*` writable leaf owns each role-relative path, which assets are
475
- # compared for presence only (and why), what must never appear in the tree,
476
- # and which role-local directory is ignored runtime state nobody owns.
477
- scaffold_manifest:
478
- template_submodule: templates/hermes-agent
479
- template_subdirectory: template
480
- render_suffix: .jinja
481
- # Placeholder name -> the field that feeds it. Only simple substitution is
482
- # rendered; a template that needs control flow or a filter in a
483
- # content-compared asset is `incomplete`, never rendered "as best it can".
484
- render_inputs:
485
- agent_id: agents.{agent_id}
486
- role: agents.{agent_id}.role
487
- target_repo: agents.{agent_id}.repo
488
- display_name: agents.{agent_id}.display_name
489
- ticket_provider: projects.{slug}.ticket_provider.type
490
- # Declared leaf -> the role-relative path it owns. A trailing `/` owns a
491
- # directory; longest prefix wins, so the rendered sentinel prompt inside the
492
- # verbatim `.scripts/` tree has its own leaf. Every key is a writable field of
493
- # `authorities.tracked_role_scaffold`, which is what makes those eight leaves
494
- # real paths rather than invented ones.
495
- groups:
496
- scaffold.role.yaml: role.yaml
497
- scaffold.SOUL.md: SOUL.md
498
- scaffold.hermes: hermes
499
- scaffold.momo: momo
500
- scaffold.sentinel.prompt.md: .scripts/sentinel.prompt.md
501
- scaffold.gitignore: .gitignore
502
- scaffold.scripts: .scripts/
503
- scaffold.runtime-scaffold: .runtime-scaffold/
504
- # Compared for type and mode only. Policy, with a reason each, never a
505
- # shortcut: any OTHER control-flow template is reported incomplete.
506
- presence_only:
507
- - path: role.yaml
508
- reason: >-
509
- Rendered with strftime and rewritten by deployment state (verified
510
- channel identities, operator choices); Copier itself skips it when it
511
- exists.
512
- - path: SOUL.md
513
- reason: >-
514
- The operator's persona for the agent. The fanout writes it only when
515
- absent, so its content is the operator's, not the template's.
516
- # Never allowed in the tree at the gitlink. Matching a tracked file in a role
517
- # directory makes it `unexpected-owned`; matching a template path makes the
518
- # source `source-contaminated`.
519
- excluded_patterns:
520
- - "__pycache__/"
521
- - "*.pyc"
522
- - "*.pyo"
523
- - "*.log"
524
- - ".done-*"
525
- - ".last-run"
526
- - ".provision.log"
527
- - ".plane-project-id"
528
- - ".DS_Store"
529
- # Ignored role-local runtime. Never compared, never named, never proposed
530
- # for deletion; owned by nobody.
531
- runtime_dir: runtime
532
-
533
- activation:
534
- states:
535
- - discovered
536
- - installed
537
- - healthy
538
- - routing_ready
539
- - activated
540
- execution_authority:
541
- field: agents.{agent_id}.bloodbank.enabled
542
- owner: hermes-agent-registry
543
- strict: true
544
- default: deny
545
- routing_prerequisites:
546
- - field: agents.{agent_id}.bloodbank.gateway_scope
547
- constraint: equals-fleet
548
- - field: agents.{agent_id}.bloodbank.target_agent_id
549
- constraint: equals-agent-id
550
- - field: agents.{agent_id}.profile_name
551
- constraint: nonblank
552
-
553
- retired:
554
- - id: per-agent-bloodbank-consumer
555
- reason: A per-agent consumer races the shared gateway and duplicates work.
556
- superseded_by: service_model.fleet_shared.bloodbank_gateway_unit
557
- detect:
558
- - '-consumer\.service'
559
- - 'consumer_unit'
560
- - id: per-agent-checkpoint-timer
561
- reason: Checkpoint-only ticks proved liveness without proving health.
562
- superseded_by: service_model.per_agent.heartbeat_timer
563
- detect:
564
- - '-checkpoint\.timer'
565
- - 'checkpoint_timer'
566
- - id: n8n-owned-truth
567
- reason: Orchestration may consume fleet APIs but may not own fleet truth.
568
- superseded_by: authorities.agent_operational_records
569
- detect:
570
- - 'n8n'
571
- - id: activation-by-discovery
572
- reason: A resolvable target is not permission to dispatch to it.
573
- superseded_by: activation.execution_authority
574
- detect:
575
- - 'activation_by_discovery'
576
- - 'auto_activate'
577
- - 'activate_on_discovery'
578
- - id: hard-coded-hermes-checkout-path
579
- reason: Pinned releases are resolved from the registry, never from a path.
580
- superseded_by: authorities.agent_operational_records
581
- detect:
582
- - '\$HOME/[^\s]*hermes'
583
- - '~/[^\s]*hermes'
584
- - '(?:^|/)code/hermes-agent'