@ours.network/fleet 1.1.0-nightly.21 → 1.1.0-nightly.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -517,6 +517,15 @@ ours-fleet task create --title "Reviewed change" --template pair
517
517
  ours-fleet task create --title "Phased delivery" --template team
518
518
  ```
519
519
 
520
+ The default `team` gives only its LocalCoordinator Agent Template a 15-minute
521
+ continuity loop. Each idle-only pass uses authenticated assigned-room evidence,
522
+ posts at most one missing interval update or status request, and reports `STALLED`
523
+ only after concrete stopped/blocked evidence or the role's documented request/ETA
524
+ window. Stable history/checkpoint fingerprints suppress duplicates; `single` and
525
+ `pair` remain loop-free. This preset does not widen permissions: task planning and
526
+ launch still fail closed when the selected harness cannot supply the configured
527
+ unattended messaging and checkpoint capabilities.
528
+
520
529
  `ours-fleet init -c /path/custom.yaml` reviews the literal resolved manifest and
521
530
  `/path/custom/` split directory before doing anything. It requires a TTY and two
522
531
  default-No confirmations. You select Codex, Claude, or both; then either one explicit
@@ -547,11 +556,12 @@ task-local `LocalCoordinator`, `Developer`, and `Critic`. The persistent
547
556
  `FleetCoordinator` uses the separate packaged `Coordinator` contract and coordination
548
557
  model.
549
558
 
550
- Revision-3 role defaults have an explicit fail-closed adoption command: first run
559
+ Revision-3 role defaults and exact revision-4 LocalCoordinator/team defaults have an
560
+ explicit fail-closed adoption command: first run
551
561
  `ours-fleet migrate-role-defaults -c FILE` for a zero-write plan, review every removal,
552
562
  replacement, addition, preserved custom file, staging path, and recovery path, then rerun
553
563
  with `--write`. Only exact semantic matches for packaged-bootstrap and generated
554
- revision-3 forms are changed; same-named customized files remain byte-identical, and a
564
+ revision-3/4 forms are changed; same-named customized files remain byte-identical, and a
555
565
  dangling custom reference refuses publication. Rerunning the migration is a no-op.
556
566
 
557
567
  For manual adoption of a single newer packaged file, copy the reported source beside the
@@ -1,9 +1,9 @@
1
1
  {
2
- "version": "1.1.0-nightly.21",
3
- "buildId": "32d8b887e2f4",
4
- "commit": "a56b31845896d4c26d6c9488f276a2e3ba644834",
2
+ "version": "1.1.0-nightly.22",
3
+ "buildId": "bfb51e6ced00",
4
+ "commit": "5447c29d81481c7880fa9cf5bfbbcc2ff294950f",
5
5
  "dirty": true,
6
- "builtAt": "2026-09-01T14:48:16.620Z",
6
+ "builtAt": "2026-09-01T19:41:56.761Z",
7
7
  "capabilities": [
8
8
  "monitor.interrupt.after_tool"
9
9
  ]
@@ -31,7 +31,7 @@ interface MigrationHooks {
31
31
  beforeLockClaim?: () => void;
32
32
  beforeRoleDefaultPublish?: () => void;
33
33
  }
34
- /** Explicit adoption of exact packaged revision-3 role defaults; customized files are never changed. */
34
+ /** Explicit adoption of exact packaged revision-3/4 role defaults; customized files are never changed. */
35
35
  export declare function migratePackagedRoleDefaults(configuration: string, options?: {
36
36
  write?: boolean;
37
37
  }, hooks?: MigrationHooks): RoleDefaultMigrationResult;
@@ -44,7 +44,14 @@ const V3_GENERATED_ROLE_DEFAULT_FINGERPRINTS = Object.freeze({
44
44
  'agent_templates/Tester.yaml': '3733db187951353f855dc998f1dd1f66d883eb556a3e6431a7abf4e267f63071',
45
45
  'agents/FleetCoordinator.yaml': '70f90797899828c3669c3914e8f873314e48cb9502aff187d2f1fbc9177f6df9',
46
46
  });
47
- const V4_ROLE_DEFAULTS = new Set([
47
+ const V4_ROLE_DEFAULT_FINGERPRINTS = Object.freeze({
48
+ 'agent_templates/LocalCoordinator.yaml': 'f04a88b541e655e0039e4dc9834293b5180f6d488a473a6c51b50d0b72dae83b',
49
+ 'room_templates/team.yaml': 'accaa3569781f7acde3f15c89f447f4132f580f936513379c704aad27481e13f',
50
+ });
51
+ const V4_GENERATED_ROLE_DEFAULT_FINGERPRINTS = Object.freeze({
52
+ 'agent_templates/LocalCoordinator.yaml': 'cb7c83a835dde9d45bac42cadce2f196f561d2460321c690cdef435f7076f97f',
53
+ });
54
+ const V5_ROLE_DEFAULTS = new Set([
48
55
  'roles/Coordinator.yaml', 'roles/LocalCoordinator.yaml', 'roles/Developer.yaml', 'roles/Critic.yaml',
49
56
  'agent_templates/LocalCoordinator.yaml', 'agent_templates/Developer.yaml', 'agent_templates/Critic.yaml',
50
57
  'room_templates/single.yaml', 'room_templates/pair.yaml', 'room_templates/team.yaml',
@@ -145,7 +152,7 @@ function validateRoleDefaultMigration(stageManifest) {
145
152
  throw new Error(`Room Template '${template.name}' references missing Agent Template '${member.agent_template}'`);
146
153
  }
147
154
  }
148
- /** Explicit adoption of exact packaged revision-3 role defaults; customized files are never changed. */
155
+ /** Explicit adoption of exact packaged revision-3/4 role defaults; customized files are never changed. */
149
156
  export function migratePackagedRoleDefaults(configuration, options = {}, hooks = {}) {
150
157
  const configPath = resolve(configuration);
151
158
  const root = splitRootFor(configPath);
@@ -166,18 +173,28 @@ export function migratePackagedRoleDefaults(configuration, options = {}, hooks =
166
173
  const removals = [];
167
174
  const replacements = [];
168
175
  const preserved = [];
169
- for (const [relative, expected] of Object.entries(V3_ROLE_DEFAULT_FINGERPRINTS)) {
176
+ const known = new Set([
177
+ ...Object.keys(V3_ROLE_DEFAULT_FINGERPRINTS),
178
+ ...Object.keys(V4_ROLE_DEFAULT_FINGERPRINTS),
179
+ ]);
180
+ for (const relative of known) {
170
181
  const path = join(root, relative);
171
182
  if (!existsSync(path))
172
183
  continue;
173
184
  const actual = fingerprint(path);
174
- if (actual === expected || actual === V3_GENERATED_ROLE_DEFAULT_FINGERPRINTS[relative])
175
- (V4_ROLE_DEFAULTS.has(relative) ? replacements : removals).push(path);
185
+ const recognized = [
186
+ V3_ROLE_DEFAULT_FINGERPRINTS[relative],
187
+ V3_GENERATED_ROLE_DEFAULT_FINGERPRINTS[relative],
188
+ V4_ROLE_DEFAULT_FINGERPRINTS[relative],
189
+ V4_GENERATED_ROLE_DEFAULT_FINGERPRINTS[relative],
190
+ ].some(expected => expected !== undefined && actual === expected);
191
+ if (recognized)
192
+ (V5_ROLE_DEFAULTS.has(relative) ? replacements : removals).push(path);
176
193
  else
177
194
  preserved.push(path);
178
195
  }
179
196
  const additions = [];
180
- for (const relative of V4_ROLE_DEFAULTS) {
197
+ for (const relative of V5_ROLE_DEFAULTS) {
181
198
  const path = join(root, relative);
182
199
  if (!existsSync(path))
183
200
  additions.push(path);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ours.network/fleet",
3
- "version": "1.1.0-nightly.21",
3
+ "version": "1.1.0-nightly.22",
4
4
  "description": "Harness-agnostic fleet of persistent, identity-bound AI agents. Declarative fleet.yaml, managed native/ACP sessions, supervision, and ours.network messaging.",
5
5
  "type": "module",
6
6
  "license": "FSL-1.1-Apache-2.0",
@@ -2,3 +2,48 @@ role: { ref: LocalCoordinator }
2
2
  brain: { ref: claude-default }
3
3
  coordinator: FleetCoordinator
4
4
  permissions: { approval: ask, filesystem: workspace, unattended: deny }
5
+ loops:
6
+ continuity:
7
+ interval: 15m
8
+ prompt: |
9
+ Perform one bounded, observation-only continuity pass for the assigned task room. Do not modify
10
+ task or project state; the only permitted writes are the room action and secret-free WORKLOG
11
+ checkpoint defined below. Anchor the preceding interval to scheduled_at minus 15 minutes
12
+ through scheduled_at. A late start or missed-loop metadata describes this loop's outage, not
13
+ evidence that development froze.
14
+
15
+ Re-read ROUTINES.md when present and the continuity checkpoint in WORKLOG.md. Use bounded
16
+ `list_history` reads filtered to the assigned room CID and direction as needed. Do not drain
17
+ unread mail or mark unrelated mail read. Ignore unrelated contacts and private messages.
18
+ Use only attributable room/task evidence. Exclude loop-authored `CONTINUITY *` messages from
19
+ development evidence and fingerprint inputs; retain their request/report IDs separately for
20
+ dedupe. Lifecycle state `active`, elapsed time, silence, task difficulty, and filesystem
21
+ dirtiness alone do not prove development is active, meaningful progress, or a stall. Meaningful
22
+ progress is a concrete reported change, test result, decision, handoff, blocker delta, active
23
+ step, or unexpired ETA.
24
+
25
+ After a mandatory final history recheck, choose exactly one mutually exclusive branch:
26
+ - Terminal: if attributable evidence says the task is terminal, do nothing.
27
+ - Recent update: if the room already has a meaningful update in the interval, do nothing.
28
+ - Ongoing: if attributable development evidence is ongoing but the room has no meaningful
29
+ update in the interval, send at most one concise
30
+ `CONTINUITY ACTIVE [start..end]: <observed facts>; next=<known step or ETA>` update.
31
+ - Unobservable/no evidence: never invent activity. If no qualifying outstanding continuity
32
+ request exists, send one direct `CONTINUITY CHECK` request for status, next step, and ETA.
33
+ If the prior request is less than 10 minutes old or its ETA is unexpired, do nothing. If it
34
+ is at least 10 minutes old, no later meaningful evidence exists, and the ETA is absent or
35
+ elapsed, send at most one clear `CONTINUITY STALLED` report.
36
+ - Explicit stop: if attributable evidence says work stopped or is blocked with no active next
37
+ step, send at most one clear `CONTINUITY STALLED` report.
38
+
39
+ Before any send, suppress a semantic duplicate found by the final history recheck or checkpoint;
40
+ room history wins if they disagree. Build the stable fingerprint from classification and
41
+ non-loop evidence IDs/timestamps plus requested/reported state, excluding loop-authored
42
+ continuity messages, prose, and time-of-check so unchanged classification and evidence state
43
+ stay silent. Store continuity request/report IDs separately. Later meaningful progress resets
44
+ a prior request or stall. Append a secret-free WORKLOG checkpoint with interval, classification,
45
+ evidence IDs/times, fingerprint, and any separate request/report ID.
46
+
47
+ Do not edit project files, run implementation or tests, interrupt peers, spawn or manage agents,
48
+ invoke task/room lifecycle actions, infer from unrelated messages, or exceed LocalCoordinator
49
+ authority. Complete silently when no room action is required.
@@ -3,6 +3,7 @@ description: "Locally coordinated team: LocalCoordinator sequences, Developer ex
3
3
  room: { quiet_membership: false, anonymous: false }
4
4
  contract: |
5
5
  LocalCoordinator coordinates sequencing, handoffs, context, and blockers among existing members.
6
+ LocalCoordinator performs a bounded 15-minute continuity check without taking over implementation.
6
7
  Developer owns implementation and verification evidence.
7
8
  Critic independently reviews and withholds sign-off on material failures.
8
9
  LocalCoordinator has no Fleet lifecycle or agent-management authority.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schema_version": 1,
3
- "preset_revision": 4,
3
+ "preset_revision": 5,
4
4
  "brain_catalog_revision": 1,
5
5
  "description": "ours-fleet standard configuration presets"
6
6
  }