@codyswann/lisa 2.147.3 → 2.147.5

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 (84) hide show
  1. package/package.json +1 -1
  2. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  3. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  4. package/plugins/lisa/rules/eager/leaf-only-lifecycle.md +1 -1
  5. package/plugins/lisa/rules/reference/leaf-only-lifecycle.md +1 -1
  6. package/plugins/lisa/skills/github-validate-issue/SKILL.md +1 -1
  7. package/plugins/lisa/skills/jira-validate-ticket/SKILL.md +1 -1
  8. package/plugins/lisa/skills/linear-validate-issue/SKILL.md +2 -0
  9. package/plugins/lisa-agy/plugin.json +1 -1
  10. package/plugins/lisa-agy/skills/github-validate-issue/SKILL.md +1 -1
  11. package/plugins/lisa-agy/skills/jira-validate-ticket/SKILL.md +1 -1
  12. package/plugins/lisa-agy/skills/linear-validate-issue/SKILL.md +2 -0
  13. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  14. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  15. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  16. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  17. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  18. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  19. package/plugins/lisa-copilot/rules/eager/leaf-only-lifecycle.md +1 -1
  20. package/plugins/lisa-copilot/rules/reference/leaf-only-lifecycle.md +1 -1
  21. package/plugins/lisa-copilot/skills/github-validate-issue/SKILL.md +1 -1
  22. package/plugins/lisa-copilot/skills/jira-validate-ticket/SKILL.md +1 -1
  23. package/plugins/lisa-copilot/skills/linear-validate-issue/SKILL.md +2 -0
  24. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  25. package/plugins/lisa-cursor/rules/leaf-only-lifecycle-reference.mdc +1 -1
  26. package/plugins/lisa-cursor/rules/leaf-only-lifecycle.mdc +1 -1
  27. package/plugins/lisa-cursor/skills/github-validate-issue/SKILL.md +1 -1
  28. package/plugins/lisa-cursor/skills/jira-validate-ticket/SKILL.md +1 -1
  29. package/plugins/lisa-cursor/skills/linear-validate-issue/SKILL.md +2 -0
  30. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  31. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  32. package/plugins/lisa-expo-agy/plugin.json +1 -1
  33. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  34. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  35. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  36. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  37. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  38. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  39. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  41. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  42. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  43. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  46. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  47. package/plugins/lisa-openclaw/skills/lisa-openclaw-connect-repo-topic/SKILL.md +22 -12
  48. package/plugins/lisa-openclaw/skills/lisa-openclaw-connect-repo-topic/references/repo-topic-config.md +42 -0
  49. package/plugins/lisa-openclaw/skills/lisa-openclaw-connect-staff/references/platform-routing.md +35 -0
  50. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  51. package/plugins/lisa-openclaw-agy/skills/lisa-openclaw-connect-repo-topic/SKILL.md +22 -12
  52. package/plugins/lisa-openclaw-agy/skills/lisa-openclaw-connect-repo-topic/references/repo-topic-config.md +42 -0
  53. package/plugins/lisa-openclaw-agy/skills/lisa-openclaw-connect-staff/references/platform-routing.md +35 -0
  54. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-openclaw-copilot/skills/lisa-openclaw-connect-repo-topic/SKILL.md +22 -12
  56. package/plugins/lisa-openclaw-copilot/skills/lisa-openclaw-connect-repo-topic/references/repo-topic-config.md +42 -0
  57. package/plugins/lisa-openclaw-copilot/skills/lisa-openclaw-connect-staff/references/platform-routing.md +35 -0
  58. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-openclaw-cursor/skills/lisa-openclaw-connect-repo-topic/SKILL.md +22 -12
  60. package/plugins/lisa-openclaw-cursor/skills/lisa-openclaw-connect-repo-topic/references/repo-topic-config.md +42 -0
  61. package/plugins/lisa-openclaw-cursor/skills/lisa-openclaw-connect-staff/references/platform-routing.md +35 -0
  62. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  64. package/plugins/lisa-rails-agy/plugin.json +1 -1
  65. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  66. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  67. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  68. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  69. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  70. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  71. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  72. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  73. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  74. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  75. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  76. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  77. package/plugins/src/base/rules/eager/leaf-only-lifecycle.md +1 -1
  78. package/plugins/src/base/rules/reference/leaf-only-lifecycle.md +1 -1
  79. package/plugins/src/base/skills/github-validate-issue/SKILL.md +1 -1
  80. package/plugins/src/base/skills/jira-validate-ticket/SKILL.md +1 -1
  81. package/plugins/src/base/skills/linear-validate-issue/SKILL.md +2 -0
  82. package/plugins/src/openclaw/skills/lisa-openclaw-connect-repo-topic/SKILL.md +22 -12
  83. package/plugins/src/openclaw/skills/lisa-openclaw-connect-repo-topic/references/repo-topic-config.md +42 -0
  84. package/plugins/src/openclaw/skills/lisa-openclaw-connect-staff/references/platform-routing.md +35 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.147.3",
3
+ "version": "2.147.5",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -101,18 +101,28 @@ The worker prepares the safe target and launches the CLI; it does not edit files
101
101
 
102
102
  ### 6. Bind the topic
103
103
 
104
- Route the topic to the dispatcher: set
105
- `channels.telegram.groups.<group-id>.topics.<topic-id>.agentId = <topic-slug>-dispatch`, keep
106
- allowlist policy, and add `allowFrom` only when membership must be narrower than the group. Leave the
107
- topic-level `requireMention = false` (the default) so the agent activates on any message — the topic
108
- is bound 1:1 to this dispatcher, so an @mention carries no routing information and is pure friction.
109
- Set it to `true` only for a shared-workspace topic where humans also coordinate with each other and
110
- you don't want every line to spawn a run; the group-level `requireMention` stays `true` regardless.
111
- See "Mention gating" in [references/repo-topic-config.md](references/repo-topic-config.md) for the
112
- tradeoff. The topic `systemPrompt` must state the scope mode, treat each native-reply
113
- root as an independent request context, confirm repo selection only in folder-scoped mode, spawn the
114
- worker with an explicit repo path, and return the worker result to the topic. Back up
115
- `~/.openclaw/openclaw.json` before editing and preserve unrelated routes.
104
+ Route the topic to the dispatcher. In single-account Telegram configs, set
105
+ `channels.telegram.groups.<group-id>.topics.<topic-id>.agentId = <topic-slug>-dispatch`. In
106
+ multi-account Telegram configs, set the same route under the owning bot account:
107
+ `channels.telegram.accounts.<account-id>.groups.<group-id>.topics.<topic-id>.agentId =
108
+ <topic-slug>-dispatch`. Account configs do not inherit root `channels.telegram.groups` routes, so a
109
+ root-only route can validate while the actual bot still ignores the topic-level `requireMention`,
110
+ `agentId`, and prompt. When in doubt, mirror the route under the owning account and keep any existing
111
+ root group route only as a fallback/documentation shape.
112
+
113
+ Keep allowlist policy, and add `allowFrom` only when membership must be narrower than the group.
114
+ Leave the topic-level `requireMention = false` (the default) so the agent activates on any message
115
+ the topic is bound 1:1 to this dispatcher, so an @mention carries no routing information and is pure
116
+ friction. Set it to `true` only for a shared-workspace topic where humans also coordinate with each
117
+ other and you don't want every line to spawn a run; the group-level `requireMention` stays `true`
118
+ regardless. See "Mention gating" in [references/repo-topic-config.md](references/repo-topic-config.md)
119
+ for the tradeoff. The topic `systemPrompt` must state the scope mode, treat each native-reply root as
120
+ an independent request context, confirm repo selection only in folder-scoped mode, spawn the worker
121
+ with an explicit repo path, and return the worker result to the topic. If the route may return
122
+ generated files, the prompt must also say to write or copy returnable artifacts under
123
+ `~/.openclaw/media` before calling `message(action="send")`, because outbound local media delivery
124
+ rejects arbitrary `/tmp` paths. Back up `~/.openclaw/openclaw.json` before editing and preserve
125
+ unrelated routes.
116
126
 
117
127
  ### 7. Validate + self-test
118
128
 
@@ -70,6 +70,13 @@ repos:
70
70
 
71
71
  ## Topic route
72
72
 
73
+ Use `channels.telegram.groups` for a single-account Telegram setup. If
74
+ `channels.telegram.accounts` is configured, bind the route under the owning bot account instead:
75
+ `channels.telegram.accounts.<account-id>.groups.<group-id>`. Account-scoped Telegram configs do not
76
+ inherit root `channels.telegram.groups` routes.
77
+
78
+ ### Single-account route
79
+
73
80
  ```json5
74
81
  {
75
82
  "channels": {
@@ -99,6 +106,41 @@ repos:
99
106
  }
100
107
  ```
101
108
 
109
+ ### Multi-account route
110
+
111
+ ```json5
112
+ {
113
+ "channels": {
114
+ "telegram": {
115
+ "accounts": {
116
+ "<account-id>": {
117
+ "groups": {
118
+ "<group-id>": {
119
+ "groupPolicy": "allowlist",
120
+ "requireMention": true,
121
+ "allowFrom": ["<telegram-user-id>"],
122
+ "topics": {
123
+ "<topic-id>": {
124
+ "agentId": "<topic-slug>-dispatch",
125
+ "requireMention": false,
126
+ "systemPrompt": "Use the topic's configured scope mode. For single-repo, pass the fixed repo path to <topic-slug>-codex. For folder-scoped, confirm the inferred repo or repo set unless the user already named it explicitly, then pass the explicit repo path(s) to <topic-slug>-codex. Treat each native reply root as an independent request context. If generated files need to be returned as Telegram attachments, write or copy them under ~/.openclaw/media before calling message(action=\"send\"), because outbound local media delivery rejects arbitrary /tmp paths."
127
+ }
128
+ }
129
+ }
130
+ }
131
+ }
132
+ }
133
+ }
134
+ }
135
+ }
136
+ ```
137
+
138
+ ## File return path
139
+
140
+ When a repo-topic agent returns generated files to Telegram, use the OpenClaw `message` tool with
141
+ real local file paths. Write or copy returnable artifacts under `~/.openclaw/media` before sending;
142
+ outbound local media delivery rejects arbitrary `/tmp` paths even when the file exists.
143
+
102
144
  ## Mention gating
103
145
 
104
146
  `requireMention` controls whether a message must @-mention the bot before the agent activates. It is
@@ -14,6 +14,13 @@ all unrelated agents, channels, routes, and tokens.
14
14
 
15
15
  ## Telegram — facilitator topic route
16
16
 
17
+ Use `channels.telegram.groups` for a single-account Telegram setup. If the OpenClaw config has
18
+ `channels.telegram.accounts`, put the route under the owning bot account at
19
+ `channels.telegram.accounts.<account-id>.groups.<telegram-supergroup-id>`; account-scoped Telegram
20
+ configs do not inherit root group routes.
21
+
22
+ ### Single-account route
23
+
17
24
  ```json5
18
25
  {
19
26
  "channels": {
@@ -36,6 +43,34 @@ all unrelated agents, channels, routes, and tokens.
36
43
  }
37
44
  ```
38
45
 
46
+ ### Multi-account route
47
+
48
+ ```json5
49
+ {
50
+ "channels": {
51
+ "telegram": {
52
+ "accounts": {
53
+ "<account-id>": {
54
+ "groups": {
55
+ "<telegram-supergroup-id>": {
56
+ "groupPolicy": "allowlist",
57
+ "requireMention": true,
58
+ "allowFrom": ["<telegram-user-id>"],
59
+ "topics": {
60
+ "<facilitator-topic-id>": {
61
+ "agentId": "<facilitator-agent-id>",
62
+ "requireMention": true
63
+ }
64
+ }
65
+ }
66
+ }
67
+ }
68
+ }
69
+ }
70
+ }
71
+ }
72
+ ```
73
+
39
74
  ## Slack — facilitator channel route
40
75
 
41
76
  ```json5
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.147.3",
3
+ "version": "2.147.5",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -101,18 +101,28 @@ The worker prepares the safe target and launches the CLI; it does not edit files
101
101
 
102
102
  ### 6. Bind the topic
103
103
 
104
- Route the topic to the dispatcher: set
105
- `channels.telegram.groups.<group-id>.topics.<topic-id>.agentId = <topic-slug>-dispatch`, keep
106
- allowlist policy, and add `allowFrom` only when membership must be narrower than the group. Leave the
107
- topic-level `requireMention = false` (the default) so the agent activates on any message — the topic
108
- is bound 1:1 to this dispatcher, so an @mention carries no routing information and is pure friction.
109
- Set it to `true` only for a shared-workspace topic where humans also coordinate with each other and
110
- you don't want every line to spawn a run; the group-level `requireMention` stays `true` regardless.
111
- See "Mention gating" in [references/repo-topic-config.md](references/repo-topic-config.md) for the
112
- tradeoff. The topic `systemPrompt` must state the scope mode, treat each native-reply
113
- root as an independent request context, confirm repo selection only in folder-scoped mode, spawn the
114
- worker with an explicit repo path, and return the worker result to the topic. Back up
115
- `~/.openclaw/openclaw.json` before editing and preserve unrelated routes.
104
+ Route the topic to the dispatcher. In single-account Telegram configs, set
105
+ `channels.telegram.groups.<group-id>.topics.<topic-id>.agentId = <topic-slug>-dispatch`. In
106
+ multi-account Telegram configs, set the same route under the owning bot account:
107
+ `channels.telegram.accounts.<account-id>.groups.<group-id>.topics.<topic-id>.agentId =
108
+ <topic-slug>-dispatch`. Account configs do not inherit root `channels.telegram.groups` routes, so a
109
+ root-only route can validate while the actual bot still ignores the topic-level `requireMention`,
110
+ `agentId`, and prompt. When in doubt, mirror the route under the owning account and keep any existing
111
+ root group route only as a fallback/documentation shape.
112
+
113
+ Keep allowlist policy, and add `allowFrom` only when membership must be narrower than the group.
114
+ Leave the topic-level `requireMention = false` (the default) so the agent activates on any message
115
+ the topic is bound 1:1 to this dispatcher, so an @mention carries no routing information and is pure
116
+ friction. Set it to `true` only for a shared-workspace topic where humans also coordinate with each
117
+ other and you don't want every line to spawn a run; the group-level `requireMention` stays `true`
118
+ regardless. See "Mention gating" in [references/repo-topic-config.md](references/repo-topic-config.md)
119
+ for the tradeoff. The topic `systemPrompt` must state the scope mode, treat each native-reply root as
120
+ an independent request context, confirm repo selection only in folder-scoped mode, spawn the worker
121
+ with an explicit repo path, and return the worker result to the topic. If the route may return
122
+ generated files, the prompt must also say to write or copy returnable artifacts under
123
+ `~/.openclaw/media` before calling `message(action="send")`, because outbound local media delivery
124
+ rejects arbitrary `/tmp` paths. Back up `~/.openclaw/openclaw.json` before editing and preserve
125
+ unrelated routes.
116
126
 
117
127
  ### 7. Validate + self-test
118
128
 
@@ -70,6 +70,13 @@ repos:
70
70
 
71
71
  ## Topic route
72
72
 
73
+ Use `channels.telegram.groups` for a single-account Telegram setup. If
74
+ `channels.telegram.accounts` is configured, bind the route under the owning bot account instead:
75
+ `channels.telegram.accounts.<account-id>.groups.<group-id>`. Account-scoped Telegram configs do not
76
+ inherit root `channels.telegram.groups` routes.
77
+
78
+ ### Single-account route
79
+
73
80
  ```json5
74
81
  {
75
82
  "channels": {
@@ -99,6 +106,41 @@ repos:
99
106
  }
100
107
  ```
101
108
 
109
+ ### Multi-account route
110
+
111
+ ```json5
112
+ {
113
+ "channels": {
114
+ "telegram": {
115
+ "accounts": {
116
+ "<account-id>": {
117
+ "groups": {
118
+ "<group-id>": {
119
+ "groupPolicy": "allowlist",
120
+ "requireMention": true,
121
+ "allowFrom": ["<telegram-user-id>"],
122
+ "topics": {
123
+ "<topic-id>": {
124
+ "agentId": "<topic-slug>-dispatch",
125
+ "requireMention": false,
126
+ "systemPrompt": "Use the topic's configured scope mode. For single-repo, pass the fixed repo path to <topic-slug>-codex. For folder-scoped, confirm the inferred repo or repo set unless the user already named it explicitly, then pass the explicit repo path(s) to <topic-slug>-codex. Treat each native reply root as an independent request context. If generated files need to be returned as Telegram attachments, write or copy them under ~/.openclaw/media before calling message(action=\"send\"), because outbound local media delivery rejects arbitrary /tmp paths."
127
+ }
128
+ }
129
+ }
130
+ }
131
+ }
132
+ }
133
+ }
134
+ }
135
+ }
136
+ ```
137
+
138
+ ## File return path
139
+
140
+ When a repo-topic agent returns generated files to Telegram, use the OpenClaw `message` tool with
141
+ real local file paths. Write or copy returnable artifacts under `~/.openclaw/media` before sending;
142
+ outbound local media delivery rejects arbitrary `/tmp` paths even when the file exists.
143
+
102
144
  ## Mention gating
103
145
 
104
146
  `requireMention` controls whether a message must @-mention the bot before the agent activates. It is
@@ -14,6 +14,13 @@ all unrelated agents, channels, routes, and tokens.
14
14
 
15
15
  ## Telegram — facilitator topic route
16
16
 
17
+ Use `channels.telegram.groups` for a single-account Telegram setup. If the OpenClaw config has
18
+ `channels.telegram.accounts`, put the route under the owning bot account at
19
+ `channels.telegram.accounts.<account-id>.groups.<telegram-supergroup-id>`; account-scoped Telegram
20
+ configs do not inherit root group routes.
21
+
22
+ ### Single-account route
23
+
17
24
  ```json5
18
25
  {
19
26
  "channels": {
@@ -36,6 +43,34 @@ all unrelated agents, channels, routes, and tokens.
36
43
  }
37
44
  ```
38
45
 
46
+ ### Multi-account route
47
+
48
+ ```json5
49
+ {
50
+ "channels": {
51
+ "telegram": {
52
+ "accounts": {
53
+ "<account-id>": {
54
+ "groups": {
55
+ "<telegram-supergroup-id>": {
56
+ "groupPolicy": "allowlist",
57
+ "requireMention": true,
58
+ "allowFrom": ["<telegram-user-id>"],
59
+ "topics": {
60
+ "<facilitator-topic-id>": {
61
+ "agentId": "<facilitator-agent-id>",
62
+ "requireMention": true
63
+ }
64
+ }
65
+ }
66
+ }
67
+ }
68
+ }
69
+ }
70
+ }
71
+ }
72
+ ```
73
+
39
74
  ## Slack — facilitator channel route
40
75
 
41
76
  ```json5
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.147.3",
3
+ "version": "2.147.5",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -101,18 +101,28 @@ The worker prepares the safe target and launches the CLI; it does not edit files
101
101
 
102
102
  ### 6. Bind the topic
103
103
 
104
- Route the topic to the dispatcher: set
105
- `channels.telegram.groups.<group-id>.topics.<topic-id>.agentId = <topic-slug>-dispatch`, keep
106
- allowlist policy, and add `allowFrom` only when membership must be narrower than the group. Leave the
107
- topic-level `requireMention = false` (the default) so the agent activates on any message — the topic
108
- is bound 1:1 to this dispatcher, so an @mention carries no routing information and is pure friction.
109
- Set it to `true` only for a shared-workspace topic where humans also coordinate with each other and
110
- you don't want every line to spawn a run; the group-level `requireMention` stays `true` regardless.
111
- See "Mention gating" in [references/repo-topic-config.md](references/repo-topic-config.md) for the
112
- tradeoff. The topic `systemPrompt` must state the scope mode, treat each native-reply
113
- root as an independent request context, confirm repo selection only in folder-scoped mode, spawn the
114
- worker with an explicit repo path, and return the worker result to the topic. Back up
115
- `~/.openclaw/openclaw.json` before editing and preserve unrelated routes.
104
+ Route the topic to the dispatcher. In single-account Telegram configs, set
105
+ `channels.telegram.groups.<group-id>.topics.<topic-id>.agentId = <topic-slug>-dispatch`. In
106
+ multi-account Telegram configs, set the same route under the owning bot account:
107
+ `channels.telegram.accounts.<account-id>.groups.<group-id>.topics.<topic-id>.agentId =
108
+ <topic-slug>-dispatch`. Account configs do not inherit root `channels.telegram.groups` routes, so a
109
+ root-only route can validate while the actual bot still ignores the topic-level `requireMention`,
110
+ `agentId`, and prompt. When in doubt, mirror the route under the owning account and keep any existing
111
+ root group route only as a fallback/documentation shape.
112
+
113
+ Keep allowlist policy, and add `allowFrom` only when membership must be narrower than the group.
114
+ Leave the topic-level `requireMention = false` (the default) so the agent activates on any message
115
+ the topic is bound 1:1 to this dispatcher, so an @mention carries no routing information and is pure
116
+ friction. Set it to `true` only for a shared-workspace topic where humans also coordinate with each
117
+ other and you don't want every line to spawn a run; the group-level `requireMention` stays `true`
118
+ regardless. See "Mention gating" in [references/repo-topic-config.md](references/repo-topic-config.md)
119
+ for the tradeoff. The topic `systemPrompt` must state the scope mode, treat each native-reply root as
120
+ an independent request context, confirm repo selection only in folder-scoped mode, spawn the worker
121
+ with an explicit repo path, and return the worker result to the topic. If the route may return
122
+ generated files, the prompt must also say to write or copy returnable artifacts under
123
+ `~/.openclaw/media` before calling `message(action="send")`, because outbound local media delivery
124
+ rejects arbitrary `/tmp` paths. Back up `~/.openclaw/openclaw.json` before editing and preserve
125
+ unrelated routes.
116
126
 
117
127
  ### 7. Validate + self-test
118
128
 
@@ -70,6 +70,13 @@ repos:
70
70
 
71
71
  ## Topic route
72
72
 
73
+ Use `channels.telegram.groups` for a single-account Telegram setup. If
74
+ `channels.telegram.accounts` is configured, bind the route under the owning bot account instead:
75
+ `channels.telegram.accounts.<account-id>.groups.<group-id>`. Account-scoped Telegram configs do not
76
+ inherit root `channels.telegram.groups` routes.
77
+
78
+ ### Single-account route
79
+
73
80
  ```json5
74
81
  {
75
82
  "channels": {
@@ -99,6 +106,41 @@ repos:
99
106
  }
100
107
  ```
101
108
 
109
+ ### Multi-account route
110
+
111
+ ```json5
112
+ {
113
+ "channels": {
114
+ "telegram": {
115
+ "accounts": {
116
+ "<account-id>": {
117
+ "groups": {
118
+ "<group-id>": {
119
+ "groupPolicy": "allowlist",
120
+ "requireMention": true,
121
+ "allowFrom": ["<telegram-user-id>"],
122
+ "topics": {
123
+ "<topic-id>": {
124
+ "agentId": "<topic-slug>-dispatch",
125
+ "requireMention": false,
126
+ "systemPrompt": "Use the topic's configured scope mode. For single-repo, pass the fixed repo path to <topic-slug>-codex. For folder-scoped, confirm the inferred repo or repo set unless the user already named it explicitly, then pass the explicit repo path(s) to <topic-slug>-codex. Treat each native reply root as an independent request context. If generated files need to be returned as Telegram attachments, write or copy them under ~/.openclaw/media before calling message(action=\"send\"), because outbound local media delivery rejects arbitrary /tmp paths."
127
+ }
128
+ }
129
+ }
130
+ }
131
+ }
132
+ }
133
+ }
134
+ }
135
+ }
136
+ ```
137
+
138
+ ## File return path
139
+
140
+ When a repo-topic agent returns generated files to Telegram, use the OpenClaw `message` tool with
141
+ real local file paths. Write or copy returnable artifacts under `~/.openclaw/media` before sending;
142
+ outbound local media delivery rejects arbitrary `/tmp` paths even when the file exists.
143
+
102
144
  ## Mention gating
103
145
 
104
146
  `requireMention` controls whether a message must @-mention the bot before the agent activates. It is
@@ -14,6 +14,13 @@ all unrelated agents, channels, routes, and tokens.
14
14
 
15
15
  ## Telegram — facilitator topic route
16
16
 
17
+ Use `channels.telegram.groups` for a single-account Telegram setup. If the OpenClaw config has
18
+ `channels.telegram.accounts`, put the route under the owning bot account at
19
+ `channels.telegram.accounts.<account-id>.groups.<telegram-supergroup-id>`; account-scoped Telegram
20
+ configs do not inherit root group routes.
21
+
22
+ ### Single-account route
23
+
17
24
  ```json5
18
25
  {
19
26
  "channels": {
@@ -36,6 +43,34 @@ all unrelated agents, channels, routes, and tokens.
36
43
  }
37
44
  ```
38
45
 
46
+ ### Multi-account route
47
+
48
+ ```json5
49
+ {
50
+ "channels": {
51
+ "telegram": {
52
+ "accounts": {
53
+ "<account-id>": {
54
+ "groups": {
55
+ "<telegram-supergroup-id>": {
56
+ "groupPolicy": "allowlist",
57
+ "requireMention": true,
58
+ "allowFrom": ["<telegram-user-id>"],
59
+ "topics": {
60
+ "<facilitator-topic-id>": {
61
+ "agentId": "<facilitator-agent-id>",
62
+ "requireMention": true
63
+ }
64
+ }
65
+ }
66
+ }
67
+ }
68
+ }
69
+ }
70
+ }
71
+ }
72
+ ```
73
+
39
74
  ## Slack — facilitator channel route
40
75
 
41
76
  ```json5
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "2.147.3",
3
+ "version": "2.147.5",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "2.147.3",
3
+ "version": "2.147.5",
4
4
  "description": "Ruby on Rails-specific skills and hooks for RuboCop and ast-grep scanning on edit.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "2.147.3",
3
+ "version": "2.147.5",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "2.147.3",
3
+ "version": "2.147.5",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "2.147.3",
3
+ "version": "2.147.5",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "2.147.3",
3
+ "version": "2.147.5",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "2.147.3",
3
+ "version": "2.147.5",
4
4
  "description": "TypeScript-specific hooks for formatting, linting, and ast-grep scanning on edit.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "2.147.3",
3
+ "version": "2.147.5",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "2.147.3",
3
+ "version": "2.147.5",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "2.147.3",
3
+ "version": "2.147.5",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "2.147.3",
3
+ "version": "2.147.5",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "2.147.3",
3
+ "version": "2.147.5",
4
4
  "description": "Distributable LLM Wiki kernel — ingest, query, lint, and maintain a git-native markdown knowledge base across Claude and Codex.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "2.147.3",
3
+ "version": "2.147.5",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "2.147.3",
3
+ "version": "2.147.5",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "2.147.3",
3
+ "version": "2.147.5",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -7,7 +7,7 @@ A leaf is structurally defined: **no open children** AND not an Epic — the by-
7
7
  ## Invariant
8
8
 
9
9
  - **At decomposition/write time** — only leaves receive the `ready` role. Parent containers are created in their non-ready state.
10
- - **At validate time** — `*-validate-*` FAILs any container carrying the build-ready role.
10
+ - **At validate time** — `*-validate-*` FAILs any container carrying the build-ready role. The parent-declared gate (S7) does **not** FAIL a build-ready leaf with no parent (flat Task/Improvement or childless Story/Spike); a Sub-task is the one exception and always needs a parent.
11
11
  - **At claim time** — build-intake claims leaves only. A container with a stale build-ready role is rolled up or safe-blocked, NEVER implemented.
12
12
 
13
13
  ## Childless-parent exception
@@ -42,7 +42,7 @@ Where a vendor lacks native hierarchy for a given pair, a text link or metadata
42
42
  **Build-ready means a directly implementable leaf work unit.** Therefore:
43
43
 
44
44
  - **At decomposition / write time** — when a PRD decomposes into a hierarchy, only the leaf work units receive the `ready` role (status/label). Parent containers (Epic, Story, Project, and any parent issue that has child work) are created in their normal non-ready state and never receive the build-ready role directly. The leaves are what downstream build intake will claim.
45
- - **At validate time** — the `*-validate-*` gate FAILs any container carrying the build-ready role. This is the symmetric write-side guard: a stale or hand-applied build-ready role on a parent is a lifecycle error.
45
+ - **At validate time** — the `*-validate-*` gate FAILs any container carrying the build-ready role. This is the symmetric write-side guard: a stale or hand-applied build-ready role on a parent is a lifecycle error. Conversely, the parent-declared gate (S7) does **not** FAIL a build-ready leaf that has no parent: a flat Task/Improvement or a childless Story/Spike may stand alone, so a missing parent on such a leaf is `N/A`. Stranding a parentless build-ready leaf would directly violate the "must not be stranded" guarantee below. (A Sub-task is the one exception — it always requires a parent.)
46
46
  - **At claim time** — build intake scans for the `ready` role but dispatches **only leaf work units**. A container that still carries a stale build-ready role (e.g. applied before this rule existed) is **not dispatched**: intake either moves it into the vendor's parent/container progress state or safely blocks it with a clear lifecycle-repair message. Intake never silently implements a container.
47
47
 
48
48
  The permission boundary is the maintainer-applied build-ready role, not authorship — do not add author-based guards (PRD #522 non-goal). This rule narrows *what* may carry that role, not *who* may apply it.