@pennixrv/trellis 0.6.28 → 0.6.29

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 (38) hide show
  1. package/dist/commands/channel/agent-loader.d.ts +3 -1
  2. package/dist/commands/channel/agent-loader.d.ts.map +1 -1
  3. package/dist/commands/channel/agent-loader.js +32 -1
  4. package/dist/commands/channel/agent-loader.js.map +1 -1
  5. package/dist/commands/channel/guard.d.ts +21 -2
  6. package/dist/commands/channel/guard.d.ts.map +1 -1
  7. package/dist/commands/channel/guard.js +105 -4
  8. package/dist/commands/channel/guard.js.map +1 -1
  9. package/dist/commands/channel/index.d.ts.map +1 -1
  10. package/dist/commands/channel/index.js +22 -5
  11. package/dist/commands/channel/index.js.map +1 -1
  12. package/dist/commands/channel/run.d.ts.map +1 -1
  13. package/dist/commands/channel/run.js +15 -9
  14. package/dist/commands/channel/run.js.map +1 -1
  15. package/dist/commands/channel/spawn.d.ts +4 -0
  16. package/dist/commands/channel/spawn.d.ts.map +1 -1
  17. package/dist/commands/channel/spawn.js +59 -7
  18. package/dist/commands/channel/spawn.js.map +1 -1
  19. package/dist/commands/channel/workers.d.ts +8 -0
  20. package/dist/commands/channel/workers.d.ts.map +1 -0
  21. package/dist/commands/channel/workers.js +30 -0
  22. package/dist/commands/channel/workers.js.map +1 -0
  23. package/dist/migrations/manifests/0.6.28.json +9 -0
  24. package/dist/migrations/manifests/0.6.29.json +9 -0
  25. package/dist/templates/common/bundled-skills/trellis-channel/references/command-reference.md +23 -4
  26. package/dist/templates/common/bundled-skills/trellis-channel/references/subnode-work.md +37 -8
  27. package/dist/templates/common/bundled-skills/trellis-channel/references/workers.md +25 -6
  28. package/dist/templates/common/bundled-skills/trellis-meta/SKILL.md +2 -2
  29. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/multi-agent-channel.md +2 -1
  30. package/dist/templates/trellis/agents/subnode.env +4 -0
  31. package/dist/templates/trellis/agents/subnode.md +5 -0
  32. package/dist/templates/trellis/config.yaml +9 -1
  33. package/dist/templates/trellis/index.d.ts +4 -3
  34. package/dist/templates/trellis/index.d.ts.map +1 -1
  35. package/dist/templates/trellis/index.js +5 -3
  36. package/dist/templates/trellis/index.js.map +1 -1
  37. package/dist/templates/trellis/scripts/subnode_artifact.py +100 -1
  38. package/package.json +2 -2
@@ -14,13 +14,25 @@ import fs from "node:fs";
14
14
  import { createChannel } from "./create.js";
15
15
  import { channelRm } from "./rm.js";
16
16
  import { channelSend } from "./send.js";
17
- import { channelSpawn } from "./spawn.js";
17
+ import { applySubnodeSupervisorDefaults, channelSpawn } from "./spawn.js";
18
18
  import { channelDir, eventsPath } from "./store/paths.js";
19
19
  import { readLastSeq } from "./store/events.js";
20
20
  import { watchEvents } from "./store/watch.js";
21
21
  export async function channelRun(opts) {
22
22
  const name = opts.name ?? `run-${crypto.randomBytes(4).toString("hex")}`;
23
- const timeoutMs = opts.timeoutMs ?? 5 * 60 * 1000;
23
+ // Keep the ordinary one-shot default at five minutes while letting an
24
+ // explicitly selected subnode role use its project dispatch default.
25
+ const spawnOptions = applySubnodeSupervisorDefaults({
26
+ agent: opts.agent,
27
+ provider: opts.provider,
28
+ as: opts.as,
29
+ cwd: opts.cwd,
30
+ model: opts.model,
31
+ ...(opts.timeoutMs !== undefined ? { timeoutMs: opts.timeoutMs } : {}),
32
+ files: opts.files,
33
+ jsonls: opts.jsonls,
34
+ });
35
+ const timeoutMs = spawnOptions.timeoutMs ?? 5 * 60 * 1000;
24
36
  await createChannel(name, {
25
37
  by: "main",
26
38
  cwd: opts.cwd,
@@ -34,14 +46,8 @@ export async function channelRun(opts) {
34
46
  let succeeded = false;
35
47
  try {
36
48
  const spawned = await channelSpawn(name, {
37
- agent: opts.agent,
38
- provider: opts.provider,
39
- as: opts.as,
40
- cwd: opts.cwd,
41
- model: opts.model,
49
+ ...spawnOptions,
42
50
  timeoutMs,
43
- files: opts.files,
44
- jsonls: opts.jsonls,
45
51
  });
46
52
  workerName = spawned.worker;
47
53
  await channelSend(name, {
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/commands/channel/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,SAAS,CAAC;AAGzB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAqB,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAmB/C,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAgB;IAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,OAAO,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;IACzE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;IAElD,MAAM,aAAa,CAAC,IAAI,EAAE;QACxB,EAAE,EAAE,MAAM;QACV,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,SAAS,EAAE,IAAI;QACf,MAAM,EAAE,KAAK;KACd,CAAC,CAAC;IAEH,2EAA2E;IAC3E,2EAA2E;IAC3E,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;IAEzC,IAAI,UAAU,GAAkB,IAAI,CAAC;IACrC,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE;YACvC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS;YACT,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC;QACH,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;QAE5B,MAAM,WAAW,CAAC,IAAI,EAAE;YACtB,EAAE,EAAE,MAAM;YACV,EAAE,EAAE,UAAU;YACd,IAAI,EAAE,IAAI,CAAC,OAAO;YAClB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC,CAAC;QAEH,MAAM,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QACzD,MAAM,iBAAiB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAC1C,SAAS,GAAG,IAAI,CAAC;IACnB,CAAC;YAAS,CAAC;QACT,IAAI,SAAS,EAAE,CAAC;YACd,kDAAkD;YAClD,MAAM,SAAS,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,uEAAuE;YACvE,8DAA8D;YAC9D,mDAAmD;YACnD,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;YAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,gCAAgC,GAAG,IAAI;gBACrC,kEAAkE,CACrE,CAAC;YACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,WAAW,CACxB,WAAmB,EACnB,UAAkB,EAClB,SAAiB,EACjB,QAAgB;IAEhB,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;IACpC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;IACzD,IAAI,CAAC;QACH,IAAI,KAAK,EAAE,MAAM,EAAE,IAAI,WAAW,CAChC,WAAW,EACX;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,CAAC,UAAU,CAAC;SACnB,EACD,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,CACnC,EAAE,CAAC;YACF,IAAI,EAAE,CAAC,IAAI,KAAK,MAAM;gBAAE,OAAO;YAC/B,IAAI,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACxB,MAAM,GAAG,GAAI,EAA2B,CAAC,OAAO,IAAI,cAAc,CAAC;gBACnE,MAAM,IAAI,KAAK,CAAC,UAAU,UAAU,oBAAoB,GAAG,EAAE,CAAC,CAAC;YACjE,CAAC;YACD,IAAI,EAAE,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACzB,MAAM,MAAM,GAAI,EAA0B,CAAC,MAAM,IAAI,WAAW,CAAC;gBACjE,MAAM,IAAI,KAAK,CAAC,UAAU,UAAU,wBAAwB,MAAM,EAAE,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,uBAAuB,UAAU,OAAO,CAAC,CAAC;IAC5D,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,iBAAiB,CAC9B,WAAmB,EACnB,UAAkB;IAElB,MAAM,IAAI,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IACrC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO;IACjC,MAAM,KAAK,GAAG,EAAE;SACb,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC;SAC3B,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3B,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAiB,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IACD,MAAM,SAAS,GAAG,MAAM;SACrB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC;SAC1D,GAAG,EAAE,CAAC;IACT,IAAI,CAAC,SAAS;QAAE,OAAO;IACvB,MAAM,IAAI,GAAI,SAA+B,CAAC,IAAI,IAAI,EAAE,CAAC;IACzD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACvD,CAAC"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/commands/channel/run.ts"],"names":[],"mappings":"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"}
@@ -35,6 +35,10 @@ export interface SpawnOptions {
35
35
  */
36
36
  maxLiveWorkers?: number;
37
37
  }
38
+ /** Parse a role-owned KEY=VALUE file without shell expansion or interpolation. */
39
+ export declare function parseAgentEnvFile(filePath: string): Record<string, string>;
40
+ /** Apply supervisor role defaults without consuming guard env precedence. */
41
+ export declare function applySubnodeSupervisorDefaults(opts: SpawnOptions, cwd?: string): SpawnOptions;
38
42
  export declare function channelSpawn(channelName: string, opts: SpawnOptions): Promise<{
39
43
  pid: number;
40
44
  log: string;
@@ -1 +1 @@
1
- {"version":3,"file":"spawn.d.ts","sourceRoot":"","sources":["../../../src/commands/channel/spawn.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAGlE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAmBpD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yFAAyF;IACzF,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;mEAC+D;IAC/D,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,6DAA6D;IAC7D,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAmGD,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAoEvD"}
1
+ {"version":3,"file":"spawn.d.ts","sourceRoot":"","sources":["../../../src/commands/channel/spawn.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAGlE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAoBpD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yFAAyF;IACzF,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;mEAC+D;IAC/D,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,6DAA6D;IAC7D,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoB1E;AAED,6EAA6E;AAC7E,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,YAAY,EAClB,GAAG,SAAgB,GAClB,YAAY,CAUd;AAuGD,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAkFvD"}
@@ -5,11 +5,45 @@ import { fileURLToPath } from "node:url";
5
5
  import { loadAgent } from "./agent-loader.js";
6
6
  import { assembleContext } from "./context-loader.js";
7
7
  import { resolveTrustedRoots } from "./context-trust.js";
8
- import { enforceSpawnBudget, formatBudgetOverflowError, resolveWorkerGuardConfig, } from "./guard.js";
8
+ import { enforceSpawnBudget, formatBudgetOverflowError, loadSubnodeDispatchConfig, resolveWorkerGuardConfig, } from "./guard.js";
9
9
  import { withLock } from "./store/lock.js";
10
10
  import { channelDir, projectDir, resolveExistingChannelRef, workerFile, workerLockPath, } from "./store/paths.js";
11
11
  import { parseChannelScope } from "./store/schema.js";
12
12
  import { writeSupervisorConfig } from "./supervisor.js";
13
+ /** Parse a role-owned KEY=VALUE file without shell expansion or interpolation. */
14
+ export function parseAgentEnvFile(filePath) {
15
+ const env = {};
16
+ const lines = fs.readFileSync(filePath, "utf-8").split(/\r?\n/);
17
+ for (const [index, rawLine] of lines.entries()) {
18
+ const line = rawLine.trim();
19
+ if (!line || line.startsWith("#"))
20
+ continue;
21
+ const separator = line.indexOf("=");
22
+ const name = separator < 0 ? "" : line.slice(0, separator).trim();
23
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) {
24
+ throw new Error(`Invalid environment entry in ${filePath}:${index + 1}; expected KEY=VALUE`);
25
+ }
26
+ const value = line.slice(separator + 1).trim();
27
+ if (value.includes("\0")) {
28
+ throw new Error(`Environment value for '${name}' contains a NUL byte`);
29
+ }
30
+ env[name] = value;
31
+ }
32
+ return env;
33
+ }
34
+ /** Apply supervisor role defaults without consuming guard env precedence. */
35
+ export function applySubnodeSupervisorDefaults(opts, cwd = process.cwd()) {
36
+ if (opts.agent !== "subnode")
37
+ return opts;
38
+ const config = loadSubnodeDispatchConfig(cwd);
39
+ return {
40
+ ...opts,
41
+ ...(opts.timeoutMs === undefined ? { timeoutMs: config.timeoutMs } : {}),
42
+ ...(opts.warnBeforeMs === undefined
43
+ ? { warnBeforeMs: config.warnBeforeMs }
44
+ : {}),
45
+ };
46
+ }
13
47
  function resolveSpawn(channelName, opts) {
14
48
  const cwd = opts.cwd ?? process.cwd();
15
49
  const trustedRoots = resolveTrustedRoots(cwd);
@@ -17,12 +51,14 @@ function resolveSpawn(channelName, opts) {
17
51
  let provider = opts.provider;
18
52
  let model = opts.model;
19
53
  let as = opts.as;
54
+ let env;
20
55
  if (opts.agent) {
21
56
  const agent = loadAgent(opts.agent, cwd, trustedRoots);
22
57
  agentBody = agent.systemPrompt || undefined;
23
58
  provider = provider ?? agent.provider;
24
59
  model = model ?? agent.model;
25
60
  as = as ?? agent.name;
61
+ env = agent.envFile ? parseAgentEnvFile(agent.envFile) : undefined;
26
62
  }
27
63
  if (!provider) {
28
64
  throw new Error("Missing --provider (and the agent definition has no `provider:` frontmatter)");
@@ -37,6 +73,7 @@ function resolveSpawn(channelName, opts) {
37
73
  as,
38
74
  systemPrompt,
39
75
  model,
76
+ ...(env ? { env } : {}),
40
77
  contextFiles: context.paths,
41
78
  contextManifests: context.manifests,
42
79
  };
@@ -85,17 +122,31 @@ export async function channelSpawn(channelName, opts) {
85
122
  if (!fs.existsSync(channelDir(channelName, ref.project))) {
86
123
  throw new Error(`Channel '${channelName}' not found at ${channelDir(channelName, ref.project)}`);
87
124
  }
88
- const resolved = resolveSpawn(channelName, opts);
125
+ const subnodeConfig = opts.agent === "subnode"
126
+ ? loadSubnodeDispatchConfig(process.cwd())
127
+ : undefined;
128
+ const effectiveOpts = applySubnodeSupervisorDefaults(opts);
129
+ const resolved = resolveSpawn(channelName, effectiveOpts);
89
130
  // OOM guard: enforce live-worker budget for this project/scope before
90
131
  // forking a supervisor. Expired idle workers are cleaned first; if the
91
132
  // budget is still exhausted we reject rather than guess which non-
92
133
  // expired worker to kill.
93
134
  const guardPolicy = resolveWorkerGuardConfig({
94
- ...(opts.idleTimeoutMs !== undefined
95
- ? { flagIdleTimeoutMs: opts.idleTimeoutMs }
135
+ ...(effectiveOpts.idleTimeoutMs !== undefined
136
+ ? { flagIdleTimeoutMs: effectiveOpts.idleTimeoutMs }
96
137
  : {}),
97
- ...(opts.maxLiveWorkers !== undefined
98
- ? { flagMaxLiveWorkers: opts.maxLiveWorkers }
138
+ ...(effectiveOpts.maxLiveWorkers !== undefined
139
+ ? { flagMaxLiveWorkers: effectiveOpts.maxLiveWorkers }
140
+ : {}),
141
+ ...(subnodeConfig
142
+ ? {
143
+ roleDefaults: {
144
+ ...(subnodeConfig.idleTimeoutMs !== undefined
145
+ ? { idleTimeoutMs: subnodeConfig.idleTimeoutMs }
146
+ : {}),
147
+ maxLiveWorkers: subnodeConfig.maxLiveWorkers,
148
+ },
149
+ }
99
150
  : {}),
100
151
  });
101
152
  // Serialize the budget check across the whole project bucket. A per-worker
@@ -122,7 +173,7 @@ export async function channelSpawn(channelName, opts) {
122
173
  // with us. The lock is released as soon as we've handed off to a detached
123
174
  // supervisor (pid file in place).
124
175
  return withLock(workerLockPath(channelName, resolved.as, ref.project), async () => {
125
- return spawnLocked(channelName, resolved, opts, ref.project, guardPolicy.idleTimeoutMs);
176
+ return spawnLocked(channelName, resolved, effectiveOpts, ref.project, guardPolicy.idleTimeoutMs);
126
177
  });
127
178
  });
128
179
  }
@@ -152,6 +203,7 @@ async function spawnLocked(channelName, resolved, opts, project, idleTimeoutMs)
152
203
  idleTimeoutMs,
153
204
  spawnedBy,
154
205
  ...(opts.inboxPolicy ? { inboxPolicy: opts.inboxPolicy } : {}),
206
+ ...(resolved.env ? { env: resolved.env } : {}),
155
207
  ...(opts.agent ? { agent: opts.agent } : {}),
156
208
  ...(resolved.contextFiles.length > 0
157
209
  ? { contextFiles: resolved.contextFiles }
@@ -1 +1 @@
1
- {"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../../src/commands/channel/spawn.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../../src/commands/channel/spawn.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface WorkersOptions {
2
+ scope?: string;
3
+ includeTerminal?: boolean;
4
+ json?: boolean;
5
+ }
6
+ /** Show the core's durable worker projection; never infer state from PIDs. */
7
+ export declare function channelWorkers(channelName: string, opts?: WorkersOptions): Promise<void>;
8
+ //# sourceMappingURL=workers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workers.d.ts","sourceRoot":"","sources":["../../../src/commands/channel/workers.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,8EAA8E;AAC9E,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE,cAAmB,GACxB,OAAO,CAAC,IAAI,CAAC,CAgBf"}
@@ -0,0 +1,30 @@
1
+ import { listWorkers, parseChannelScope, } from "@pennixrv/trellis-core/channel";
2
+ /** Show the core's durable worker projection; never infer state from PIDs. */
3
+ export async function channelWorkers(channelName, opts = {}) {
4
+ const workers = await listWorkers({
5
+ channel: channelName,
6
+ scope: parseChannelScope(opts.scope),
7
+ includeTerminal: opts.includeTerminal,
8
+ });
9
+ if (opts.json) {
10
+ console.log(JSON.stringify(workers, null, 2));
11
+ return;
12
+ }
13
+ if (workers.length === 0) {
14
+ console.log("No workers found.");
15
+ return;
16
+ }
17
+ console.log("WORKER\tLIFECYCLE\tACTIVITY\tPENDING\tLAST_SEQ");
18
+ for (const worker of workers)
19
+ printWorker(worker);
20
+ }
21
+ function printWorker(worker) {
22
+ console.log([
23
+ worker.workerId,
24
+ worker.lifecycle,
25
+ worker.activity,
26
+ worker.pendingMessageCount,
27
+ worker.lastSeq,
28
+ ].join("\t"));
29
+ }
30
+ //# sourceMappingURL=workers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workers.js","sourceRoot":"","sources":["../../../src/commands/channel/workers.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,iBAAiB,GAElB,MAAM,gCAAgC,CAAC;AAQxC,8EAA8E;AAC9E,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,WAAmB,EACnB,OAAuB,EAAE;IAEzB,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC;QAChC,OAAO,EAAE,WAAW;QACpB,KAAK,EAAE,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC;QACpC,eAAe,EAAE,IAAI,CAAC,eAAe;KACtC,CAAC,CAAC;IACH,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACjC,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;IAC9D,KAAK,MAAM,MAAM,IAAI,OAAO;QAAE,WAAW,CAAC,MAAM,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,WAAW,CAAC,MAAmB;IACtC,OAAO,CAAC,GAAG,CACT;QACE,MAAM,CAAC,QAAQ;QACf,MAAM,CAAC,SAAS;QAChB,MAAM,CAAC,QAAQ;QACf,MAAM,CAAC,mBAAmB;QAC1B,MAAM,CAAC,OAAO;KACf,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ {
2
+ "version": "0.6.28",
3
+ "description": "Publishes the ownership-safe task handoff transfer runtime.",
4
+ "breaking": false,
5
+ "recommendMigrate": false,
6
+ "changelog": "**Enhancements:**\n- Publishes ownership-safe task handoff transfer state and its bundled project helpers.\n\n**Internal:**\n- No project-file migration is required for this release.",
7
+ "migrations": [],
8
+ "notes": "No project migration is required. Existing projects can run the normal `trellis update` flow. This manifest restores the published 0.6.28 release entry so updates do not skip a version in the manifest chain."
9
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "version": "0.6.29",
3
+ "description": "Makes bounded subnode dispatch defaults configurable and records durable coordinator review state.",
4
+ "breaking": false,
5
+ "recommendMigrate": false,
6
+ "changelog": "**Enhancements:**\n- Adds a durable `trellis channel workers` projection for coordinator recovery and terminal-state inspection.\n- Adds role-specific `channel.subnode` defaults for the live-worker budget, idle cleanup, supervisor timeout, and timeout warning. The generated live-worker default is 8; ordinary workers retain 6.\n- Adds create-once coordinator dispositions for validated subnode reports.\n\n**Fixes:**\n- Applies the subnode role timeout and warning defaults consistently to `channel run --agent subnode`.",
7
+ "migrations": [],
8
+ "notes": "No project migration is required. Existing projects without channel.subnode use the compatible code defaults; add the optional section from a newly initialized project when per-project subnode tuning is needed."
9
+ }
@@ -161,6 +161,20 @@ Behavior:
161
161
  - **Timeout exits 124** and prints `timeout: still waiting on ...` to stderr
162
162
  when `--all` was in play.
163
163
 
164
+ ### `workers <name>`
165
+
166
+ ```bash
167
+ trellis channel workers <name>
168
+ [--scope project|global]
169
+ [--include-terminal]
170
+ [--json]
171
+ ```
172
+
173
+ Reads the durable worker projection from Trellis core. Without
174
+ `--include-terminal`, only non-terminal workers are shown. `--json` is the
175
+ machine-readable form for coordinator recovery and disposition checks. This
176
+ command does not inspect PID sidecars and does not poll.
177
+
164
178
  ---
165
179
 
166
180
  ## tag-vs-kind — how event shape is actually controlled
@@ -242,7 +256,7 @@ trellis channel spawn <name>
242
256
  [--resume <id>] # session/thread id resume
243
257
  [--timeout <Ns|Nm|Nh>] # auto-kill after duration
244
258
  [--warn-before <Ns|Nm|Nh>] # supervisor_warning lead time
245
- # default 5m, 0ms disables
259
+ # default 5m; subnode role reads config
246
260
  [--file <path>] ... # glob, repeatable; inject content
247
261
  [--jsonl <path>] ... # Trellis manifest, repeatable
248
262
  [--by <agent>] # spawn-event author
@@ -250,9 +264,9 @@ trellis channel spawn <name>
250
264
  [--inbox-policy explicitOnly|broadcastAndExplicit]
251
265
  # default explicitOnly
252
266
  [--idle-timeout <Ns|Nm|Nh>] # OOM-guard idle TTL
253
- # default 5m, 0 disables
267
+ # default 5m; subnode role reads config
254
268
  [--max-live-workers <n>] # spawn-time live-worker budget
255
- # default 6, 0 disables
269
+ # default 6; subnode role reads config
256
270
  ```
257
271
 
258
272
  Behavior:
@@ -267,6 +281,11 @@ Behavior:
267
281
  (`TRELLIS_CHANNEL_WORKER_IDLE_TIMEOUT`,
268
282
  `TRELLIS_CHANNEL_MAX_LIVE_WORKERS`) →
269
283
  `.trellis/config.yaml#channel.worker_guard` → built-in defaults.
284
+ - `--agent subnode` additionally reads `.trellis/config.yaml#channel.subnode`:
285
+ its `idle_timeout` / `max_live_workers` sit below explicit flags and the
286
+ guard environment variables but above `worker_guard`; its `timeout` /
287
+ `warn_before` supply the role's supervisor defaults. Generated projects set
288
+ `max_live_workers: 8` without changing ordinary workers' default of `6`.
270
289
 
271
290
  ### `run [name]`
272
291
 
@@ -280,7 +299,7 @@ trellis channel run [name?]
280
299
  [--file <path>] ... # repeatable, glob
281
300
  [--jsonl <path>] ... # repeatable
282
301
  [--message <text> | --message-file <path> | --stdin]
283
- [--timeout <Ns|Nm|Nh>] # default 5m
302
+ [--timeout <Ns|Nm|Nh>] # default 5m; subnode role reads config
284
303
  ```
285
304
 
286
305
  Behavior:
@@ -41,6 +41,7 @@ $TASK/subnodes/$WORK_ID/$SUBNODE_ID/
41
41
  brief.json # coordinator-owned and immutable after dispatch
42
42
  worklog.md # subnode appends material progress and corrections
43
43
  report.json # subnode-owned final pending-review result
44
+ disposition.json # coordinator-owned, create-once result decision
44
45
  ```
45
46
 
46
47
  Do not use a terminal Channel message as the report transport. The short final
@@ -88,16 +89,23 @@ events committed after that barrier:
88
89
  trellis channel create subnode-example --by main --cwd "$PWD"
89
90
  BARRIER="$(trellis channel barrier subnode-example)"
90
91
  trellis channel spawn subnode-example --agent subnode --provider codex \
91
- --as "$SUBNODE_ID" --cwd "$PWD" --timeout 30m
92
+ --as "$SUBNODE_ID" --cwd "$PWD"
92
93
 
93
94
  printf '%s\n' "Read $TASK/subnodes/$WORK_ID/$SUBNODE_ID/brief.json and perform only that bounded work." \
94
95
  | trellis channel send subnode-example --as main --to "$SUBNODE_ID" \
95
96
  --stdin --delivery-mode requireRunningWorker
96
97
 
97
98
  trellis channel wait subnode-example --as main --from "$SUBNODE_ID" \
98
- --kind done,error --after-seq "$BARRIER" --timeout 30m
99
+ --kind done,error,killed --after-seq "$BARRIER" --timeout 30m
99
100
  ```
100
101
 
102
+ `channel.subnode` in `.trellis/config.yaml` supplies the role defaults for
103
+ `max_live_workers` (generated default `8`), `idle_timeout`, `timeout`, and
104
+ `warn_before`. Change that section before a dispatch group when its resource
105
+ or lifetime needs differ; pass the corresponding `spawn` flag only for a
106
+ one-off override. The generic `channel.worker_guard` remains the fallback for
107
+ ordinary workers and for a subnode key omitted from the project config.
108
+
101
109
  Where the host exposes a live wait continuation, capture the same barrier,
102
110
  establish one event waiter before triggering the worker, and continue that same
103
111
  waiter until terminal state. Until it resolves, times out, or errors, the next
@@ -111,18 +119,38 @@ not as a high-frequency supervision loop.
111
119
 
112
120
  After a terminal message, independently validate and then record a task-level
113
121
  disposition. `complete` means only that the subnode claims it completed its
114
- assigned work; it is not acceptance.
122
+ assigned work; it is not acceptance. Confirm the terminal state from the
123
+ durable worker projection; a report without a terminal worker is still
124
+ pending, and a terminal worker without a valid report is recovery.
115
125
 
116
126
  ```bash
117
127
  REPORT="$TASK/subnodes/$WORK_ID/$SUBNODE_ID/report.json"
118
128
  python3 .trellis/scripts/subnode_artifact.py validate --report "$REPORT"
129
+ trellis channel workers subnode-example --include-terminal --json
119
130
  ```
120
131
 
121
132
  The coordinator must re-check enough source evidence and protected-target state
122
- to decide `accepted`, `rejected`, or `deferred`, preserving the reason and named
123
- checks such as `report_validation`, `source_recheck`, and
124
- `protected_target_check` in task research or a decision record. The validator
125
- does not make that decision and does not modify `task.json`.
133
+ to decide `accepted`, `rejected`, or `deferred`. Record the terminal lifecycle
134
+ and sequence returned by `channel workers`, then let the helper create the
135
+ disposition exactly once:
136
+
137
+ ```bash
138
+ python3 .trellis/scripts/subnode_artifact.py disposition \
139
+ --report "$REPORT" \
140
+ --outcome accepted \
141
+ --terminal-lifecycle done \
142
+ --terminal-seq 17 \
143
+ --terminal-at 2026-09-14T03:00:00Z \
144
+ --check report_validation \
145
+ --check source_recheck \
146
+ --check protected_target_check \
147
+ --reason "Evidence and protected targets were independently rechecked."
148
+ ```
149
+
150
+ `disposition.json` is coordinator-owned and cannot be replaced. The helper
151
+ does not inspect the Channel store or make the acceptance judgment; the
152
+ terminal values must come from the worker projection and the reason records
153
+ the coordinator's decision.
126
154
 
127
155
  Use the separate coordinator work-record helper only for a durable cross-task
128
156
  observation, decision, open question, or blocker. It does not substitute for a
@@ -159,4 +187,5 @@ record why it is retrying and check the new report independently; neither the
159
187
  helper nor Channel decides when to retry.
160
188
 
161
189
  No scheduler, high-frequency polling loop, automatic retry, worktree, global
162
- ledger, or provider-specific transport is introduced by this workflow.
190
+ ledger, or provider-specific transport is introduced by this workflow. A
191
+ manual retry always uses a new subnode id and worker handle.
@@ -39,16 +39,27 @@ Key `spawn` flags:
39
39
  - `--idle-timeout <duration>` — OOM guard idle TTL (default `5m`; `0` disables).
40
40
  - `--max-live-workers <n>` — spawn-time live-worker budget (default `6`; `0` disables).
41
41
 
42
+ An agent card may declare `env_file: <file>`; the channel runtime loads that
43
+ relative sibling file automatically for the provider child. Use this for
44
+ stable role settings so every spawn of that role gets the same environment.
45
+ The file contains plain `KEY=VALUE` lines only; it is not shell code and does
46
+ not perform expansion or interpolation. Do not put credentials in a bundled
47
+ role file. The bundled `subnode` role uses this mechanism to disable
48
+ OpenViking's automatic recall, capture, and fixed background injection in the
49
+ evidence worker process.
50
+
42
51
  The success event `spawned` records `pid`, `provider`, `agent`, the injected
43
52
  `files`, and the resolved `manifests` so later spectators can audit context.
44
53
 
45
54
  ## Agent Cards
46
55
 
47
56
  `--agent <name>` resolves to `.trellis/agents/<name>.md`. The card name must
48
- match `[A-Za-z0-9._-]+`. The default Trellis install ships two cards:
57
+ match `[A-Za-z0-9._-]+`. The default Trellis install ships three cards:
49
58
 
50
59
  - `.trellis/agents/check.md` — code-quality reviewer.
51
60
  - `.trellis/agents/implement.md` — coding worker for implementation runs.
61
+ - `.trellis/agents/subnode.md` — bounded independent-evidence worker; its
62
+ `subnode.env` sibling is loaded automatically.
52
63
 
53
64
  ```yaml
54
65
  ---
@@ -205,17 +216,25 @@ Precedence (highest first):
205
216
  1. CLI flags: `--idle-timeout`, `--max-live-workers` on `spawn`.
206
217
  2. Environment variables: `TRELLIS_CHANNEL_WORKER_IDLE_TIMEOUT`,
207
218
  `TRELLIS_CHANNEL_MAX_LIVE_WORKERS`.
208
- 3. `.trellis/config.yaml` under `channel.worker_guard`.
209
- 4. Built-in defaults (`5m`, `6`).
219
+ 3. For `--agent subnode`, `channel.subnode` in `.trellis/config.yaml`.
220
+ 4. `.trellis/config.yaml` under `channel.worker_guard`.
221
+ 5. Built-in defaults (`5m`, `6`) for ordinary workers.
210
222
 
211
223
  Cleanup notices are written to stderr at spawn time so operators can see which
212
224
  idle workers were swept and why a new spawn was rejected. The guard does not
213
225
  touch ephemeral / `channel run` workers any differently — they are subject to
214
226
  the same idle TTL and budget.
215
227
 
216
- To audit current state, list workers via `channel list` (the `WORKERS`
217
- column) and inspect per-channel `pid` / `worker-pid` sidecar files under
218
- `~/.trellis/channels/<bucket>/<channel>/`.
228
+ To audit durable state, use `trellis channel workers <name> --include-terminal
229
+ --json`. This is the canonical worker projection. Inspect per-channel `pid` /
230
+ `worker-pid` sidecar files under `~/.trellis/channels/<bucket>/<channel>/` only
231
+ when diagnosing host-local process liveness; they are not lifecycle truth.
232
+
233
+ For bounded evidence workers, `channel.subnode` is a separate role-default
234
+ section. It configures `idle_timeout`, `max_live_workers` (generated default
235
+ `8`), `timeout`, and `warn_before` only for `spawn --agent subnode`. Explicit
236
+ spawn flags remain one-dispatch overrides; ordinary workers retain the generic
237
+ `worker_guard` defaults.
219
238
 
220
239
  ## Worker Inbox APIs
221
240
 
@@ -45,7 +45,7 @@ Do not assume the user has the Trellis source repository. Do not default to modi
45
45
 
46
46
  - `references/platform-files/overview.md`: How shared `.trellis/` files relate to platform directories and the four platform integration modes (hook-driven, agent prelude, main-session workflow, channel runtime).
47
47
  - `references/platform-files/platform-map.md`: Platform directories and paths for skills, agents, hooks, and extensions across all supported platforms including Reasonix and Pi's native `trellis_subagent` extension.
48
- - `references/platform-files/hooks-and-settings.md`: How settings/config files, hooks, plugins, and extensions connect to Trellis; covers `channel.worker_guard.*` and `codex.dispatch_mode`.
48
+ - `references/platform-files/hooks-and-settings.md`: How settings/config files, hooks, plugins, and extensions connect to Trellis; covers `channel.worker_guard.*`, `channel.subnode.*`, and `codex.dispatch_mode`.
49
49
  - `references/platform-files/agents.md`: Per-platform `trellis-research` / `trellis-implement` / `trellis-check` sub-agent files plus bundled `.trellis/agents/{check,implement}.md` for the channel runtime.
50
50
  - `references/platform-files/skills-and-commands.md`: Differences between skills, commands, prompts, and workflows, plus how to change them.
51
51
 
@@ -64,7 +64,7 @@ Do not assume the user has the Trellis source repository. Do not default to modi
64
64
  ## Current Rules
65
65
 
66
66
  - `.trellis/workflow.md` is the local workflow source of truth; its initial content was selected from a workflow template (built-in `native`, `tdd`, `channel-driven-subagent-dispatch`, or a marketplace template) at `trellis init` time and can be re-selected via `trellis workflow --template <id>`. Missing `.trellis/agents/<name>.md` files referenced by the active template trigger a non-blocking stderr warning pointing at `trellis update`.
67
- - `.trellis/config.yaml` is the project-level Trellis configuration entry point. It hosts task lifecycle hooks (`hooks.after_create` / `after_start` / `after_finish` / `after_archive`), journal shape (`session_commit_message` / `max_journal_lines` / `session_auto_commit`), channel worker guard (`channel.worker_guard.idle_timeout` / `max_live_workers`), Codex dispatch mode (`codex.dispatch_mode: inline | sub-agent`), and the spec registry block (`registry.spec.source` + `registry.spec.template`).
67
+ - `.trellis/config.yaml` is the project-level Trellis configuration entry point. It hosts task lifecycle hooks (`hooks.after_create` / `after_start` / `after_finish` / `after_archive`), journal shape (`session_commit_message` / `max_journal_lines` / `session_auto_commit`), generic channel worker guard (`channel.worker_guard.idle_timeout` / `max_live_workers`), bounded subnode defaults (`channel.subnode.max_live_workers` / `idle_timeout` / `timeout` / `warn_before`), Codex dispatch mode (`codex.dispatch_mode: inline | sub-agent`), and the spec registry block (`registry.spec.source` + `registry.spec.template`).
68
68
  - `.trellis/spec/` stores the user's project-specific coding conventions and design constraints. When `registry.spec` is set, files are refreshed by `trellis update`; local edits surface as "modified by user" conflicts in `.trellis/.template-hashes.json`.
69
69
  - `.trellis/tasks/` stores task PRDs, design notes, implement plans, research files, and JSONL context. Tasks form parent/child trees: `task.py create --parent <slug>`, `task.py add-subtask <parent> <child>`, `task.py remove-subtask <parent> <child>`, and `task.py list-context <task>`. `task.py create` rejects a slug already present in `.trellis/tasks/archive/**`.
70
70
  - `.trellis/workspace/` stores **deliberately written** developer journals. Raw cross-session dialogue is **not** stored here — it lives on disk under `~/.claude/projects/`, `~/.codex/sessions/`, and `~/.pi/agent/sessions/` and is recovered via `trellis mem search|extract|context`. The bundled `trellis-session-insight` skill teaches when to reach for `mem`.
@@ -49,12 +49,13 @@ Prefer cheaper primitives when:
49
49
  | Change default channel worker idle timeout | `channel.worker_guard.idle_timeout` in `.trellis/config.yaml`. Accepts `5m`, `30s`, etc. Set `0` to disable idle cleanup. |
50
50
  | Change live worker budget | `channel.worker_guard.max_live_workers` in `.trellis/config.yaml`. Set `0` to disable the spawn-time budget check. |
51
51
  | Override worker guard per spawn | Pass `--idle-timeout` / `--max-live-workers` on `trellis channel spawn`, or set `TRELLIS_CHANNEL_WORKER_IDLE_TIMEOUT` / `TRELLIS_CHANNEL_MAX_LIVE_WORKERS` in the environment. |
52
+ | Tune bounded subnode dispatch defaults | Set `channel.subnode.max_live_workers`, `idle_timeout`, `timeout`, or `warn_before`. Generated defaults are `8`, `5m`, `30m`, and `5m`; explicit spawn flags and existing guard environment overrides still win. |
52
53
  | Change what the default Check or Implement worker does | Edit `.trellis/agents/check.md` or `.trellis/agents/implement.md`. These are platform-agnostic role cards; the channel runtime injects them when `--agent check|implement` is passed. |
53
54
  | Add a new role card | Drop `<name>.md` into `.trellis/agents/`. `trellis channel spawn --agent <name>` will pick it up. |
54
55
  | Relocate channel storage (CI sandbox, ephemeral runs) | Set `TRELLIS_CHANNEL_ROOT=/path/to/dir`. Channel events move with it; existing channels stay at the old root. |
55
56
  | Switch storage scope | Pass `--scope project` (default) or `--scope global` on every channel subcommand. The bucket directory changes; nothing else does. |
56
57
 
57
- Precedence for the worker guard is: CLI flag > environment variable > `.trellis/config.yaml` > built-in default. Built-in defaults are `idle_timeout: 5m` and `max_live_workers: 6`.
58
+ Worker guard precedence is: CLI flag > environment variable > `channel.subnode` for `--agent subnode` > `channel.worker_guard` > built-in default. Ordinary worker defaults remain `idle_timeout: 5m` and `max_live_workers: 6`.
58
59
 
59
60
  ## Relationship To Other Local Layers
60
61
 
@@ -0,0 +1,4 @@
1
+ # Subnodes are evidence workers; keep main-session OpenViking memory hooks off.
2
+ OPENVIKING_AUTO_RECALL=0
3
+ OPENVIKING_AUTO_CAPTURE=0
4
+ OPENVIKING_NO_AUTO_INJECT=1
@@ -5,6 +5,7 @@ description: |
5
5
  never changes protected target files, and leaves acceptance to the coordinator.
6
6
  provider: codex
7
7
  labels: [trellis, subnode]
8
+ env_file: subnode.env
8
9
  ---
9
10
 
10
11
  # Subnode (channel runtime)
@@ -54,6 +55,10 @@ sandbox claim.
54
55
  6. Send one short terminal Channel message with the status and report path.
55
56
  Do not place the report JSON in Channel text.
56
57
 
58
+ The terminal message ends the worker runtime; it does not accept the report.
59
+ The coordinator later checks the durable worker terminal projection and records
60
+ the disposition. A report without a terminal worker remains pending.
61
+
57
62
  ## Report Boundary
58
63
 
59
64
  The coordinator independently runs the artifact validator and then records the
@@ -85,7 +85,8 @@ max_journal_lines: 2000
85
85
  # continuously idle past `idle_timeout`).
86
86
  #
87
87
  # Precedence: CLI flag > env var (TRELLIS_CHANNEL_WORKER_IDLE_TIMEOUT /
88
- # TRELLIS_CHANNEL_MAX_LIVE_WORKERS) > this config > built-in default.
88
+ # TRELLIS_CHANNEL_MAX_LIVE_WORKERS) > role config (`channel.subnode` for
89
+ # subnodes, `channel.worker_guard` otherwise) > built-in default.
89
90
  #
90
91
  # `idle_timeout: 0` disables idle cleanup (workers can sit idle forever
91
92
  # unless explicitly killed or given `--timeout`).
@@ -103,6 +104,13 @@ channel:
103
104
  worker_guard:
104
105
  idle_timeout: 5m
105
106
  max_live_workers: 6
107
+ # Defaults for `trellis channel spawn --agent subnode`. Explicit spawn
108
+ # flags still override these values; ordinary workers use worker_guard.
109
+ subnode:
110
+ idle_timeout: 5m
111
+ max_live_workers: 8
112
+ timeout: 30m
113
+ warn_before: 5m
106
114
  # trusted_context_dirs:
107
115
  # - /work/user/trellis_workspace
108
116
  # auto_trust_trellis_symlinks: false