Skip to content

Implement factory mid-task Slack questions#333

Merged
khaliqgant merged 4 commits into
mainfrom
ar-259-mid-task-slack-questions
Jun 14, 2026
Merged

Implement factory mid-task Slack questions#333
khaliqgant merged 4 commits into
mainfrom
ar-259-mid-task-slack-questions

Conversation

@khaliqgant

@khaliqgant khaliqgant commented Jun 14, 2026

Copy link
Copy Markdown
Member

Summary

  • Add a fleet onAgentMessage hook for relay_inbound events so dispatched agents can send explicit needs-input questions to the factory.
  • Relay marked agent questions to the issue Slack dispatch thread using the existing issue -> Slack thread mapping, with target filtering, sender-to-in-flight issue resolution, bounded dedupe, and Slack degraded/no-config no-op behavior.
  • Teach dispatched agents the fallback marker format and include dispatch thread metadata when available.

Verification

  • npx tsc -p packages/factory-sdk/tsconfig.json --noEmit
  • npx vitest run packages/factory-sdk/src/dispatch/templates.test.ts packages/factory-sdk/src/fleet/internal-fleet-client.test.ts packages/factory-sdk/src/orchestrator/factory.test.ts

Notes

  • Human Slack replies still return through the existing fleet.sendInput path.
  • Bot-authored Slack echoes are ignored by the existing Slack watcher bot filter.

@coderabbitai

coderabbitai Bot commented Jun 14, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

Pull request was closed or merged during review

📝 Walkthrough

Walkthrough

This PR adds GitHub issue ingestion into Linear mirrors, a new onAgentMessage subscription API on FleetClient/InternalFleetClient for relay_inbound broker events, an agent "factory needs input" question bridging flow that posts to Slack dispatch threads, updated factory-scope safety logic that distinguishes GitHub mirror issues from human-authored ones, and Linear writeback support for labels/source fields. It also includes a stray local node_modules symlink.

Changes

GitHub Issue Ingestion, Agent Messaging, and Slack Bridging

Layer / File(s) Summary
AgentMessage type and FleetClient interface
packages/factory-sdk/src/ports/fleet.ts, packages/factory-sdk/src/ports/index.ts
Exports AgentMessage type with from/target/body/threadId/eventId and adds optional onAgentMessage subscription method to FleetClient.
InternalFleetClient onAgentMessage + relay stub + fakes
packages/factory-sdk/src/fleet/internal-fleet-client.ts, packages/factory-sdk/src/fleet/relay-fleet-client.ts, packages/factory-sdk/src/testing/fakes.ts, packages/factory-sdk/src/fleet/internal-fleet-client.test.ts
Implements onAgentMessage on InternalFleetClient handling relay_inbound events with deduplication and dispose cleanup. Adds a not-implemented stub on RelayFleetClient, FakeFleetClient listener/emit helpers, and a relay dedupe test.
LinearCreateIssuePayload labels/source and draft payload helper
packages/factory-sdk/src/writeback/linear.ts
Extends LinearCreateIssuePayload with optional labels and source fields, introduces createIssueDraftPayload to reattach team on creates, and wires both into the adapter create path.
GitHub ingestion types, constants, parsing, and utilities
packages/factory-sdk/src/orchestrator/factory.ts
Adds GithubIssueSource, AgentQuestion, MirrorCandidateCache types, GitHub issue live glob constants, agent-question dedupe/marker constants, GitHub labeling constants, the exported parseGithubIssue function, and GitHub path/mirror utility functions.
GitHub ingestion subsystem
packages/factory-sdk/src/orchestrator/factory.ts
Implements the full GitHub ingestion subsystem: sub-root gating via ensureSubRoot, GitHub issue path listing, memoized Linear mirror candidate loading, and per-issue create/update/close mirror operations with label routing.
Factory orchestrator wiring for GitHub ingestion and lifecycle
packages/factory-sdk/src/orchestrator/factory.ts
Wires GitHub ingestion into startup (#ensureGithubIngestionReady), full-pull subscriptions, live pipeline (LIVE_GITHUB_ISSUE_GLOB, drain dedupe), runOnce, backfill, and stop teardown. Adds per-pass agent-question dedupe state and #githubIngestionEnabled cache flag.
Factory scope safety gating for GitHub mirrors
packages/factory-sdk/src/safety/factory-scope.ts, packages/factory-sdk/README.md
Updates isInFactoryScope and factoryScopeFailureReason to use titleHasAcceptedFactoryMarker, which allows the [factory] mirror prefix only for GitHub mirror payloads. Adds isGithubMirrorPayload, GITHUB_MIRROR_TITLE_PREFIX, and README documentation.
Agent question → Slack dispatch thread bridging
packages/factory-sdk/src/orchestrator/factory.ts
Adds onAgentMessage handler parsing [factory-needs-input] questions, validates in-flight issue association, dedupes with eviction, and posts to the Slack dispatch thread. Adds #slackDispatchThreadFor helper and slackDispatchThread injection into task rendering, plus agent-question parsing utilities.
Task template Slack dispatch thread question instructions
packages/factory-sdk/src/dispatch/templates.ts, packages/factory-sdk/src/dispatch/templates.test.ts
Adds optional slackDispatchThread to RenderAgentTaskInput, generates questionInstructions for both reviewer and non-reviewer paths, and tests [factory-needs-input] format and absence of legacy phrasing.
factory.test.ts: GitHub ingestion and agent question tests
packages/factory-sdk/src/orchestrator/factory.test.ts
Adds githubIssuePath/githubIssueFile fixtures, GitHub mirroring test cases (create/dedupe/restart-dedupe/close/routing/scope gating), live subscription prefix assertion, and Slack agent question bridging tests (post/reply/ignore/no-op/dedupe).

Stray node_modules Symlink

Layer / File(s) Summary
Stray node_modules symlink
node_modules
A symlink pointing to a local developer path (/Users/khaliqgant/...) was accidentally included in the diff.

Sequence Diagram(s)

sequenceDiagram
  rect rgba(173, 216, 230, 0.5)
    Note over GitHubMount,FactoryLoop: GitHub Issue Ingestion
    GitHubMount->>FactoryLoop: relayfile /github/repos/<owner>/<repo>/issues/.../<n>.json
    FactoryLoop->>FactoryLoop: `#ensureGithubIngestionReady` → sub-root probe
    FactoryLoop->>FactoryLoop: parseGithubIssue → GithubIssueSource
    FactoryLoop->>FactoryLoop: findExistingMirror → match Linear source metadata
    FactoryLoop->>LinearWriteback: createIssue(labels, source, team)
  end
  rect rgba(144, 238, 144, 0.5)
    Note over Agent,HumanInSlack: Agent Question Slack Bridging
    Agent->>InternalFleetClient: relay_inbound [factory-needs-input] body
    InternalFleetClient->>FactoryLoop: onAgentMessage(AgentMessage)
    FactoryLoop->>FactoryLoop: parseAgentQuestion → dedupe → `#slackDispatchThreadFor`
    FactoryLoop->>SlackWatcher: post question to dispatch thread
    SlackWatcher->>HumanInSlack: message in Slack thread
    HumanInSlack->>SlackWatcher: reply
    SlackWatcher->>FactoryLoop: answer
    FactoryLoop->>Agent: sendInput(answer)
  end
Loading

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Possibly related PRs

  • AgentWorkforce/pear#235: Both PRs modify the factory orchestrator in factory.ts to add GitHub/Slack-related handling within the same FactoryLoop, making this PR a direct extension of that work.
  • AgentWorkforce/pear#232: This PR extends InternalFleetClient with onAgentMessage and relay_inbound deduplication, building directly on the core InternalFleetClient implementation from that PR.
  • AgentWorkforce/pear#246: Both PRs update factory.ts Slack dispatch-thread handling — this PR adds agent question injection into dispatch threads while that PR adds the bidirectional Slack status watcher responding to human replies.

Poem

🐰 Hop hop, the factory stirs,
GitHub issues now appear as blur,
Mirrors made in Linear land,
Questions asked, by Slack's own hand,
[factory-needs-input] — hear my plea!
The rabbit routes your Q&A with glee~ 🌟

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Implement factory mid-task Slack questions' accurately reflects the main objective of the PR, which adds a fleet onAgentMessage hook for relaying agent questions to Slack.
Description check ✅ Passed The description clearly explains the implementation: adding a fleet hook for relay_inbound events, relaying agent questions to Slack threads, and teaching agents the fallback marker format.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch ar-259-mid-task-slack-questions

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

ESLint install failed due to a network error.


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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces support for mirroring factory-labeled GitHub issues into Linear create drafts, closing Linear mirrors when GitHub issues are closed, and routing mid-task agent questions to Slack dispatch threads. The code review feedback highlights a performance bottleneck in #findGithubIssueMirror due to O(N * M) disk reads, suggests making repository label matching more robust, recommends tracking whether GitHub ingestion is enabled via a private field to avoid unnecessary mount operations, and advises using consistent fallback instructions for LLM agents.

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.

Comment on lines +1257 to +1265
for (const path of await this.#mount.listTree(ISSUE_ROOT)) {
if (!isLinearIssueMirrorCandidatePath(path)) {
continue
}
const issue = await this.#readIssue(path)
if (issue && linearIssueMirrorsGithubIssue(issue, ghIssue)) {
return issue
}
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

Performance Bottleneck: O(N * M) Disk Reads

In #findGithubIssueMirror, the code lists all files in ISSUE_ROOT and reads each one sequentially using this.#readIssue(path) to check if it mirrors the GitHub issue. Since #findGithubIssueMirror is called for every GitHub issue during ingestion, this results in an O(N * M) complexity of disk/mount reads (where N is the number of GitHub issues and M is the number of Linear issues).

With hundreds or thousands of issues, this will cause severe performance degradation and potential rate-limiting or timeouts on the mount.

Recommendation:
Consider pre-loading or caching the candidate Linear issues once per iteration of runOnce or #ingestGithubIssues, and passing the cached list/map to #findGithubIssueMirror to reduce the complexity to O(N + M) reads.

Comment on lines +1269 to +1273
#repoLabelForGithubIssue(ghIssue: GithubIssueSource): string | undefined {
const entry = Object.entries(this.#config.repos.byLabel)
.find(([, repo]) => repo.toLowerCase() === ghIssue.repo.toLowerCase())
return entry?.[0]
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Robust Repository Label Matching

If repos.byLabel is configured with only the repository name (e.g., "pear" instead of "AgentWorkforce/pear"), the direct comparison repo.toLowerCase() === ghIssue.repo.toLowerCase() will fail because ghIssue.repo always contains the owner prefix. Comparing with ghIssue.repoName as a fallback makes the routing much more robust.

  #repoLabelForGithubIssue(ghIssue: GithubIssueSource): string | undefined {
    const entry = Object.entries(this.#config.repos.byLabel)
      .find(([, repo]) => {
        const r = repo.toLowerCase()
        return r === ghIssue.repo.toLowerCase() || r === ghIssue.repoName.toLowerCase()
      })
    return entry?.[0]
  }

Comment on lines 208 to 211
#offAgentExit?: () => void
#offDeliveryFailed?: () => void
#offAgentMessage?: () => void
#starting?: Promise<void>

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Declare #githubIngestionEnabled Field

Declare the private field #githubIngestionEnabled to track whether the GitHub issue mount is available and ready for ingestion.

Suggested change
#offAgentExit?: () => void
#offDeliveryFailed?: () => void
#offAgentMessage?: () => void
#starting?: Promise<void>
#offAgentExit?: () => void
#offDeliveryFailed?: () => void
#offAgentMessage?: () => void
#githubIngestionEnabled = false
#starting?: Promise<void>

Comment on lines +270 to +273
const githubReady = await this.#mount.ensureSubRoot(GITHUB_ISSUE_ROOT, { timeoutMs: 90_000 })
if (githubReady !== 'ready') {
this.#logger.warn?.(`[factory] ${GITHUB_ISSUE_ROOT} sub-root is not mounted; GitHub issue ingestion disabled`)
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Avoid Unnecessary Directory Listing When GitHub Mount is Missing

If ensureSubRoot for GITHUB_ISSUE_ROOT fails, we log a warning but still attempt to list and ingest GitHub issues on every iteration. This causes unnecessary mount operations and warnings.

We should track whether GitHub ingestion is enabled using a private field #githubIngestionEnabled and skip #ingestGithubIssues if it is false.

Suggested change
const githubReady = await this.#mount.ensureSubRoot(GITHUB_ISSUE_ROOT, { timeoutMs: 90_000 })
if (githubReady !== 'ready') {
this.#logger.warn?.(`[factory] ${GITHUB_ISSUE_ROOT} sub-root is not mounted; GitHub issue ingestion disabled`)
}
const githubReady = await this.#mount.ensureSubRoot(GITHUB_ISSUE_ROOT, { timeoutMs: 90_000 })
this.#githubIngestionEnabled = githubReady === 'ready'
if (!this.#githubIngestionEnabled) {
this.#logger.warn?.(`[factory] ${GITHUB_ISSUE_ROOT} sub-root is not mounted; GitHub issue ingestion disabled`)
}

Comment on lines +1163 to +1167
async #ingestGithubIssues(opts: { dryRun?: boolean } = {}): Promise<void> {
for (const path of await this.#githubIssuePaths()) {
await this.#handleGithubIssueChange(path, opts)
}
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Skip Ingestion If GitHub Mount is Disabled

Check #githubIngestionEnabled before listing and ingesting GitHub issues to avoid unnecessary mount operations.

  async #ingestGithubIssues(opts: { dryRun?: boolean } = {}): Promise<void> {
    if (!this.#githubIngestionEnabled) {
      return
    }
    for (const path of await this.#githubIssuePaths()) {
      await this.#handleGithubIssueChange(path, opts)
    }
  }

'Open a PR targeting `main` when done.',
'Use `gh pr create --base main` and report the PR URL.',
`DM the reviewer \`${input.reviewerName}\` when the PR is ready.`,
'If blocked and you need human input, DM `broker` with `FACTORY_NEEDS_INPUT`, `Issue: <key>`, and `Question: <your question>` so the factory can relay it to the issue Slack thread.',

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Consistent Fallback Instructions for LLM Agents

To avoid confusing the LLM agent with conflicting instructions, use the new preferred [factory-needs-input] format and factory target consistently, matching the fallback instruction on line 61.

Suggested change
'If blocked and you need human input, DM `broker` with `FACTORY_NEEDS_INPUT`, `Issue: <key>`, and `Question: <your question>` so the factory can relay it to the issue Slack thread.',
'If blocked and you need human input, DM `factory` with `[factory-needs-input] <your question>` so the factory can relay it to the issue Slack thread.',

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6fe5532cba

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

}

const githubIssuePathParts = (path: string): { owner: string; repo: string; number: number } | undefined => {
const match = path.match(/^\/github\/repos\/([^/]+)\/([^/]+)\/issues\/by-id\/(\d+)\.json$/u)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Match the mounted GitHub issue path shape

The repository’s GitHub issue records are exposed under /github/repos/<owner>/<repo>/issues/<number>.json (for example, src/renderer/src/stores/issues-store.ts and the mock records use that shape), but this parser only accepts issues/by-id/*.json and the live glob uses the same suffix. In installations with the existing mount shape, runOnce, startup backfill, and live subscriptions never recognize factory-labeled GitHub issues, so no Linear mirrors are created.

Useful? React with 👍 / 👎.

description: githubIssueMirrorDescription(issue),
stateId: config.stateIds.readyForAgent,
labels: [{ name: repoLabel }],
team: { key: config.safety.requireTeamKey },

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Preserve team routing when creating GitHub mirrors

GitHub mirror payloads provide only team.key, but MountLinearWriteback.createIssue writes only teamId or team.id to the draft, so the actual /linear/issues/factory-create-* file has no team information. When a factory-labeled GitHub issue is mirrored through the real Linear writeback path, Linear cannot reliably create the issue in the AR team, and the guard still passes because it checked the pre-stripped payload.

Useful? React with 👍 / 👎.

Comment on lines +78 to +79
const titleHasAcceptedFactoryMarker = (title: string, configuredMarker: string): boolean =>
titleHasFactoryMarker(title, configuredMarker) || titleHasFactoryMarker(title, '[factory]')

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Keep [factory] from bypassing custom scope prefixes

Accepting [factory] here applies to every Linear issue, not just factory-created GitHub mirrors. With the default [factory-e2e] gate, or any stricter custom requireTitlePrefix, a human-created AR issue titled [factory] ... now passes isInFactoryScope and can be dispatched, weakening the safety guard beyond the mirror use case described in the README.

Useful? React with 👍 / 👎.

@agent-relay-code

Copy link
Copy Markdown
Contributor

Findings

  • Blocking: packages/factory-sdk/src/safety/factory-scope.ts:78 unconditionally accepts [factory] in addition to safety.requireTitlePrefix. That widens the safety gate for any deployment that intentionally configured a different prefix. GitHub mirrors may need [factory], but the bypass should be scoped to mirror-created issues or explicit config, not accepted globally.

Addressed Comments

  • coderabbitai[bot]: Rate-limit notice only; no actionable code review finding to validate or fix.

Verification

  • npm ci completed.
  • npm run verify:mcp-resources-drift passed.
  • npm run lint passed with existing warnings.
  • npm run typecheck:web passed.
  • npm run typecheck:node passed.
  • npm test passed.
  • npm run build passed.
  • npx vitest run failed on existing lifecycle test packages/factory-sdk/src/orchestrator/factory.test.ts:1419. The named test passes in isolation, but fails in the suite/subset. I did not edit lifecycle code or weaken the test per the review constraints.

No files were edited.

khaliqgant and others added 2 commits June 14, 2026 15:10
Code-review fixes for the factory mid-task Slack questions /
GitHub-to-Linear mirroring PR:

- Match the live GitHub issue mount shape: accept both
  /github/repos/<owner>/<repo>/issues/<n>.json (the shape the
  renderer issues-store reads from real mounts) and the nested
  .../issues/by-id/<n>.json variant in the parser and live glob
  (codex P1).
- Preserve team routing on GitHub mirror create drafts: when no
  teamId is resolvable, carry team.key through createIssue so the
  Linear writeback can route by key instead of writing a teamless
  draft. Scoped to creates only; setState/postComment unchanged
  (codex P1).
- Gate the bare [factory] scope marker to GitHub mirrors only
  (source.provider === github), so a stricter custom
  requireTitlePrefix still rejects human-authored [factory] issues
  (codex P2).
- Cache existing Linear mirror candidates once per ingestion pass so
  dedupe is O(N + M) reads instead of re-scanning ISSUE_ROOT per
  GitHub issue (gemini perf).
- Match repos.byLabel entries against both owner/name and the bare
  repo name (gemini robustness).
- Probe the GitHub issue sub-root once and skip ingestion entirely
  when it is absent; lazy so the standalone runOnce() path still
  ingests when present (gemini).
- Align the always-present blocked-input instruction with the
  preferred `factory` / [factory-needs-input] format (gemini
  consistency).

Adds unit tests for each fix and updates affected expectations.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@agent-relay-code

Copy link
Copy Markdown
Contributor

Findings

  • Blocking: factory.ts defines LIVE_GITHUB_ISSUE_GLOB as /github/repos/**/issues/**/*.json, but this repo’s glob matcher only treats ** as recursive when it is the final segment. For /github/repos/AgentWorkforce/pear/issues/1116.json, the issues segment is compared against pear, so live subscriptions at factory.ts miss GitHub issue events. runOnce() full ingestion still sees listed files, but live/non-live subscriptions will not mirror newly arriving factory GitHub issues until a later full pull. I did not auto-edit this because it changes event subscription behavior.

Edited

  • Removed the tracked node_modules symlink that pointed to /Users/khaliqgant/Projects/AgentWorkforce/pear/node_modules.

Addressed comments

  • coderabbitai[bot]: ESLint tool install/network warning only; validated locally with npm run lint, which passed.
  • gemini-code-assist[bot] O(N*M) mirror lookup: stale, already handled by the current MirrorCandidateCache path at factory.ts.
  • gemini-code-assist[bot] repo label matching: already handled at factory.ts, including bare repo fallback.
  • gemini-code-assist[bot] declare GitHub ingestion field: already handled at factory.ts; current lazy undefined state is safer than defaulting false.
  • gemini-code-assist[bot] skip ingestion when GitHub mount disabled: already handled at factory.ts.
  • gemini-code-assist[bot] consistent factory needs-input wording: already handled at templates.ts.
  • chatgpt-codex-connector[bot] GitHub issue path shape: partially stale. Parser/listing now accepts /issues/<n>.json at factory.ts, but live glob remains broken; kept as the blocking finding above.
  • chatgpt-codex-connector[bot] preserve team routing: already handled by createIssueDraftPayload at linear.ts.
  • chatgpt-codex-connector[bot] keep [factory] scoped to mirrors: already handled at factory-scope.ts.
  • agent-relay-code[bot] safety-scope finding: stale, fixed in current checkout at factory-scope.ts.

Verification

  • npm ci passed.
  • npm run lint passed with existing warnings.
  • npm run typecheck:web passed.
  • npm run typecheck:node passed.
  • npm test passed.
  • npm run verify:mcp-resources-drift passed.
  • npm run build passed.
  • npx vitest run passed: 53 files, 783 tests.
  • GitHub metadata: mergeable true, mergeable_state unstable; check runs completed, but combined status is still pending because CodeRabbit is “Review in progress”.

Not printing READY because CodeRabbit is still pending and there is a blocking live-subscription finding.

@khaliqgant khaliqgant merged commit 1b6ea1f into main Jun 14, 2026
4 of 5 checks passed
@khaliqgant khaliqgant deleted the ar-259-mid-task-slack-questions branch June 14, 2026 13:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant