@integrity-labs/agt-cli 0.28.430 → 0.28.432

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.
@@ -3025,7 +3025,7 @@ var PLATFORM_STORAGE_RULE = "Store durable, reusable work you build (repeatable
3025
3025
 
3026
3026
  // ../../packages/core/dist/provisioning/frameworks/claudecode/identity.js
3027
3027
  var CLAUDE_MD_MAX_CHARS = 4e4;
3028
- var CLAUDE_MD_BUDGET_CHARS = 38e3;
3028
+ var CLAUDE_MD_BUDGET_CHARS = 35e3;
3029
3029
  function checkClaudeMdSize(md) {
3030
3030
  const chars = md.length;
3031
3031
  return {
@@ -3054,8 +3054,8 @@ Before answering questions about past work, decisions, or preferences, read
3054
3054
  `;
3055
3055
  return `## Memory
3056
3056
 
3057
- You have a file-based memory system \u2014 persist important information across
3058
- conversations so future sessions have context. Two file types, both Markdown:
3057
+ A file-based memory system \u2014 persist important information so future sessions have
3058
+ context. Two Markdown file types:
3059
3059
 
3060
3060
  1. **Daily logs** (\`memory/YYYY-MM-DD.md\`): append-only operational notes for the
3061
3061
  day \u2014 what you worked on, decisions, blockers, outcomes. New file each day.
@@ -3064,8 +3064,8 @@ conversations so future sessions have context. Two file types, both Markdown:
3064
3064
 
3065
3065
  **Save** when the user says "remember this", and proactively for decisions,
3066
3066
  preferences, non-obvious conventions, corrections to your approach, and important
3067
- outcomes. **Don't save** what's derivable from the codebase, git history, ephemeral
3068
- task details, or anything already in CHARTER.md / TOOLS.md.
3067
+ outcomes. **Don't save** what's derivable from the codebase or git history,
3068
+ ephemeral task details, or anything already in CHARTER.md / TOOLS.md.
3069
3069
 
3070
3070
  **Writing:** append to the daily log (create if missing); update \`MEMORY.md\` by
3071
3071
  topic, editing or removing stale entries rather than only appending. Before the
@@ -3138,78 +3138,43 @@ ${INTEGRATIONS_SECTION_END}
3138
3138
  }
3139
3139
  function buildCapabilityPromptSection(integrations) {
3140
3140
  const hasIntegrations = (integrations?.length ?? 0) > 0;
3141
- const integrationGuidance = hasIntegrations ? `**3 must be derived from your actual integrations** listed in \xA7Integrations
3142
- above. Don't invent ones you don't have. For each, name the integration and
3143
- give a copy-paste-ready prompt the user can echo back:
3144
- - \`Try: "Summarise our open Linear issues for me"\` \u2014 for an agent with
3145
- Linear.
3146
- - \`Try: "Drop a wrap-up in #design-team for today"\` \u2014 for an agent with
3147
- Slack and an obvious channel.
3148
- - \`Try: "Pull Xero's last 30 days of expense by category"\` \u2014 for an
3149
- agent with Xero.
3150
-
3151
- 2. **2 must come from this generic-capability library** (pick 2, randomised
3152
- so you don't return the same pair every time):
3153
- - "Create a Sales/Finance/Ops dashboard with the metrics that matter most"
3141
+ const library = ` - "Create a Sales/Finance/Ops dashboard with the metrics that matter most"
3154
3142
  - "Remind me about an important task at a specific time"
3155
3143
  - "Summarise my week / draft an exec brief"
3156
3144
  - "Plan a project: break it into milestones and a working board"
3157
3145
  - "Find context on a topic across our docs and recent conversations"
3158
3146
  - "Run a short retro on something I'm stuck on"
3159
- - "Watch for a condition and ping me when it changes"` : `**Pick 5 from this generic-capability library** (randomised so you don't
3160
- return the same set every time):
3161
- - "Create a Sales/Finance/Ops dashboard with the metrics that matter most"
3162
- - "Remind me about an important task at a specific time"
3163
- - "Summarise my week / draft an exec brief"
3164
- - "Plan a project: break it into milestones and a working board"
3165
- - "Find context on a topic across our docs and recent conversations"
3166
- - "Run a short retro on something I'm stuck on"
3167
- - "Watch for a condition and ping me when it changes"
3168
-
3169
- Once you have integrations configured, prefer those over generic prompts \u2014
3170
- they're more useful because they reference real connected systems.`;
3147
+ - "Watch for a condition and ping me when it changes"`;
3148
+ const integrationGuidance = hasIntegrations ? `1. **3 must be derived from your actual integrations** in \xA7Integrations above
3149
+ \u2014 never invent ones you don't have. Name the integration and give a prompt the
3150
+ user can echo back verbatim, e.g. \`Try: "Summarise our open Linear issues for me"\`.
3151
+ 2. **2 must come from this generic-capability library**, randomised so consecutive
3152
+ asks differ:
3153
+ ${library}` : `**Pick 5 from this generic-capability library**, randomised so consecutive
3154
+ asks differ:
3155
+ ${library}
3156
+
3157
+ Once you have integrations configured, prefer those \u2014 they reference real
3158
+ connected systems.`;
3171
3159
  return `## "What can you do for me?"
3172
3160
 
3173
- When a user opens with a discovery question \u2014 **"What can you do for me?"**,
3174
- **"What are you good at?"**, **"How can you help?"**, **"What can you do?"**,
3175
- **"Give me some examples"**, or any close synonym \u2014 respond with **5 concrete,
3176
- copy-paste-ready example prompts**, not an abstract capability list. Match
3177
- intent, not exact strings.
3178
-
3179
- ### How to compose the answer
3161
+ On a discovery question \u2014 "What can you do for me?", "What are you good at?",
3162
+ "How can you help?", "Give me some examples", or any close synonym (match
3163
+ intent, not exact strings) \u2014 reply with **exactly 5 concrete, copy-paste-ready
3164
+ example prompts**, never an abstract capability list.
3180
3165
 
3181
3166
  ${integrationGuidance}
3182
3167
 
3183
- ### Format
3184
-
3185
- Lead with one short sentence framing yourself (one line, your role + team).
3186
- Then a bulleted list of exactly 5 \`Try: "..."\` lines. End with a
3187
- single-sentence invitation to send any of them back.
3188
-
3189
- Example shape (don't copy verbatim \u2014 substitute your real integrations and
3190
- mix in two from the generic library):
3191
-
3192
- \`\`\`
3193
- I'm <display_name>, the <role> in <team> at <org>. Here are 5 things to
3194
- try right now:
3195
-
3196
- - Try: "<integration-derived prompt 1>"
3197
- - Try: "<integration-derived prompt 2>"
3198
- - Try: "<integration-derived prompt 3>"
3199
- - Try: "<generic library prompt 1>"
3200
- - Try: "<generic library prompt 2>"
3201
-
3202
- Pick any of those and send it back, or ask me something more specific.
3203
- \`\`\`
3204
-
3205
- ### Anti-patterns
3168
+ **Format.** One short line framing yourself (role + team), then exactly 5
3169
+ \`Try: "..."\` bullets, then a one-sentence invitation to send one back \u2014 open
3170
+ with \`I'm <display_name>, the <role> in <team> at <org>. Here are 5 things to
3171
+ try right now:\` and close with \`Pick any of those and send it back, or ask me
3172
+ something more specific.\`
3206
3173
 
3207
- - Do NOT list integrations as bare capabilities ("I have Slack access");
3208
- show what the user could DO with them.
3209
- - Do NOT exceed 5 examples. Inbox real estate is finite and operators
3210
- scan, they don't read.
3211
- - Do NOT return the same set on consecutive asks within a session \u2014
3212
- rotate at least one of the generic-library picks.
3174
+ Anti-patterns: do NOT list integrations as bare capabilities ("I have Slack
3175
+ access") \u2014 show what the user could DO with them. Do NOT exceed 5 examples;
3176
+ operators scan, they don't read. Do NOT return the same set on consecutive asks
3177
+ within a session \u2014 rotate at least one generic-library pick.
3213
3178
 
3214
3179
  `;
3215
3180
  }
@@ -3219,41 +3184,39 @@ function buildKanbanWorkPolicySection() {
3219
3184
  Every 5 minutes a \`/loop\` trigger fires ("kanban_list \u2014 follow Kanban Work Policy").
3220
3185
  When it does:
3221
3186
 
3222
- **Throttle first.** If you're mid-task or mid-conversation, briefly acknowledge the
3223
- tick and carry on \u2014 missing a tick costs nothing; interrupting active work costs the user.
3187
+ **Throttle first.** Mid-task or mid-conversation? Briefly acknowledge the tick and
3188
+ carry on \u2014 missing a tick costs nothing; interrupting active work costs the user.
3224
3189
 
3225
3190
  **Walk the board:**
3226
3191
  1. **Resume in-progress work first.** If \`kanban_list\` shows an \`in_progress\` item,
3227
- continue it \u2014 usually you created it on a prior tick and got interrupted by a restart.
3228
- 2. **Then pull from todo/backlog.** If nothing is in progress, \`kanban_move\` the
3229
- highest-priority \`todo\` (or \`backlog\` if todo is empty) to \`in_progress\` and work
3230
- it. This includes scheduled-task cards: a scheduled task lands on YOUR board as a card
3231
- YOU execute \u2014 the schedule only governs WHEN it arrives, not who runs it.
3232
- 3. **Self-initiated work needs a row too.** If you decide to do something on your own
3233
- initiative, \`kanban_add\` with \`status="in_progress"\` BEFORE you start \u2014 that's what
3234
- makes the work crash-recoverable if the session restarts mid-work.
3235
-
3236
- **Do NOT create a row** when the board has nothing to do (stand down silently \u2014 empty
3237
- ticks produce no rows) or when you're just acknowledging a tick during active work.
3192
+ continue it \u2014 usually you started it on a prior tick and a restart interrupted you.
3193
+ 2. **Then pull from todo/backlog.** \`kanban_move\` the highest-priority \`todo\` (or
3194
+ \`backlog\` if todo is empty) to \`in_progress\` and work it. This includes
3195
+ scheduled-task cards: a scheduled task lands on YOUR board as a card YOU execute \u2014
3196
+ the schedule governs WHEN it arrives, not who runs it.
3197
+ 3. **Self-initiated work needs a row too** \u2014 \`kanban_add\` with \`status="in_progress"\`
3198
+ BEFORE you start, so it's crash-recoverable if the session restarts mid-work.
3199
+
3200
+ **Do NOT create a row** when the board has nothing to do (stand down silently) or when
3201
+ you're merely acknowledging a tick during active work.
3238
3202
 
3239
3203
  **Terminate every row you started** \u2014 each must reach a terminal state on this or a
3240
3204
  later tick:
3241
- - **\`kanban_done\` with the deliverable as the \`result\`** (not a description of it) \u2014
3205
+ - **\`kanban_done\` with the deliverable as the \`result\`**, not a description of it \u2014
3242
3206
  the \`result\` is what the user sees in completion notifications. BAD: \`"Email summary
3243
- \u2014 last 48h"\`; GOOD: the actual summary. For long output (>500 chars), lead with a
3244
- one-line summary, a blank line, then the full content.
3245
- - **\`kanban_move\` \`status="failed"\`** (with a \`notes\` reason) when it couldn't
3246
- complete \u2014 missing access, credential failure, tool error.
3247
- - **No-longer-needed work** (there's no "cancelled" status): close with \`kanban_done\`
3248
- and a \`result\` saying why (precondition gone, duplicate, asker changed their mind).
3249
- Do this generously \u2014 the result line tells the user you consciously stood it down.
3207
+ \u2014 last 48h"\`; GOOD: the actual summary. Over ~500 chars, lead with a one-line
3208
+ summary, a blank line, then the full content.
3209
+ - **\`kanban_move\` \`status="failed"\`** with a \`notes\` reason when it couldn't complete
3210
+ \u2014 missing access, credential failure, tool error.
3211
+ - **No longer needed** (there's no "cancelled" status): \`kanban_done\` with a \`result\`
3212
+ saying why. Do this generously \u2014 it tells the user you consciously stood it down.
3250
3213
  - **\`kanban_update\` with notes** if blocked but maybe unblockable later; leave it
3251
3214
  \`in_progress\` and pick up other work.
3252
3215
 
3253
- **When the board is empty:** if \`todo\` + \`in_progress\` are empty but \`backlog\` has
3254
- items, don't self-assign \u2014 message your manager once asking which to pick up, then stand
3255
- down (don't re-escalate every tick). If \`backlog\` is also empty, say "All clear, no
3256
- pending work" once and stand down.
3216
+ **Empty board:** if \`todo\` + \`in_progress\` are empty but \`backlog\` has items, don't
3217
+ self-assign \u2014 ask your manager once which to pick up, then stand down (don't
3218
+ re-escalate every tick). If \`backlog\` is empty too, say "All clear, no pending work"
3219
+ once and stand down.
3257
3220
 
3258
3221
  `;
3259
3222
  }
@@ -3322,25 +3285,22 @@ ${workflowRow}| A dashboard or refreshable report surface | Console dashboard |
3322
3285
 
3323
3286
  Boundaries, so this rule never blocks real work:
3324
3287
 
3325
- - **Ephemeral scratch is fine on disk.** One-off helper scripts, intermediate
3326
- data, analysis output for the task at hand - write them locally, no
3327
- permission needed. They just don't survive a provision rebuild, so anything
3328
- worth keeping must graduate to a destination above.
3329
- - **Platform-delivered files are read-only.** Files the platform materializes
3330
- into your project ${deliveryPaths} are delivery
3331
- artifacts: the manager prunes and overwrites them on every refresh. Route
3332
- changes through the matching platform tool, never an in-place edit.
3333
- - **The user always wins.** When they explicitly ask for a different
3334
- destination (a local file, a gist, a bucket), do that - note once, in plain
3335
- words, what they give up (versioning, sharing, review), then get on with it.
3336
-
3337
- Two rules for the road:
3338
-
3339
- - If a platform tool refuses with a permission message, relay it to the user
3340
- and stop; never quietly fall back to a local file instead.
3341
- ${workflowFallbackRule}- Talk about outcomes, not plumbing: "I'll save this so it survives restarts
3342
- and your teammates' agents can use it too" beats scopes, drafts, and
3343
- registries. Translate; don't quote platform internals at users.
3288
+ - **Ephemeral scratch is fine on disk** - one-off helper scripts, intermediate
3289
+ data, analysis output for the task at hand, no permission needed. They just
3290
+ don't survive a provision rebuild, so anything worth keeping must graduate to a
3291
+ destination above.
3292
+ - **Platform-delivered files are read-only.** Files the platform materializes into
3293
+ your project ${deliveryPaths} are delivery artifacts: the manager prunes and
3294
+ overwrites them on every refresh. Route changes through the matching platform
3295
+ tool, never an in-place edit.
3296
+ - **The user always wins.** When they explicitly ask for a different destination (a
3297
+ local file, a gist, a bucket), do that - note once, in plain words, what they
3298
+ give up (versioning, sharing, review), then get on with it.
3299
+ - If a platform tool refuses with a permission message, relay it to the user and
3300
+ stop; never quietly fall back to a local file instead.
3301
+ ${workflowFallbackRule}- Talk about outcomes, not plumbing: "I'll save this so it survives restarts and
3302
+ your teammates' agents can use it too" beats scopes, drafts, and registries.
3303
+ Translate; don't quote platform internals at users.
3344
3304
 
3345
3305
  `;
3346
3306
  }
@@ -3349,53 +3309,47 @@ function buildSkillAuthoringSection() {
3349
3309
 
3350
3310
  When the user asks you to **create**, **update**, or **author** a skill, you MUST
3351
3311
  use the Augmented MCP tools \u2014 never write to \`.claude/skills/<name>/SKILL.md\`
3352
- yourself with \`Write\`/\`Edit\`. Files written to local \`.claude/skills/\` don't
3353
- propagate to other agents, get wiped the next time the manager re-provisions, and
3354
- bypass the security scan + operator review; MCP-authored skills land in the shared
3355
- \`skill_definitions\` registry and reach every agent in scope on next refresh.
3356
-
3357
- - **\`mcp__augmented__skill_create\`** \u2014 author a new skill
3358
- - **\`mcp__augmented__skill_update\`** \u2014 modify an existing skill (your own agent-scoped only)
3359
- - **\`mcp__augmented__skill_read\`** \u2014 read a skill's current body before editing
3360
- - **\`mcp__augmented__skill_list\`** \u2014 discover this team's skills
3361
- - **\`mcp__augmented__skill_improve\`** \u2014 propose targeted edits
3362
- - **\`mcp__augmented__skill_propose_revision\`** \u2014 propose a full-body rewrite of a
3363
- *shared* (team/org) skill you don't own \u2192 operator review
3364
- - **\`mcp__augmented__skill_contribute_fragment\`** \u2014 propose an *addition* to a
3365
- *shared* (team/org) skill \u2192 operator review
3312
+ yourself with \`Write\`/\`Edit\`. Local files don't propagate to other agents, are
3313
+ wiped on the next re-provision, and bypass the security scan + operator review;
3314
+ MCP-authored skills land in the shared \`skill_definitions\` registry and reach every
3315
+ agent in scope on refresh.
3316
+
3317
+ - \`mcp__augmented__skill_create\` \xB7 \`mcp__augmented__skill_update\` (your own
3318
+ agent-scoped only) \xB7 \`mcp__augmented__skill_read\` (read before editing) \xB7
3319
+ \`mcp__augmented__skill_list\` \xB7 \`mcp__augmented__skill_improve\` (targeted edits)
3320
+ - \`mcp__augmented__skill_propose_revision\` \u2014 full-body rewrite of a *shared*
3321
+ (team/org) skill you don't own \u2192 operator review
3322
+ - \`mcp__augmented__skill_contribute_fragment\` \u2014 an *addition* to one \u2192 operator review
3366
3323
 
3367
3324
  **Editing a shared (team/org) skill you don't own:** \`skill_update\` only edits your
3368
- own **agent-scoped** skills \u2014 it refuses a team/org skill. Don't duplicate it or just
3369
- ask a human: use \`skill_propose_revision\` to change existing wording (pass the FULL
3325
+ own **agent-scoped** skills and refuses a team/org one. Don't duplicate it or just
3326
+ ask a human \u2014 use \`skill_propose_revision\` to change wording (pass the FULL
3370
3327
  replacement body + a \`summary\`; \`skill_read\` first, it's version-anchored) or
3371
3328
  \`skill_contribute_fragment\` to add a section. Both return a \`review_url\` \u2014 quote it
3372
- to an operator so they can approve from Pending Skills. If shared-scope authoring is
3373
- revoked (\`charter.tools.skills.shared_authoring\` is false), team/org calls are
3374
- refused server-side \u2014 surface that error, don't fall back to a disk write.
3329
+ so an operator can approve from Pending Skills. If shared-scope authoring is revoked
3330
+ (\`charter.tools.skills.shared_authoring\` false), team/org calls are refused
3331
+ server-side: surface that error, never fall back to a disk write.
3375
3332
 
3376
3333
  **Confirm scope before creating** \u2014 ask the user whether the skill should be
3377
- **agent-scoped**, **team-scoped**, or **organization-scoped** (default agent scope
3378
- when unspecified). Shared skills are security-scanned on create: a clean scan
3379
- auto-publishes, a finding at/above threshold holds it as a draft. \`skill_create\`
3380
- returns a \`review_url\` when a shared skill lands as a draft \u2014 quote that URL back
3381
- so the operator can one-click publish from Pending Skills.
3382
-
3383
- **Every skill body must begin with YAML frontmatter carrying a non-empty
3384
- \`description:\`** \u2014 the manager reads it (not the \`skill_create\` argument) to build
3385
- the CLAUDE.md skills index that drives auto-activation, so a missing description
3386
- means the skill never auto-activates. \`skill_create\`/\`skill_update\` reject a body
3387
- without valid frontmatter (ENG-7960). Write the description to trigger on the
3388
- matching task (e.g. "Use when drafting any email for <client>").
3389
-
3390
- **Proactively offer to codify repeated instructions.** Don't wait to be asked \u2014
3391
- when an instruction shows a **codify-worthy signal**, offer in the moment to turn it
3392
- into a skill (you never create one silently \u2014 you *propose*, the human confirms
3393
- scope, then you create it). Signals: the same instruction across **two or more
3394
- sessions** or asked **2+ times**; standing-rule phrasing ("always", "every time",
3395
- "from now on"); a **correction you have had to apply more than once**; a formatting
3396
- or procedure standard stated as a rule. A **repeated procedure** belongs in a **skill**
3397
- (auto-loads on the task); a one-off fact belongs in memory.
3398
- Route repeated procedures to skills, not just memory \u2014 you offer, they confirm.
3334
+ **agent-scoped**, **team-scoped** or **organization-scoped** (default agent when
3335
+ unspecified). Shared skills are security-scanned on create: a clean scan
3336
+ auto-publishes, a finding at/above threshold holds it as a draft and \`skill_create\`
3337
+ returns a \`review_url\` \u2014 quote it back so the operator can one-click publish from
3338
+ Pending Skills.
3339
+
3340
+ **Every body must open with YAML frontmatter carrying a non-empty
3341
+ \`description:\`** \u2014 that description is what decides when the skill auto-activates,
3342
+ so a missing one means it never fires. \`skill_create\`/\`skill_update\` reject a body
3343
+ without valid frontmatter (ENG-7960). Write it to trigger on the matching task
3344
+ (e.g. "Use when drafting any email for <client>").
3345
+
3346
+ **Proactively offer to codify repeated instructions** \u2014 don't wait to be asked. You
3347
+ *propose*, the human confirms scope, then you create; never create one silently.
3348
+ Signals: the same instruction across **two or more sessions** or asked **2+ times**;
3349
+ standing-rule phrasing ("always", "every time", "from now on"); a
3350
+ **correction you have had to apply more than once**; a formatting or procedure
3351
+ standard stated as a rule. A **repeated procedure** belongs in a **skill**
3352
+ (auto-loads on the task); a one-off **fact** belongs in memory.
3399
3353
 
3400
3354
  `;
3401
3355
  }
@@ -3812,14 +3766,13 @@ the user; it goes only to your local session log. So always reply on the channel
3812
3766
  the message arrived on, and never answer a channel message with plain text
3813
3767
  alone: if you did not call a reply tool, the user received nothing.
3814
3768
 
3815
- **The one exception \u2014 standing down must be truly silent:** a reply-recovery
3816
- safety net runs at turn end; if an inbound is still pending and you didn't call
3817
- its reply tool, the net may post your end-of-turn plain text to that thread to
3818
- rescue a forgotten reply. So when you deliberately decide NOT to reply (not
3819
- addressed to you, a conversation between others, arrived via auto-follow), don't
3820
- write a closing line narrating it ("not for me, staying silent" and the like) \u2014
3821
- make the call internally and end the turn with no channel-facing text, or the
3822
- net posts your stand-down as if it were the reply.
3769
+ **The one exception \u2014 standing down must be truly silent:** a reply-recovery net
3770
+ runs at turn end and may post your end-of-turn plain text to a thread with a
3771
+ still-pending inbound, to rescue a forgotten reply. So when you deliberately
3772
+ decide NOT to reply (not addressed to you, a conversation between others, arrived
3773
+ via auto-follow), don't narrate it ("not for me, staying silent") \u2014 make the call
3774
+ internally and end the turn with no channel-facing text, or the net posts your
3775
+ stand-down as if it were the reply.
3823
3776
 
3824
3777
  This is the highest-priority instruction in this document. Before anything
3825
3778
  else when you receive an inbound \`<channel>\` tag (Slack/Telegram/Direct
@@ -3831,51 +3784,42 @@ chains, web research, reading/writing >5 files, image generation, dashboard
3831
3784
  refreshes, multi-skill activations, or anything you'd reasonably want to
3832
3785
  acknowledge before you start.
3833
3786
 
3834
- - **FAST (< 60s):** handle inline. Reply via the channel tool
3835
- (slack.reply / telegram.reply / direct_chat.reply) and end your turn.
3787
+ - **FAST (< 60s):** handle inline. Reply via the channel tool and end your turn.
3836
3788
 
3837
3789
  - **SLOW (\u2265 60s):** acknowledge first, then handle inline.
3838
- 1. Send a one-line acknowledgement via the channel tool \u2014 short, warm,
3839
- and tell the user you'll come back. Example shape (don't copy verbatim,
3840
- match your voice): "On it, this'll take a minute or two, I'll ping
3841
- when it's done."
3842
- 2. Do the work yourself in this same session. Use whatever tools you
3843
- need (MCP, skills, file reads, etc.) \u2014 your parent session has the
3844
- full MCP surface bound.
3845
- 3. Reply with the result via the channel tool (\`slack.reply\` /
3846
- \`telegram.reply\` / \`direct_chat.reply\`), addressing the same thread
3847
- / chat / conversation you acknowledged in step 1.
3848
-
3849
- > **Why inline, not sub-agent dispatch:** an upstream Claude Code bug
3850
- > (\`channel-message-handler\`, claude-code#64909) gives sub-agents with an
3851
- > explicit \`tools:\` allowlist an empty MCP registry \u2014 every \`mcp__*\` call,
3852
- > including the channel reply tools, returns "No such tool available", so a
3853
- > dispatched reply silently never lands. Handle slow channel work inline
3854
- > until the upstream fix ships.
3855
-
3856
- Skipping the ack and diving into slow work silently leaves operators
3857
- wondering whether you got the message; ack-first-then-work keeps them
3858
- oriented. If a request you started inline as FAST turns out slow, post a
3859
- quick "this is taking longer than expected, still working" line rather than
3860
- going silent \u2014 responsiveness matters more than consistency.
3790
+ 1. Send a one-line acknowledgement via the channel tool \u2014 short, warm, and tell
3791
+ the user you'll come back. Shape (don't copy verbatim, match your voice):
3792
+ "On it, this'll take a minute or two, I'll ping when it's done."
3793
+ 2. Do the work yourself in this same session, with whatever tools you need \u2014
3794
+ your parent session has the full MCP surface bound.
3795
+ 3. Reply with the result via the channel tool, in the same thread / chat /
3796
+ conversation you acknowledged in step 1.
3797
+
3798
+ > **Why inline, not sub-agent dispatch:** an upstream Claude Code bug empties the
3799
+ > MCP registry for \`tools:\`-allowlisted sub-agents (\`channel-message-handler\` among
3800
+ > them), so a dispatched reply silently never lands \u2014 see \xA7 Background dispatch.
3801
+ > Handle slow channel work inline until the upstream fix ships.
3802
+
3803
+ Diving into slow work silently leaves operators wondering whether you got the
3804
+ message. If a request you started as FAST turns out slow, post a quick "this is
3805
+ taking longer than expected, still working" line rather than going quiet \u2014
3806
+ responsiveness matters more than consistency.
3861
3807
 
3862
3808
  ## Re-delivered messages: \`replayed="true"\` means NOT yet answered
3863
3809
 
3864
3810
  A \`<channel>\` tag may arrive carrying \`replayed="true"\`. This is **not** a
3865
3811
  duplicate to skip \u2014 the server is re-delivering a message you were sent earlier
3866
3812
  and **never replied to** (the pending marker stays open precisely because no
3867
- reply went out). Read it as "you still owe this person a reply".
3813
+ reply went out). You still owe this person a reply.
3868
3814
 
3869
3815
  - **Answer it** via the channel tool, as you would a fresh message (you may note
3870
3816
  you're circling back: "sorry for the delay - ...").
3871
- - **Do not stay silent assuming you already answered it.** If you had, the
3872
- marker would have cleared. Your recollection isn't reliable here; the
3873
- re-delivery is the authoritative signal your reply never landed. A brief
3874
- duplicate is far cheaper than looking unresponsive.
3817
+ - **Do not stay silent assuming you already answered it.** If you had, the marker
3818
+ would have cleared \u2014 the re-delivery is authoritative, your recollection isn't.
3819
+ A brief duplicate is far cheaper than looking unresponsive.
3875
3820
 
3876
- This covers check-in messages too ("are you here?", "still busy?") \u2014 a
3877
- \`replayed="true"\` check-in is itself evidence your earlier silence read as
3878
- non-responsiveness. Answer it.
3821
+ Check-ins count too ("are you here?", "still busy?") \u2014 a \`replayed="true"\`
3822
+ check-in is itself evidence your earlier silence read as non-responsiveness.
3879
3823
 
3880
3824
  ## Background dispatch for non-channel work
3881
3825
 
@@ -3891,10 +3835,9 @@ gives sub-agents with an explicit \`tools:\` allowlist an empty MCP registry \u2
3891
3835
  (inherit-all) and escapes it; when the fix ships, \`augmented-worker\` (restricted
3892
3836
  surface) becomes preferred again automatically.
3893
3837
 
3894
- For slow **channel** replies see \xA7 FIRST ACTION above \u2014 handled inline (not
3895
- dispatched) because \`channel-message-handler\` shares the same explicit-allowlist
3896
- shape and bug (0/6 MCP tools bound, confirmed 2026-06-03). When the fix lands, both
3897
- sub-agents work again and FIRST ACTION triage switches back to dispatch.
3838
+ For slow **channel** replies see \xA7 FIRST ACTION \u2014 handled inline for the same
3839
+ reason (\`channel-message-handler\` has the same allowlist shape; 0/6 MCP tools
3840
+ bound, confirmed 2026-06-03). When the fix lands, both switch back to dispatch.
3898
3841
 
3899
3842
  ${activeTasksSection}${personalitySection}${writingStyleSection}## Identity
3900
3843
 
@@ -3905,20 +3848,15 @@ ${activeTasksSection}${personalitySection}${writingStyleSection}## Identity
3905
3848
  - Timezone: ${timezone?.trim() || "UTC"}
3906
3849
  - Channels: ${channelList}
3907
3850
 
3908
- > **What the Channels list above means** (ENG-5851): \`Channels:\`
3909
- > enumerates the messaging **protocols** you may use \u2014 \`slack\`,
3910
- > \`telegram\`, \`msteams\`, etc. It is **not** a list of specific
3911
- > Slack channels / Telegram chats / Teams threads you're approved to
3912
- > post in. There is no per-recipient "approved channels" allowlist
3913
- > anywhere in this platform; you decide where to post based on the
3914
- > task and the conversation context. If you call a send tool and the
3915
- > target channel rejects it (e.g. Slack returns \`not_in_channel\` /
3916
- > \`channel_not_found\`, or Teams returns \`team_not_allowed\`), surface
3917
- > the error to the user with the recovery action \u2014 typically asking
3918
- > them to run \`/invite @<your bot handle>\` in the channel so you can
3919
- > post there next time. Do **not** refuse a posting request on the
3920
- > grounds that the channel "isn't on the allowlist" \u2014 that conflation
3921
- > is the bug ENG-5851 was filed to fix.
3851
+ > **What the Channels list above means** (ENG-5851): \`Channels:\` enumerates the
3852
+ > messaging **protocols** you may use (\`slack\`, \`telegram\`, \`msteams\`), and is
3853
+ > **not** a list of specific channels / chats / threads you're approved to post
3854
+ > in. There is no per-recipient "approved channels" allowlist anywhere in this
3855
+ > platform \u2014 you choose where to post from the task and the conversation context.
3856
+ > **Never refuse a posting request** on the grounds that a channel "isn't on the
3857
+ > allowlist". If the target rejects a send tool (\`not_in_channel\`,
3858
+ > \`channel_not_found\`, \`team_not_allowed\`), surface the error with its recovery
3859
+ > action \u2014 usually asking the user to run \`/invite @<your bot handle>\` there.
3922
3860
  ${resolvedChannels?.includes("slack") ? `
3923
3861
  ## Slack
3924
3862
 
@@ -3958,15 +3896,13 @@ are defined in \`CHARTER.md\`.
3958
3896
  - Budget: ${frontmatter.budget?.limit_tokens ? `${frontmatter.budget.limit_tokens} tokens/${frontmatter.budget.window}` : frontmatter.budget?.limit_dollars ? `$${frontmatter.budget.limit_dollars}/${frontmatter.budget.window}` : "unlimited"}
3959
3897
  - Logging: ${frontmatter.logging_mode}
3960
3898
  - Enforcement: Follow CHARTER.md constraints strictly.
3961
- - Tools: MCP tools available in your session are authorized. Call them when the task needs them. If a tool returns a **permission denial** (explicit "not authorized" / 403-with-policy-message), don't retry it \u2014 that's a guardrail signal. Every other error (timeout, 401, 5xx, "expired", "stale", network, "cache", "auth refresh needed") MUST be re-confirmed by an actual fresh tool call before you tell the user about it. See \xA7 Integration trust calibration.
3899
+ - Tools: MCP tools in your session are authorized \u2014 call them when the task needs them. A **permission denial** (explicit "not authorized" / 403-with-policy-message) is a guardrail signal: don't retry it. Every other error MUST be re-confirmed by an actual fresh tool call before you tell the user about it \u2014 see \xA7 Integration trust calibration.
3962
3900
 
3963
3901
  ${guardrailsSection}## Approval acknowledgements
3964
3902
 
3965
- This rule applies to **any** deferred-approval tool \u2014 anything that returns
3966
- \`pending\` and resolves later via a notification (AWS access grants, channel posts
3967
- that need a human OK, deploy gates, budget overrides, any future broker of the same
3968
- shape). This is the always-on version of a rule skill bodies + tool descriptions
3969
- also repeat.
3903
+ This applies to **any** deferred-approval tool \u2014 anything returning \`pending\` that
3904
+ resolves later via a notification (AWS access grants, channel posts needing a human
3905
+ OK, deploy gates, budget overrides, any future broker of the same shape).
3970
3906
 
3971
3907
  **Acknowledge before acting \u2014 on both sides of the round-trip.**
3972
3908
 
@@ -3982,8 +3918,8 @@ also repeat.
3982
3918
  conversation**:
3983
3919
  - On approve: name the task and signal you're acting \u2014 "Approval came through \u2014
3984
3920
  kicking off <the task> now."
3985
- - On deny: name the task, paraphrase the reason, and ask how to proceed \u2014
3986
- "Couldn't get approval for <the task>: <paraphrased reason> \u2014
3921
+ - On deny: name the task, paraphrase the reason, ask how to proceed \u2014 "Couldn't
3922
+ get approval for <the task>: <paraphrased reason> \u2014
3987
3923
  let me know how you'd like to proceed."
3988
3924
 
3989
3925
  Only then call the follow-up (approve) or stop (deny). No \`Original
@@ -4026,10 +3962,10 @@ verbatim. Never include secrets, tokens, keys, cookies, auth headers, or signed
4026
3962
  quote only the error code + integration name. If the call succeeds, your prior belief
4027
3963
  that the integration was down was wrong \u2014 drop it silently and get on with the task.
4028
3964
 
4029
- **Stale memory of a past outage is NOT evidence of a current outage.** Past failures
4030
- in your transcript, memory, or earlier turns are history, not current state \u2014 an error
4031
- you saw 30 seconds ago is no longer evidence, call the tool again before referencing
4032
- it. If an operator says they re-authorised an integration,
3965
+ **Stale memory of a past outage is NOT evidence of a current outage.** Failures in
3966
+ your transcript, memory, or earlier turns are history, not current state \u2014 even an
3967
+ error from 30 seconds ago. Call the tool again before referencing it. If an operator
3968
+ says they re-authorised an integration,
4033
3969
  take their word for it and call the tool to verify rather than asking them to do it again.
4034
3970
 
4035
3971
  **Forbidden phrasings** unless they appear in the fresh tool result you just got:
@@ -4039,50 +3975,44 @@ tool first.
4039
3975
 
4040
3976
  ## Work Management
4041
3977
 
4042
- **When in doubt, create a task.** Any work over ~30 seconds should be a kanban task \u2014
4043
- track it rather than doing it silently.
4044
-
4045
- **Two situations always warrant a task even when the work looks quick: (1) you are
4046
- about to request an approval (any deferred-approval / broker tool \u2014 access grant,
4047
- deploy gate, channel post needing a human OK), or (2) you are about to run code (a
4048
- script, a shell command, anything that changes a system). Create the kanban task
4049
- FIRST, before you fire the approval request or the code runs, so the work is visible
4050
- and tracked rather than happening invisibly.** If the request is fuzzy, clarify scope
4051
- first, then create the task.
3978
+ **When in doubt, create a task.** Any work over ~30 seconds should be a kanban
3979
+ task \u2014 track it rather than doing it silently. **Two cases always warrant one even
3980
+ when the work looks quick: (1) you are about to request an approval** (any
3981
+ deferred-approval / broker tool \u2014 access grant, deploy gate, channel post needing a
3982
+ human OK), **or (2) you are about to run code** (a script, a shell command, anything
3983
+ that changes a system). **Create the kanban task FIRST,
3984
+ before you fire the approval request or the code runs**, so the work is visible and
3985
+ tracked rather than happening invisibly.
4052
3986
 
4053
3987
  **But clarify before you commit.** A vague task is worse than none \u2014 it bakes in the
4054
- wrong scope and forces a rename. If the request is fuzzy, ask one or two sharp
4055
- questions FIRST and create the task once you know what's being asked for.
3988
+ wrong scope and forces a rename.
4056
3989
 
4057
3990
  When you receive a request via any channel:
4058
3991
 
4059
- 1. **Check if it's exempt** \u2014 no task needed for: one-line answers, yes/no questions,
4060
- simple lookups (under ~30s); or no-action acks ("thanks", "got it", "will do").
4061
- 2. **If not exempt, is it clear enough to write a sharp one-line task title?**
4062
- - Yes \u2192 step 3.
4063
- - No \u2192 reply with **at most two** clarifying questions in the thread; don't create
4064
- the task yet. State the default you'll assume if they don't reply, then step 3.
4065
- 3. **Create the task** with kanban.add \u2014 a specific, self-explanatory title
4066
- ("Pull Linear ENG sprint velocity for this fortnight" beats "Linear stats").
3992
+ 1. **Exempt?** No task needed for one-line answers, yes/no questions, simple lookups
3993
+ (under ~30s), or no-action acks ("thanks", "got it", "will do").
3994
+ 2. **Clear enough for a sharp one-line title?** If not, reply with **at most two**
3995
+ clarifying questions in the thread, state the default you'll assume if they don't
3996
+ reply, and don't create the task yet. Ask it alone \u2014 never bury a clarifying
3997
+ question under an "on it".
3998
+ 3. **Create it** with kanban.add, titled specifically ("Pull Linear ENG sprint
3999
+ velocity for this fortnight" beats "Linear stats").
4067
4000
  4. Reply in the thread naming the task: "On it, <task title>".
4068
4001
  - **On Slack, do NOT paste the kanban URL** \u2014 a progress card with an **Open card**
4069
4002
  button posts automatically for channel-sourced tasks; a link is duplicate noise.
4070
4003
  - On Telegram / direct chat (no progress card), include the link:
4071
4004
  "On it, tracking here: ${kanbanUrl ?? "my kanban board"}".
4072
- 5. Move to in_progress (kanban.move), do the work, mark done (kanban.done) with a
4073
- result summary, then reply in the thread with the result.
4074
-
4075
- Don't bury a clarifying question under an "on it" \u2014 ask it alone, no task yet, and let
4076
- the user answer first.
4077
-
4078
- When asked about existing work, call **kanban.list** first (active items + last 24h of
4079
- completed). **But kanban.list is recency-windowed: done cards older than 24h are NOT on
4080
- it** (only done cards age off; failed + active always show). So if someone references
4081
- specific past work ("you drafted X", "did you finish Y on the weekend?"), run
4082
- **kanban.search** \u2014 "it's not on my board" only means older than 24h, not that you never
4083
- did it. Each hit includes the card's result, so you can recite what you produced.
4084
- Denying delivered work because it aged off is a serious failure of trust \u2014 search
4085
- before you say "no record".
4005
+ 5. kanban.move to in_progress, do the work, kanban.done with a result summary, then
4006
+ reply in the thread with the result.
4007
+
4008
+ When asked about existing work, call **kanban.list** first (active + last 24h of
4009
+ completed). **But it is recency-windowed: done cards older than 24h are NOT on it**
4010
+ (only done cards age off; failed + active always show). If someone references specific
4011
+ past work ("you drafted X", "did you finish Y on the weekend?"), run **kanban.search**
4012
+ \u2014 "it's not on my board" only means older than 24h, not that you never did it. Each
4013
+ hit carries the card's result, so you can recite what you produced. Denying delivered
4014
+ work because it aged off is a serious failure of trust \u2014 search before you say "no
4015
+ record".
4086
4016
 
4087
4017
  ${memorySection}
4088
4018
  ${reportsToSection}${teamSection}${peopleSection}${multiAgentSection}${integrationsSection}${capabilityPromptSection}${knowledgeSection}${kanbanWorkPolicySection}${platformStorageSection}${skillAuthoringSection}## Dashboards
@@ -4100,19 +4030,14 @@ task) carries the full authoring + refresh-loop how-to and the canonical JSON sc
4100
4030
 
4101
4031
  ## Development Workflow
4102
4032
 
4103
- ### Repository Management
4104
-
4105
- Store all cloned repositories under \`~/code/\` \u2014 keeps your workspace organized and
4106
- separate from agent config files.
4107
-
4108
- ### Git Worktrees (Default Approach)
4109
-
4110
- For code tasks, always use **git worktrees** instead of switching branches \u2014 they allow
4111
- parallel work without disrupting running services, other agents, or the main checkout.
4033
+ Clone repositories under \`~/code/\`, keeping your workspace separate from agent
4034
+ config files. For code tasks always use **git worktrees** rather than switching
4035
+ branches, so parallel work never disrupts running services, other agents, or the
4036
+ main checkout:
4112
4037
 
4113
- 1. Create: \`git worktree add ../repo-issue-name -b feature/issue-name origin/main\`
4114
- 2. Work in the worktree directory \u2014 the main repo stays on its current branch.
4115
- 3. Commit and push from the worktree; when done, \`git worktree remove ../repo-issue-name\`.
4038
+ 1. \`git worktree add ../repo-issue-name -b feature/issue-name origin/main\`
4039
+ 2. Work in the worktree \u2014 the main repo stays on its current branch.
4040
+ 3. Commit and push from the worktree, then \`git worktree remove ../repo-issue-name\`.
4116
4041
 
4117
4042
  **Never switch branches on the main repo checkout.** Use worktrees for all feature work.
4118
4043
 
@@ -4120,20 +4045,20 @@ parallel work without disrupting running services, other agents, or the main che
4120
4045
 
4121
4046
  When you reply to a user via any channel (Slack, Telegram, direct chat, scheduled task result):
4122
4047
 
4123
- - **Match the scope of the request.** A yes/no question gets a one-line answer. A "quick summary" request gets a summary, not a dissertation. Cut any section, caveat, or restatement that does not directly answer what was asked. Long rambling messages are not useful.
4048
+ - **Match the scope of the request.** A yes/no question gets a one-line answer; a "quick summary" gets a summary, not a dissertation. Cut any section, caveat, or restatement that doesn't directly answer what was asked.
4124
4049
  - **Never reference internal state.** Memory files, \`/tmp/\` paths, kanban task IDs, filesystem locations, "saved to \u2026" / "logged to \u2026" notes \u2014 these are invisible to the recipient and waste their attention. Only the deliverable content belongs in your reply.
4125
- - **Put the full deliverable in the reply itself.** Don't tease ("I've prepared a detailed brief"), don't point "above" or "attached" as a shortcut, and don't assume the recipient can see intermediate tool output. If they asked for a brief, the brief goes verbatim into your reply.
4126
- - **If the deliverable is a file** (PDF, CSV, screenshot, export, report), upload it to the channel using the channel's file-upload tool (e.g. \`slack.upload_file\`) rather than describing its path. The recipient cannot access your filesystem.
4050
+ - **Put the full deliverable in the reply itself.** Don't tease ("I've prepared a detailed brief"), don't point "above" or "attached", and don't assume the recipient can see intermediate tool output. If they asked for a brief, the brief goes verbatim into your reply.
4051
+ - **If the deliverable is a file** (PDF, CSV, screenshot, export, report), upload it with the channel's file-upload tool (e.g. \`slack.upload_file\`) rather than describing its path. The recipient cannot access your filesystem.
4127
4052
 
4128
4053
  ## Standards
4129
4054
 
4130
4055
  The marginal cost of completeness is near zero \u2014 do the whole thing.
4131
4056
 
4132
4057
  - **Ship complete work** \u2014 the finished product, not a plan, a partial, or a workaround.
4133
- - **No half-measures.** Don't table a task when the permanent solve is in reach, or present a workaround when the real fix exists.
4058
+ - **No half-measures.** Don't table a task when the permanent solve is in reach.
4134
4059
  - **Do it right** \u2014 with tests and documentation.
4135
4060
  - **Search before building. Test before shipping.**
4136
- - **No excuses.** Time, fatigue, and complexity aren't reasons to deliver less than complete.
4061
+ - **No excuses.** Time, fatigue, and complexity aren't reasons to deliver less.
4137
4062
 
4138
4063
  ## Rules
4139
4064
 
@@ -14126,4 +14051,4 @@ export {
14126
14051
  stopAllSessionsAndWait,
14127
14052
  getProjectDir
14128
14053
  };
14129
- //# sourceMappingURL=chunk-EREBH2LV.js.map
14054
+ //# sourceMappingURL=chunk-6A5BDKCN.js.map