Repository navigation
feat(persona-slack-comms): publish slack-comms as an installable persona pack - #213
Conversation
Comms-only Slack liaison for a multi-agent engineering team. Owns human-facing Slack comms for #proj-cloud via relayfile writeback, relays human messages to the agent team over agent-relay #general, and surfaces milestones/decisions/blockers/security incidents back to humans. Never writes code. Encodes writeback-as-files discipline (threaded replies vs top-level announcements), flush verification via the mount state.json, threaded brief-yet-detailed style with real <@memberid> mentions, and the debug-log drop-guard plus out-of-band relayfile read for recovering dropped/degraded inbound events (documented as a temporary stopgap). Declares the relayfile/relay reading skills and puts the full operating spec in an agentsMd sidecar, matching the persona-maker idiom. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
Your free trial PR review limit of 300 PRs has been reached. Please upgrade your plan to continue using CodeAnt AI. |
|
Warning Review limit reached
More reviews will be available in 45 minutes and 47 seconds. Learn how PR review limits work. Your organization has run out of usage credits. Purchase more in the billing tab. ⌛ How to resolve this issue?After more reviews become available, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available. Please see our Fair Usage Limits Policy for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: ⛔ Files ignored due to path filters (1)
📒 Files selected for processing (14)
📝 WalkthroughWalkthroughAdds a new Slack Comms example: a persona JSON, a detailed operational spec for writeback-based Slack relay and drop-guard recovery, and a README with run/connectivity notes. ChangesSlack Comms Agent Component
Estimated code review effort🎯 2 (Simple) | ⏱️ ~12 minutes
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Code Review
This pull request introduces a new Slack liaison agent, slack-comms, to relay messages between Slack and an engineering agent team. The feedback identifies several key issues: the use of a non-standard and deprecated model (openai-codex/gpt-5.3-codex), filesystem isolation constraints that prevent the sandboxed agent from accessing the host's log file, ambiguity in the path to the credentials file, and a logical limitation in the drop-guard mechanism where dropped events cannot be recovered if the agent is not triggered.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
| } | ||
| ], | ||
| "harness": "codex", | ||
| "model": "openai-codex/gpt-5.3-codex", |
There was a problem hiding this comment.
The model openai-codex/gpt-5.3-codex is not a standard OpenAI model (and the Codex series is deprecated). If this is a placeholder or a custom model, ensure it is supported by the target environment; otherwise, consider using a standard supported model such as gpt-4o to prevent execution failures.
| "model": "openai-codex/gpt-5.3-codex", | |
| "model": "gpt-4o", |
| **Do not trust injection alone.** Treat the debug log as the source of truth: | ||
|
|
||
| ``` | ||
| ~/.agentworkforce/pear/integration-events.log |
There was a problem hiding this comment.
Since this persona runs under the codex harness with sandboxing enabled by default, the agent operates in an isolated filesystem environment. It will not have access to the host's home directory (~/.agentworkforce/pear/integration-events.log). To make the drop-guard feature functional, the log file must be exposed to the sandbox, or the persona configuration must explicitly address how this log is made accessible to the sandboxed agent.
|
|
||
| ``` | ||
| GET https://api.relayfile.dev/v1/workspaces/<workspaceId>/fs/file?path=<urlencoded remote path> | ||
| Authorization: Bearer <token from <mount>/.relay/creds.json> |
There was a problem hiding this comment.
| - Do not poll integrations or the mount on a timer. React to events; recover | ||
| drops via the debug log. |
There was a problem hiding this comment.
Since the agent is event-driven and does not poll, it will only run when a successful event triggers it. If an event is silently dropped, the agent will not be triggered, meaning the drop can only be detected and recovered when a subsequent successful event eventually triggers the agent. Consider clarifying this limitation or recommending a periodic cron/schedule trigger to ensure timely drop recovery.
Per maintainer direction the persona no longer declares @agent-relay/using-agent-relay; it retains setting-up-relayfile, orchestrating-agent-relay, and persona-relayfile-mount. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
Your free trial PR review limit of 300 PRs has been reached. Please upgrade your plan to continue using CodeAnt AI. |
| @@ -0,0 +1,42 @@ | |||
| { | |||
| "id": "slack-comms", | |||
| "intent": "communication", | |||
There was a problem hiding this comment.
🚩 Intent "communication" is not in the closed PERSONA_INTENTS vocabulary
The persona uses "intent": "communication" but this value is not in the PERSONA_INTENTS array at packages/persona-kit/src/constants.ts:30-62. The strict parser parsePersonaSpec (packages/persona-kit/src/parse.ts:1099) calls isIntent(intent) which would reject this value. However, the documented usage (agentworkforce agent ./examples/slack-comms/persona.json) routes through the local persona loader's standaloneSpecFromOverride (packages/cli/src/local-personas.ts:737), which does NOT validate intent against the closed vocabulary — it passes the string through as-is. So the example works as documented, but the intent is outside the recognized vocabulary. If this persona were ever registered in the catalog or processed through parsePersonaSpec, it would fail. All other examples (review-agent uses review, linear-shipper uses implement-frontend, proactive-issue-resolver uses relay-orchestrator) use intents from the closed list. Consider adding "communication" to PERSONA_INTENTS or using an existing intent like "documentation".
Was this helpful? React with 👍 or 👎 to provide feedback.
There was a problem hiding this comment.
🧹 Nitpick comments (4)
examples/slack-comms/slack-comms.md (4)
94-98: 💤 Low valueConsider adding language specifiers to fenced code blocks.
The markdown linter flags this HTTP example block. Adding
httportextwould improve formatting.📝 Suggested fix
-``` +```http GET https://api.relayfile.dev/v1/workspaces/<workspaceId>/fs/file?path=<urlencoded remote path> Authorization: Bearer <token from <mount>/.relay/creds.json> X-Correlation-Id: <any non-empty id></details> <details> <summary>🤖 Prompt for AI Agents</summary>Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.In
@examples/slack-comms/slack-comms.mdaround lines 94 - 98, The fenced code
block showing the HTTP GET example in examples/slack-comms/slack-comms.md lacks
a language specifier; update that triple-backtick fence to include a language
(e.g., usehttp ortext) so the linter formats it correctly and preserves
header capitalization and spacing for the GET request example.</details> <!-- cr-comment:v1:d928ed9ca3f4772b86c1e82f --> _Source: Linters/SAST tools_ --- `27-29`: _💤 Low value_ **Consider adding language specifiers to fenced code blocks.** The markdown linter flags missing language identifiers for better syntax highlighting. This is a minor formatting improvement. <details> <summary>📝 Suggested fix</summary> ```diff -``` +```text .integrations/slack/channels/<channelId>__<slug>/messages/... ``` ``` </details> <details> <summary>🤖 Prompt for AI Agents</summary>Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.In
@examples/slack-comms/slack-comms.mdaround lines 27 - 29, Update the fenced
code block that contains the path string
".integrations/slack/channels/__/messages/..." to include a
language specifier (e.g., change the openingtotext) so the markdown
linter recognizes the language and enables proper syntax highlighting for that
snippet.</details> <!-- cr-comment:v1:60fba0f1ada86331be55134a --> _Source: Linters/SAST tools_ --- `49-51`: _💤 Low value_ **Consider adding language specifiers to fenced code blocks.** The markdown linter flags missing language identifiers. Same minor formatting improvement as above. <details> <summary>📝 Suggested fix</summary> ```diff -``` +```text .integrations/slack/channels/<channelId>__<slug>/messages/.relay/state.json ``` ``` </details> <details> <summary>🤖 Prompt for AI Agents</summary>Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.In
@examples/slack-comms/slack-comms.mdaround lines 49 - 51, The fenced code
block that contains the path string
".integrations/slack/channels/__/messages/.relay/state.json" is
missing a language specifier; update that fenced block in
examples/slack-comms/slack-comms.md to include a language identifier (for
example use "text") after the openingso the block becomestext and
satisfies the markdown linter.</details> <!-- cr-comment:v1:b644e17a5fd1cb86a683faf3 --> _Source: Linters/SAST tools_ --- `81-83`: _💤 Low value_ **Consider adding language specifiers to fenced code blocks.** Same minor markdown linting improvement. <details> <summary>📝 Suggested fix</summary> ```diff -``` +```text ~/.agentworkforce/pear/integration-events.log ``` ``` </details> <details> <summary>🤖 Prompt for AI Agents</summary>Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.In
@examples/slack-comms/slack-comms.mdaround lines 81 - 83, Add a language
specifier to the fenced code block that contains the line
"~/.agentworkforce/pear/integration-events.log" by changing the openingto include a language like "text" (e.g.,text) so the markdown linting and
rendering show the block correctly; update the fenced block that contains that
path accordingly.</details> <!-- cr-comment:v1:23a489842bcdd5a9efd98678 --> _Source: Linters/SAST tools_ </blockquote></details> </blockquote></details> <details> <summary>🤖 Prompt for all review comments with AI agents</summary>Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.Nitpick comments:
In@examples/slack-comms/slack-comms.md:
- Around line 94-98: The fenced code block showing the HTTP GET example in
examples/slack-comms/slack-comms.md lacks a language specifier; update that
triple-backtick fence to include a language (e.g., usehttp ortext) so
the linter formats it correctly and preserves header capitalization and spacing
for the GET request example.- Around line 27-29: Update the fenced code block that contains the path string
".integrations/slack/channels/__/messages/..." to include a
language specifier (e.g., change the openingtotext) so the markdown
linter recognizes the language and enables proper syntax highlighting for that
snippet.- Around line 49-51: The fenced code block that contains the path string
".integrations/slack/channels/__/messages/.relay/state.json" is
missing a language specifier; update that fenced block in
examples/slack-comms/slack-comms.md to include a language identifier (for
example use "text") after the openingso the block becomestext and
satisfies the markdown linter.- Around line 81-83: Add a language specifier to the fenced code block that
contains the line "~/.agentworkforce/pear/integration-events.log" by changing
the openingto include a language like "text" (e.g.,text) so the
markdown linting and rendering show the block correctly; update the fenced block
that contains that path accordingly.</details> --- <details> <summary>ℹ️ Review info</summary> <details> <summary>⚙️ Run configuration</summary> **Configuration used**: Organization UI **Review profile**: CHILL **Plan**: Pro Plus **Run ID**: `373c292e-da52-468f-8cc1-483fff58e0bb` </details> <details> <summary>📥 Commits</summary> Reviewing files that changed from the base of the PR and between 75e95a867071976ca3489360ff3da2f9c9c0d589 and 1b4e9a90727aa502f540bcb78a47f2fef92343e4. </details> <details> <summary>📒 Files selected for processing (3)</summary> * `examples/slack-comms/README.md` * `examples/slack-comms/persona.json` * `examples/slack-comms/slack-comms.md` </details> </details> <!-- This is an auto-generated comment by CodeRabbit for review status -->
|
Fixed two validated PR issues:
Validation run:
I’m not printing |
|
Your free trial PR review limit of 300 PRs has been reached. Please upgrade your plan to continue using CodeAnt AI. |
|
✅ pr-reviewer applied fixes — committed and pushed Fixed two validated PR issues:
Validation run:
I’m not printing |
…ona pack Convert the slack-comms example into a proper npm-installable persona pack under packages/persona-slack-comms, matching the persona-autonomous-actor / persona-nango-integrations convention: - package.json: @agentworkforce/persona-slack-comms@0.1.0 with the agentworkforce.personas field, exports map, files, test script, keywords, publishConfig.access=public, and repository.directory. - personas/slack-comms.json: the persona JSON (source of truth = the former example). Exactly 3 skills (setting-up-relayfile, orchestrating-agent-relay, persona-relayfile-mount); using-agent-relay stays removed. agentsMd points at the shipped ./slack-comms.md sidecar. - personas/slack-comms.md: the agentsMd operating spec, moved into the pack. - index.js / index.d.ts: mirror the reference packs' compatibility exports. - README.md and test/persona.test.mjs adapted from the reference pack. - Delete the old examples/slack-comms/ directory. packages/* is already globbed by pnpm-workspace.yaml, so no manual workspace registration is needed. Validated: node --test passes (8/8) and the real persona loader discovers slack-comms with zero warnings and resolves the sidecar. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
Your free trial PR review limit of 300 PRs has been reached. Please upgrade your plan to continue using CodeAnt AI. |
|
Fixed the demonstrated PR breakage. Changed:
Verified:
Note: the root |
Persona now declares @agent-relay/workspace-layout (navigate the mount via LAYOUT.md / by-id / by-title aliases) and @agent-relay/writeback-as-files (drop-JSON writeback contract, schema discovery, dead-letter recovery) — both core to its read/post job. Skill set is now 5; using-agent-relay stays out. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
Your free trial PR review limit of 300 PRs has been reached. Please upgrade your plan to continue using CodeAnt AI. |
There was a problem hiding this comment.
1 issue found across 8 files (changes from recent commits).
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="packages/persona-slack-comms/README.md">
<violation number="1" location="packages/persona-slack-comms/README.md:79">
P2: Publishing docs reference the wrong GitHub workflow; `publish-persona.yml` publishes `personas-core`, not `persona-*` packs with a `package` selector.</violation>
</file>
Tip: Review your code locally with the cubic CLI to iterate faster.
Re-trigger cubic
There was a problem hiding this comment.
2 issues found across 7 files
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="packages/persona-slack-comms/personas/slack-comms.json">
<violation number="1" location="packages/persona-slack-comms/personas/slack-comms.json:13">
P2: Skill `id` fields use scoped package names (`@agent-relay/...`, `@agent-workforce/...`) instead of bare short names. This breaks the repo convention where `id` is a bare identifier and `source` is the full package/URL reference. All 5 skills are affected.</violation>
</file>
<file name="packages/persona-slack-comms/personas/slack-comms.md">
<violation number="1" location="packages/persona-slack-comms/personas/slack-comms.md:86">
P2: The drop-guard rule is too strict and can cause duplicate recoveries by classifying delayed `injecting` events as dropped immediately.</violation>
</file>
Reply with feedback, questions, or to request a fix.
Re-trigger cubic
| }, | ||
| "skills": [ | ||
| { | ||
| "id": "@agent-relay/setting-up-relayfile", |
There was a problem hiding this comment.
P2: Skill id fields use scoped package names (@agent-relay/..., @agent-workforce/...) instead of bare short names. This breaks the repo convention where id is a bare identifier and source is the full package/URL reference. All 5 skills are affected.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/persona-slack-comms/personas/slack-comms.json, line 13:
<comment>Skill `id` fields use scoped package names (`@agent-relay/...`, `@agent-workforce/...`) instead of bare short names. This breaks the repo convention where `id` is a bare identifier and `source` is the full package/URL reference. All 5 skills are affected.</comment>
<file context>
@@ -0,0 +1,52 @@
+ },
+ "skills": [
+ {
+ "id": "@agent-relay/setting-up-relayfile",
+ "source": "@agent-relay/setting-up-relayfile",
+ "description": "Canonical relayfile mount + writeback recipe. Read for the mount layout (.integrations/...), the writeback-as-files contract, writeback status/retry commands, and the creds/cloud-mount gotchas this persona depends on to read inbound events and post replies."
</file context>
| ``` | ||
|
|
||
| Tail it. Every inbound is logged `received`; a delivered one also logs a | ||
| matching `injecting`. **Any `received` without a matching `injecting` is a |
There was a problem hiding this comment.
P2: The drop-guard rule is too strict and can cause duplicate recoveries by classifying delayed injecting events as dropped immediately.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/persona-slack-comms/personas/slack-comms.md, line 86:
<comment>The drop-guard rule is too strict and can cause duplicate recoveries by classifying delayed `injecting` events as dropped immediately.</comment>
<file context>
@@ -0,0 +1,139 @@
+```
+
+Tail it. Every inbound is logged `received`; a delivered one also logs a
+matching `injecting`. **Any `received` without a matching `injecting` is a
+dropped message you must recover.**
+
</file context>
|
Your free trial PR review limit of 300 PRs has been reached. Please upgrade your plan to continue using CodeAnt AI. |
|
✅ pr-reviewer applied fixes — committed and pushed Reviewed PR #213 against I did not leave any code changes: I found no reproducible breakage in the current checkout. Validation run:
I did not verify GitHub-side CI status, pending checks, or mergeability from GitHub, so I’m not marking this READY. |
- harness/model -> claude / claude-sonnet-4-6 (matches notion-essay-pr Sonnet pairing; reasoning medium / 600s), updated test assertions. - Sidecar: explicit comms-only / stay-in-lane rules — do not diagnose, fix, or task impl workers directly; route every engineering/bug issue (incl. ones affecting own comms) through the coordinator for triage + assignment. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
Your free trial PR review limit of 300 PRs has been reached. Please upgrade your plan to continue using CodeAnt AI. |
|
✅ pr-reviewer applied fixes — committed and pushed Fixed two PR issues:
Verified locally:
I can’t assert GitHub CI/mergeability from this sandbox, so I’m not printing |
|
Your free trial PR review limit of 300 PRs has been reached. Please upgrade your plan to continue using CodeAnt AI. |
* chore(skills): restore autonomous-run-contract SKILL.md Accidentally removed in #213 (slack-comms persona pack) though prpm.json still references it at .agentworkforce/workforce/skills/autonomous-run-contract/SKILL.md. Restored verbatim from 74f881b^. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * chore(skills): restore remaining autonomous-run skill pack The auto-merge-and-composition-safety, dormant-flip-and-rollback, instrument-dont-guess, swarm-blockers-and-gate-scoreboard, and tiered-acceptance skills were accidentally removed in #213 (slack-comms persona pack) but prpm.json still references all of them at .agentworkforce/workforce/skills/. Restored verbatim from 74f881b^. (autonomous-actor.json was intentionally relocated to packages/persona-autonomous-actor and is not restored here.) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: Ricky Schema Cascade <ricky@agent-relay.com> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
) * chore(skills): restore autonomous-run-contract SKILL.md Accidentally removed in #213 (slack-comms persona pack) though prpm.json still references it at .agentworkforce/workforce/skills/autonomous-run-contract/SKILL.md. Restored verbatim from 74f881b^. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * chore(skills): restore remaining autonomous-run skill pack The auto-merge-and-composition-safety, dormant-flip-and-rollback, instrument-dont-guess, swarm-blockers-and-gate-scoreboard, and tiered-acceptance skills were accidentally removed in #213 (slack-comms persona pack) but prpm.json still references all of them at .agentworkforce/workforce/skills/. Restored verbatim from 74f881b^. (autonomous-actor.json was intentionally relocated to packages/persona-autonomous-actor and is not restored here.) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * feat(persona): add linear-dispatcher persona pack Autonomous Linear issue dispatcher: watches for ready-for-agent issues, triages them, dispatches codex implementer + claude reviewer teams in batches of 5, posts comments, and updates issue state to Agent Implementing. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(persona): add repo-router persona pack Codebase navigator that maps all sibling repos, determines which repo(s) an issue requires changes in, and spawns codex implementer + claude reviewer agents to the correct repos. Handles multi-repo issues by splitting work across parallel implementers. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(persona): use local skill reference for agentworkforce-repo-map Bundle the skill MD in the persona package and reference it as a local ./skills/ path instead of an @-scoped package reference. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: apply pr-reviewer fixes for #223 * fix(personas): ship local persona skills * 5.4 for nango-integrations * test(persona): update nango model expectation --------- Co-authored-by: Ricky Schema Cascade <ricky@agent-relay.com> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> Co-authored-by: agent-relay-code[bot] <agent-relay-code[bot]@users.noreply.github.com>
What
Publish the slack-comms persona as a proper npm-installable persona pack under
packages/persona-slack-comms, replacing the formerexamples/slack-comms/example. It now matches the repo's persona-pack convention (thepersona-autonomous-actor/persona-nango-integrationsshape) so consumers install the same definition with the workforce CLI instead of hand-maintaining a divergent example copy.The persona is a comms-only Slack liaison for a multi-agent engineering team: it relays human Slack messages to the agent team and surfaces milestones, decisions, blockers, and security incidents back to humans via relayfile writeback. It never writes code.
Package contents (
packages/persona-slack-comms/)package.json—@agentworkforce/persona-slack-comms@0.1.0,type: module,main/types, theagentworkforce.personasfield,exportsmap (incl../persona.jsonand./personas/slack-comms.json),files,scripts.test,keywords,license,engines,publishConfig.access: public, andrepository.directory.personas/slack-comms.json— the persona JSON (source of truth carried over from the example). Exactly 3 skills (@agent-relay/setting-up-relayfile,@agent-relay/orchestrating-agent-relay,@agent-workforce/persona-relayfile-mount);using-agent-relaystays removed.agentsMdpoints at the shipped./slack-comms.mdsidecar.personas/slack-comms.md— theagentsMdoperating spec, moved into the pack.index.js/index.d.ts— compatibility exports mirroring the reference packs.README.md— install viaagentworkforce install @agentworkforce/persona-slack-comms, the skills it loads, and the key behaviors.test/persona.test.mjs— validates the persona JSON loads and has the expected fields/skills.Cleanup
examples/slack-comms/directory entirely.Workspace
pnpm-workspace.yamlalready globspackages/*, so no manual workspace registration was needed.Validation
node --test packages/persona-slack-comms/test/persona.test.mjs→ 8/8 pass.slack-commswith zero warnings and resolves theslack-comms.mdsidecar.using-agent-relay.🤖 Generated with Claude Code