@fro.bot/systematic 2.31.0 → 2.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -6,7 +6,7 @@ import {
6
6
  findCommandsInDir,
7
7
  findSkillsInDir,
8
8
  getConfigPaths
9
- } from "./index-ybqr13k7.js";
9
+ } from "./index-wjkgb2gb.js";
10
10
 
11
11
  // src/cli.ts
12
12
  import fs from "fs";
@@ -1414,6 +1414,164 @@ function printParseErrorCode(code) {
1414
1414
  return "<unknown ParseErrorCode>";
1415
1415
  }
1416
1416
 
1417
+ // src/lib/bundled-names.ts
1418
+ var BUNDLED_AGENT_NAMES = [
1419
+ "adversarial-document-reviewer",
1420
+ "adversarial-reviewer",
1421
+ "agent-native-reviewer",
1422
+ "ankane-readme-writer",
1423
+ "api-contract-reviewer",
1424
+ "architecture-strategist",
1425
+ "best-practices-researcher",
1426
+ "bug-reproduction-validator",
1427
+ "cli-agent-readiness-reviewer",
1428
+ "cli-readiness-reviewer",
1429
+ "code-simplicity-reviewer",
1430
+ "coherence-reviewer",
1431
+ "correctness-reviewer",
1432
+ "data-integrity-guardian",
1433
+ "data-migration-expert",
1434
+ "data-migrations-reviewer",
1435
+ "deployment-verification-agent",
1436
+ "design-implementation-reviewer",
1437
+ "design-iterator",
1438
+ "design-lens-reviewer",
1439
+ "dhh-rails-reviewer",
1440
+ "feasibility-reviewer",
1441
+ "figma-design-sync",
1442
+ "framework-docs-researcher",
1443
+ "git-history-analyzer",
1444
+ "issue-intelligence-analyst",
1445
+ "julik-frontend-races-reviewer",
1446
+ "kieran-python-reviewer",
1447
+ "kieran-rails-reviewer",
1448
+ "kieran-typescript-reviewer",
1449
+ "learnings-researcher",
1450
+ "lint",
1451
+ "maintainability-reviewer",
1452
+ "pattern-recognition-specialist",
1453
+ "performance-oracle",
1454
+ "performance-reviewer",
1455
+ "pr-comment-resolver",
1456
+ "previous-comments-reviewer",
1457
+ "product-lens-reviewer",
1458
+ "project-standards-reviewer",
1459
+ "reliability-reviewer",
1460
+ "repo-research-analyst",
1461
+ "schema-drift-detector",
1462
+ "scope-guardian-reviewer",
1463
+ "security-lens-reviewer",
1464
+ "security-reviewer",
1465
+ "security-sentinel",
1466
+ "slack-researcher",
1467
+ "spec-flow-analyzer",
1468
+ "systematic-implementer",
1469
+ "testing-reviewer"
1470
+ ];
1471
+ var BUNDLED_AGENT_QUALIFIED_IDS = [
1472
+ "design/design-implementation-reviewer",
1473
+ "design/design-iterator",
1474
+ "design/figma-design-sync",
1475
+ "docs/ankane-readme-writer",
1476
+ "document-review/adversarial-document-reviewer",
1477
+ "document-review/coherence-reviewer",
1478
+ "document-review/design-lens-reviewer",
1479
+ "document-review/feasibility-reviewer",
1480
+ "document-review/product-lens-reviewer",
1481
+ "document-review/scope-guardian-reviewer",
1482
+ "document-review/security-lens-reviewer",
1483
+ "research/best-practices-researcher",
1484
+ "research/framework-docs-researcher",
1485
+ "research/git-history-analyzer",
1486
+ "research/issue-intelligence-analyst",
1487
+ "research/learnings-researcher",
1488
+ "research/repo-research-analyst",
1489
+ "research/slack-researcher",
1490
+ "review/adversarial-reviewer",
1491
+ "review/agent-native-reviewer",
1492
+ "review/api-contract-reviewer",
1493
+ "review/architecture-strategist",
1494
+ "review/cli-agent-readiness-reviewer",
1495
+ "review/cli-readiness-reviewer",
1496
+ "review/code-simplicity-reviewer",
1497
+ "review/correctness-reviewer",
1498
+ "review/data-integrity-guardian",
1499
+ "review/data-migration-expert",
1500
+ "review/data-migrations-reviewer",
1501
+ "review/deployment-verification-agent",
1502
+ "review/dhh-rails-reviewer",
1503
+ "review/julik-frontend-races-reviewer",
1504
+ "review/kieran-python-reviewer",
1505
+ "review/kieran-rails-reviewer",
1506
+ "review/kieran-typescript-reviewer",
1507
+ "review/maintainability-reviewer",
1508
+ "review/pattern-recognition-specialist",
1509
+ "review/performance-oracle",
1510
+ "review/performance-reviewer",
1511
+ "review/previous-comments-reviewer",
1512
+ "review/project-standards-reviewer",
1513
+ "review/reliability-reviewer",
1514
+ "review/schema-drift-detector",
1515
+ "review/security-reviewer",
1516
+ "review/security-sentinel",
1517
+ "review/testing-reviewer",
1518
+ "workflow/bug-reproduction-validator",
1519
+ "workflow/lint",
1520
+ "workflow/pr-comment-resolver",
1521
+ "workflow/spec-flow-analyzer",
1522
+ "workflow/systematic-implementer"
1523
+ ];
1524
+ var BUNDLED_SKILL_NAMES = [
1525
+ "agent-browser",
1526
+ "agent-native-architecture",
1527
+ "agent-native-audit",
1528
+ "andrew-kane-gem-writer",
1529
+ "ce:brainstorm",
1530
+ "ce:compound",
1531
+ "ce:compound-refresh",
1532
+ "ce:ideate",
1533
+ "ce:plan",
1534
+ "ce:review",
1535
+ "ce:work",
1536
+ "changelog",
1537
+ "claude-permissions-optimizer",
1538
+ "compound-docs",
1539
+ "deepen-plan",
1540
+ "deploy-docs",
1541
+ "dhh-rails-style",
1542
+ "document-review",
1543
+ "dspy-ruby",
1544
+ "every-style-editor",
1545
+ "feature-video",
1546
+ "frontend-design",
1547
+ "gemini-imagegen",
1548
+ "generate_command",
1549
+ "git-clean-gone-branches",
1550
+ "git-commit",
1551
+ "git-commit-push-pr",
1552
+ "git-worktree",
1553
+ "lfg",
1554
+ "onboarding",
1555
+ "orchestrating-subagents",
1556
+ "orchestrating-swarms",
1557
+ "proof",
1558
+ "rclone",
1559
+ "report-bug-ce",
1560
+ "reproduce-bug",
1561
+ "resolve-pr-feedback",
1562
+ "setup",
1563
+ "slfg",
1564
+ "test-browser",
1565
+ "test-driven-development",
1566
+ "test-xcode",
1567
+ "todo-create",
1568
+ "todo-resolve",
1569
+ "todo-triage",
1570
+ "using-systematic",
1571
+ "writing-skills",
1572
+ "writing-systematic-skills"
1573
+ ];
1574
+
1417
1575
  // node_modules/.bun/zod@4.4.3/node_modules/zod/v4/classic/external.js
1418
1576
  var exports_external = {};
1419
1577
  __export(exports_external, {
@@ -15701,163 +15859,9 @@ var OPENCODE_AGENT_COLOR_TOKENS = [
15701
15859
  "info"
15702
15860
  ];
15703
15861
 
15704
- // src/lib/bundled-names.ts
15705
- var BUNDLED_AGENT_NAMES = [
15706
- "adversarial-document-reviewer",
15707
- "adversarial-reviewer",
15708
- "agent-native-reviewer",
15709
- "ankane-readme-writer",
15710
- "api-contract-reviewer",
15711
- "architecture-strategist",
15712
- "best-practices-researcher",
15713
- "bug-reproduction-validator",
15714
- "cli-agent-readiness-reviewer",
15715
- "cli-readiness-reviewer",
15716
- "code-simplicity-reviewer",
15717
- "coherence-reviewer",
15718
- "correctness-reviewer",
15719
- "data-integrity-guardian",
15720
- "data-migration-expert",
15721
- "data-migrations-reviewer",
15722
- "deployment-verification-agent",
15723
- "design-implementation-reviewer",
15724
- "design-iterator",
15725
- "design-lens-reviewer",
15726
- "dhh-rails-reviewer",
15727
- "feasibility-reviewer",
15728
- "figma-design-sync",
15729
- "framework-docs-researcher",
15730
- "git-history-analyzer",
15731
- "issue-intelligence-analyst",
15732
- "julik-frontend-races-reviewer",
15733
- "kieran-python-reviewer",
15734
- "kieran-rails-reviewer",
15735
- "kieran-typescript-reviewer",
15736
- "learnings-researcher",
15737
- "lint",
15738
- "maintainability-reviewer",
15739
- "pattern-recognition-specialist",
15740
- "performance-oracle",
15741
- "performance-reviewer",
15742
- "pr-comment-resolver",
15743
- "previous-comments-reviewer",
15744
- "product-lens-reviewer",
15745
- "project-standards-reviewer",
15746
- "reliability-reviewer",
15747
- "repo-research-analyst",
15748
- "schema-drift-detector",
15749
- "scope-guardian-reviewer",
15750
- "security-lens-reviewer",
15751
- "security-reviewer",
15752
- "security-sentinel",
15753
- "slack-researcher",
15754
- "spec-flow-analyzer",
15755
- "systematic-implementer",
15756
- "testing-reviewer"
15757
- ];
15758
- var BUNDLED_AGENT_QUALIFIED_IDS = [
15759
- "design/design-implementation-reviewer",
15760
- "design/design-iterator",
15761
- "design/figma-design-sync",
15762
- "docs/ankane-readme-writer",
15763
- "document-review/adversarial-document-reviewer",
15764
- "document-review/coherence-reviewer",
15765
- "document-review/design-lens-reviewer",
15766
- "document-review/feasibility-reviewer",
15767
- "document-review/product-lens-reviewer",
15768
- "document-review/scope-guardian-reviewer",
15769
- "document-review/security-lens-reviewer",
15770
- "research/best-practices-researcher",
15771
- "research/framework-docs-researcher",
15772
- "research/git-history-analyzer",
15773
- "research/issue-intelligence-analyst",
15774
- "research/learnings-researcher",
15775
- "research/repo-research-analyst",
15776
- "research/slack-researcher",
15777
- "review/adversarial-reviewer",
15778
- "review/agent-native-reviewer",
15779
- "review/api-contract-reviewer",
15780
- "review/architecture-strategist",
15781
- "review/cli-agent-readiness-reviewer",
15782
- "review/cli-readiness-reviewer",
15783
- "review/code-simplicity-reviewer",
15784
- "review/correctness-reviewer",
15785
- "review/data-integrity-guardian",
15786
- "review/data-migration-expert",
15787
- "review/data-migrations-reviewer",
15788
- "review/deployment-verification-agent",
15789
- "review/dhh-rails-reviewer",
15790
- "review/julik-frontend-races-reviewer",
15791
- "review/kieran-python-reviewer",
15792
- "review/kieran-rails-reviewer",
15793
- "review/kieran-typescript-reviewer",
15794
- "review/maintainability-reviewer",
15795
- "review/pattern-recognition-specialist",
15796
- "review/performance-oracle",
15797
- "review/performance-reviewer",
15798
- "review/previous-comments-reviewer",
15799
- "review/project-standards-reviewer",
15800
- "review/reliability-reviewer",
15801
- "review/schema-drift-detector",
15802
- "review/security-reviewer",
15803
- "review/security-sentinel",
15804
- "review/testing-reviewer",
15805
- "workflow/bug-reproduction-validator",
15806
- "workflow/lint",
15807
- "workflow/pr-comment-resolver",
15808
- "workflow/spec-flow-analyzer",
15809
- "workflow/systematic-implementer"
15810
- ];
15811
- var BUNDLED_SKILL_NAMES = [
15812
- "agent-browser",
15813
- "agent-native-architecture",
15814
- "agent-native-audit",
15815
- "andrew-kane-gem-writer",
15816
- "ce:brainstorm",
15817
- "ce:compound",
15818
- "ce:compound-refresh",
15819
- "ce:ideate",
15820
- "ce:plan",
15821
- "ce:review",
15822
- "ce:work",
15823
- "changelog",
15824
- "claude-permissions-optimizer",
15825
- "compound-docs",
15826
- "deepen-plan",
15827
- "deploy-docs",
15828
- "dhh-rails-style",
15829
- "document-review",
15830
- "dspy-ruby",
15831
- "every-style-editor",
15832
- "feature-video",
15833
- "frontend-design",
15834
- "gemini-imagegen",
15835
- "generate_command",
15836
- "git-clean-gone-branches",
15837
- "git-commit",
15838
- "git-commit-push-pr",
15839
- "git-worktree",
15840
- "lfg",
15841
- "onboarding",
15842
- "orchestrating-subagents",
15843
- "orchestrating-swarms",
15844
- "proof",
15845
- "rclone",
15846
- "report-bug-ce",
15847
- "reproduce-bug",
15848
- "resolve-pr-feedback",
15849
- "setup",
15850
- "slfg",
15851
- "test-browser",
15852
- "test-driven-development",
15853
- "test-xcode",
15854
- "todo-create",
15855
- "todo-resolve",
15856
- "todo-triage",
15857
- "using-systematic",
15858
- "writing-skills",
15859
- "writing-systematic-skills"
15860
- ];
15862
+ // src/lib/removed-names.ts
15863
+ var REMOVED_BUNDLED_SKILL_NAMES = [];
15864
+ var REMOVED_BUNDLED_AGENT_NAMES = [];
15861
15865
 
15862
15866
  // src/lib/config-schema.ts
15863
15867
  var permissionSettingSchema = exports_external.enum(["ask", "allow", "deny"]);
@@ -15982,7 +15986,13 @@ var BootstrapSchema = exports_external.object({
15982
15986
  examples: [{ enabled: true }, { enabled: false }]
15983
15987
  });
15984
15988
  function createSystematicConfigSchema(opts) {
15985
- const { agentNames, qualifiedAgentIds, skillNames } = opts;
15989
+ const {
15990
+ agentNames,
15991
+ qualifiedAgentIds,
15992
+ skillNames,
15993
+ removedSkillNames = [],
15994
+ removedAgentNames = []
15995
+ } = opts;
15986
15996
  return exports_external.object({
15987
15997
  $schema: exports_external.string().url().optional().meta({
15988
15998
  description: "JSON Schema URL for IDE autocomplete. The value is informational only \u2014 the loader does not fetch or validate against it. Add this to enable IDE schema activation and field-level autocomplete in editors that support JSON Schema (VSCode, Zed, IntelliJ).",
@@ -16005,11 +16015,15 @@ function createSystematicConfigSchema(opts) {
16005
16015
  description: "Per-category configuration overlays keyed by category name",
16006
16016
  examples: [{ review: { model: "anthropic/claude-opus-4-7" } }, {}]
16007
16017
  }),
16008
- disabled_skills: exports_external.array(exports_external.enum(skillNames)).default([]).meta({
16018
+ disabled_skills: exports_external.array(exports_external.enum([...skillNames, ...removedSkillNames])).default([]).meta({
16009
16019
  description: "Array of bundled skill names to disable globally. Unknown skill names are rejected at parse time.",
16010
16020
  examples: [["ce:plan", "ce:review"]]
16011
16021
  }),
16012
- disabled_agents: exports_external.array(exports_external.enum([...agentNames, ...qualifiedAgentIds])).default([]).meta({
16022
+ disabled_agents: exports_external.array(exports_external.enum([
16023
+ ...agentNames,
16024
+ ...qualifiedAgentIds,
16025
+ ...removedAgentNames
16026
+ ])).default([]).meta({
16013
16027
  description: "Array of bundled agent names (bare or qualified category/name) to disable globally. Unknown agent names are rejected at parse time.",
16014
16028
  examples: [
16015
16029
  ["previous-comments-reviewer", "cli-readiness-reviewer"],
@@ -16037,7 +16051,9 @@ function createSystematicConfigSchema(opts) {
16037
16051
  var SystematicConfigSchema = createSystematicConfigSchema({
16038
16052
  agentNames: BUNDLED_AGENT_NAMES,
16039
16053
  qualifiedAgentIds: BUNDLED_AGENT_QUALIFIED_IDS,
16040
- skillNames: BUNDLED_SKILL_NAMES
16054
+ skillNames: BUNDLED_SKILL_NAMES,
16055
+ removedSkillNames: REMOVED_BUNDLED_SKILL_NAMES,
16056
+ removedAgentNames: REMOVED_BUNDLED_AGENT_NAMES
16041
16057
  });
16042
16058
  var SECURITY_OVERLAY_FIELDS = [
16043
16059
  "model",
@@ -16058,6 +16074,22 @@ var DEFAULT_CONFIG = {
16058
16074
  categories: {}
16059
16075
  };
16060
16076
  var SECURITY_OVERLAY_FIELDS2 = new Set(SECURITY_OVERLAY_FIELDS);
16077
+ var CURRENT_SKILL_NAMES_SET = new Set(BUNDLED_SKILL_NAMES);
16078
+ var CURRENT_AGENT_NAMES_SET = new Set([
16079
+ ...BUNDLED_AGENT_NAMES,
16080
+ ...BUNDLED_AGENT_QUALIFIED_IDS
16081
+ ]);
16082
+ function computeDroppedNames(names, allowedSet) {
16083
+ return names.filter((n) => !allowedSet.has(n));
16084
+ }
16085
+ function warnDroppedNames(dropped, field, warned) {
16086
+ for (const name of dropped) {
16087
+ if (warned.has(name))
16088
+ continue;
16089
+ warned.add(name);
16090
+ console.warn(`[systematic] "${name}" in \`${field}\` is no longer a bundled name and will be ignored. Remove it from your config to silence this warning.`);
16091
+ }
16092
+ }
16061
16093
  function resolveConfigPath(dir, basename) {
16062
16094
  const jsoncPath = path3.join(dir, `${basename}.jsonc`);
16063
16095
  if (fs4.existsSync(jsoncPath))
@@ -16210,7 +16242,19 @@ function loadConfigWithSources(projectDir) {
16210
16242
  agents: overlayValues(overlays.agents),
16211
16243
  categories: overlayValues(overlays.categories)
16212
16244
  };
16213
- return { config: result, overlays };
16245
+ const warned = new Set;
16246
+ const droppedSkills = computeDroppedNames(result.disabled_skills, CURRENT_SKILL_NAMES_SET);
16247
+ warnDroppedNames(droppedSkills, "disabled_skills", warned);
16248
+ const droppedAgents = computeDroppedNames(result.disabled_agents, CURRENT_AGENT_NAMES_SET);
16249
+ warnDroppedNames(droppedAgents, "disabled_agents", warned);
16250
+ const droppedSkillSet = new Set(droppedSkills);
16251
+ const droppedAgentSet = new Set(droppedAgents);
16252
+ const effectiveConfig = droppedSkillSet.size === 0 && droppedAgentSet.size === 0 ? result : {
16253
+ ...result,
16254
+ disabled_skills: result.disabled_skills.filter((n) => !droppedSkillSet.has(n)),
16255
+ disabled_agents: result.disabled_agents.filter((n) => !droppedAgentSet.has(n))
16256
+ };
16257
+ return { config: effectiveConfig, overlays };
16214
16258
  }
16215
16259
  function mergeOverlaySources(sources) {
16216
16260
  const result = {
package/dist/index.js CHANGED
@@ -13,7 +13,7 @@ import {
13
13
  loadConfig,
14
14
  loadConfigWithSources,
15
15
  parseFrontmatter
16
- } from "./index-ybqr13k7.js";
16
+ } from "./index-wjkgb2gb.js";
17
17
 
18
18
  // src/index.ts
19
19
  import fs5 from "fs";
@@ -87,6 +87,8 @@ export interface SystematicConfigSchemaOptions {
87
87
  readonly agentNames: readonly string[];
88
88
  readonly qualifiedAgentIds: readonly string[];
89
89
  readonly skillNames: readonly string[];
90
+ readonly removedSkillNames?: readonly string[];
91
+ readonly removedAgentNames?: readonly string[];
90
92
  }
91
93
  /**
92
94
  * Construct the top-level Systematic config schema from a discovered set of
@@ -26,6 +26,20 @@ export interface SystematicConfig {
26
26
  categories?: OverlayConfigMap;
27
27
  }
28
28
  export declare const DEFAULT_CONFIG: SystematicConfig;
29
+ /**
30
+ * Return the subset of `names` that are absent from `allowedSet`. These are
31
+ * names that parsed successfully (they are in the removed-names list so the
32
+ * schema accepted them) but are no longer active bundled names and must be
33
+ * dropped from the effective config.
34
+ */
35
+ export declare function computeDroppedNames(names: readonly string[], allowedSet: ReadonlySet<string>): string[];
36
+ /**
37
+ * Emit a `[systematic]` warning for each dropped name that has not already
38
+ * been warned about in this load invocation. The `warned` set is local to a
39
+ * single load call -- callers must NOT share it across independent loads.
40
+ * Passing a fresh set per load ensures no cross-load suppression.
41
+ */
42
+ export declare function warnDroppedNames(dropped: string[], field: string, warned: Set<string>): void;
29
43
  export declare function loadConfig(projectDir: string): SystematicConfig;
30
44
  export declare function loadConfigWithSources(projectDir: string): SourceAwareConfigResult;
31
45
  export declare function getConfigPaths(projectDir: string): {
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Known-removed bundled skill and agent names.
3
+ *
4
+ * Names listed here were present in a past release but have since been removed
5
+ * from the bundled catalog. They are accepted (warn-and-ignore) in
6
+ * `disabled_skills` and `disabled_agents` so that upgrading does not brick
7
+ * configs that disabled them before removal. Genuinely-unknown names (typos,
8
+ * names that never existed) are still rejected by strict validation.
9
+ *
10
+ * This list is empty until v3 populates it with the first removed names.
11
+ * Add a name here only when the corresponding skill or agent directory is
12
+ * actually deleted from the repo.
13
+ */
14
+ export declare const REMOVED_BUNDLED_SKILL_NAMES: readonly string[];
15
+ export declare const REMOVED_BUNDLED_AGENT_NAMES: readonly string[];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fro.bot/systematic",
3
- "version": "2.31.0",
3
+ "version": "2.32.0",
4
4
  "description": "Structured engineering workflows for OpenCode",
5
5
  "type": "module",
6
6
  "homepage": "https://fro.bot/systematic",
@@ -66,18 +66,18 @@
66
66
  },
67
67
  "devDependencies": {
68
68
  "@biomejs/biome": "2.4.16",
69
- "@opencode-ai/plugin": "1.15.13",
70
- "@opencode-ai/sdk": "1.15.13",
69
+ "@opencode-ai/plugin": "1.17.3",
70
+ "@opencode-ai/sdk": "1.17.3",
71
71
  "@semantic-release/exec": "7.1.0",
72
72
  "@types/bun": "latest",
73
73
  "@types/js-yaml": "4.0.9",
74
- "@types/node": "24.13.0",
74
+ "@types/node": "24.13.2",
75
75
  "ajv": "8.20.0",
76
76
  "ajv-formats": "3.0.1",
77
77
  "conventional-changelog-conventionalcommits": "9.3.1",
78
78
  "markdownlint-cli": "0.48.0",
79
79
  "rimraf": "6.1.3",
80
- "semantic-release": "25.0.3",
80
+ "semantic-release": "25.0.5",
81
81
  "semantic-release-export-data": "1.2.0",
82
82
  "typescript": "6.0.3"
83
83
  },
@@ -44,11 +44,11 @@ task({
44
44
  })
45
45
  ```
46
46
 
47
- **When background is available:** OpenCode exposes `task_status` in the tool list and the `task()` tool description includes background mode instructions. This requires `OPENCODE_EXPERIMENTAL_BACKGROUND_SUBAGENTS=true` or the umbrella `OPENCODE_EXPERIMENTAL=true` flag.
47
+ **When background is available:** `OPENCODE_EXPERIMENTAL_BACKGROUND_SUBAGENTS=true` (or the umbrella `OPENCODE_EXPERIMENTAL=true`) must be set. When enabled, `background: true` runs the subagent asynchronously. OpenCode automatically injects the result into the parent session as a synthetic message when the subagent completes. You are notified; you do not poll.
48
48
 
49
- **When background is unavailable:** `task_status` is not registered. Passing `background: true` returns an error. Fall back to foreground dispatch — dispatch subagents serially or in small foreground batches instead.
49
+ **When background is unavailable:** Passing `background: true` returns an error. Fall back to foreground dispatch — dispatch subagents serially or in small foreground batches instead.
50
50
 
51
- **Check before assuming:** If you see `task_status` in your available tools, background dispatch is enabled. If you do not see it, use foreground dispatch only.
51
+ **Check before assuming:** Rely on whether `background: true` is accepted (i.e., the env flag is set). If it returns an error, use foreground dispatch only.
52
52
 
53
53
  ## Serial vs Parallel Dispatch
54
54
 
@@ -119,7 +119,7 @@ After subagents complete, the orchestrator synthesizes results:
119
119
  - If a subagent returns an error or its output is incomplete, diagnose before dispatching dependent units.
120
120
  - Do not dispatch dependent units on a broken tree.
121
121
  - Retry a failed unit by dispatching a new `task()` call with a corrected prompt, or resume the prior session with `task_id`.
122
- - For background tasks (when available): use `task_status` to poll or wait for terminal state before retrying.
122
+ - For background tasks (when available): wait for the automatic completion notification (the result is injected into the parent session). Do not poll or sleep. Retry by dispatching a new `task()` with a corrected prompt, or resume with `task_id`.
123
123
 
124
124
  ## Quick Reference
125
125
 
@@ -128,7 +128,7 @@ After subagents complete, the orchestrator synthesizes results:
128
128
  | Units have dependencies | Serial foreground dispatch |
129
129
  | Units share files | Serial foreground dispatch |
130
130
  | Units are independent, no file overlap | Parallel foreground dispatch |
131
- | Background available + long-running work | Parallel background dispatch with `task_status` |
131
+ | Background available + long-running work | Parallel background dispatch; results are pushed back to the parent on completion (no polling) |
132
132
  | Background unavailable | Foreground only — serial or batched |
133
133
  | Subagent fails | Diagnose, fix prompt, retry with new `task()` or resume with `task_id` |
134
134
  | File collision detected post-parallel | Stage non-colliding files (if workflow owns git ops), re-run colliding units serially |
@@ -137,8 +137,8 @@ After subagents complete, the orchestrator synthesizes results:
137
137
 
138
138
  | Mistake | Fix |
139
139
  |---|---|
140
- | Assuming `task_status` is always available | Check tool list first; fall back to foreground if absent |
140
+ | Polling or sleeping to wait for a background subagent | Background results are pushed into the parent session automatically; never poll or sleep |
141
141
  | Parallel subagents staging or committing | Instruct subagents not to stage/commit; the current workflow owner handles git ops when applicable, otherwise synthesize file inventory and results for the caller or user |
142
142
  | Dispatching dependent units without waiting | Always wait for prerequisites to complete and verify their output |
143
143
  | Ignoring file overlap in parallel batches | Run the Parallel Safety Check before every parallel dispatch |
144
- | Using `background: true` without checking the flag | Only use when `task_status` appears in available tools |
144
+ | Using `background: true` without the experimental flag enabled | Only use background when `OPENCODE_EXPERIMENTAL_BACKGROUND_SUBAGENTS=true`; otherwise dispatch foreground |