Skip to content

test: add unit tests for RecoveryHandler module#534

Open
nikolasdehor wants to merge 3 commits intoSynkraAI:mainfrom
nikolasdehor:test/recovery-handler-coverage
Open

test: add unit tests for RecoveryHandler module#534
nikolasdehor wants to merge 3 commits intoSynkraAI:mainfrom
nikolasdehor:test/recovery-handler-coverage

Conversation

@nikolasdehor
Copy link
Contributor

@nikolasdehor nikolasdehor commented Feb 28, 2026

Resumo

Adiciona suite de testes unitários para o módulo RecoveryHandler (orchestration/recovery-handler.js).

Cobertura

  • Todas as funções públicas testadas (149 testes)
  • Edge cases e error handling cobertos
  • Mocks para fs e dependências externas

Plano de teste

  • Todos os testes passam localmente
  • Sem dependências externas (mocks completos)

Summary by CodeRabbit

  • Tests
    • Added comprehensive tests for recovery handling: error classification, recovery strategies, escalation and workflow triggers, rollback flows, logging, attempt history, event emissions, and end-to-end recovery scenarios.
    • Added extensive tests for context management: initialization, state persistence, phase/context operations, metadata handling, export/import, lifecycle flows, and end-to-end success and failure scenarios.

Copilot AI review requested due to automatic review settings February 28, 2026 04:03
@vercel
Copy link

vercel bot commented Feb 28, 2026

@nikolasdehor is attempting to deploy a commit to the Pedro Valério Lopez's projects Team on Vercel.

A member of the Team first needs to authorize it.

@coderabbitai
Copy link

coderabbitai bot commented Feb 28, 2026

Walkthrough

Adds two comprehensive Jest test suites for RecoveryHandler and ContextManager under tests/core/orchestration; all changes are tests and mocks (fs-extra and orchestration helpers); no production code or API surface changes.

Changes

Cohort / File(s) Summary
Recovery Handler Test Suite
tests/core/orchestration/recovery-handler.test.js
Adds extensive Jest tests for RecoveryHandler: enums, constructor/options, lazy-loading, error classification, strategy selection, epic failure handling, recovery execution (rollback, trigger workflow), human escalation/reporting, suggestions, logging, attempt history, stuck detection, events, and end-to-end scenarios. Mocks fs-extra and orchestration helpers (stuck-detector, rollback-manager, recovery-tracker).
Context Manager Test Suite
tests/core/orchestration/context-manager.test.js
Adds comprehensive Jest tests for ContextManager: initialization, directory/state management, state creation/loading/saving, phase outputs and contexts, metadata handling, delivery confidence and metric calculations, handoff/export/import flows, reset and failure scenarios, and full workflow simulations. Heavily mocks fs-extra filesystem interactions.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Suggested reviewers

  • Pedrovaleriolopez
🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title 'test: add unit tests for RecoveryHandler module' clearly and specifically describes the main change—adding comprehensive unit tests for the RecoveryHandler module. It directly aligns with the primary objective and accurately represents the changeset.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

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.

@codecov
Copy link

codecov bot commented Feb 28, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
tests/core/orchestration/recovery-handler.test.js (1)

58-1251: Consider splitting this spec into focused files

This single test file is very large, which makes failures and future edits harder to navigate. Splitting by concern (e.g., enums/constructor, strategy selection, rollback/escalation, logging/history, integrated flow) would keep the same coverage with better maintainability.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tests/core/orchestration/recovery-handler.test.js` around lines 58 - 1251,
Large single spec; split into focused test files to improve maintainability.
Create separate spec files grouping related describes (e.g., enums+constructor,
strategy selection for _selectRecoveryStrategy, rollback/escalation for
_executeRollback and _escalateToHuman/_saveEscalationReport, logging/history for
_log/getLogs/getEpicLogs/getAttemptHistory, and integrated flows for
handleEpicFailure/end-to-end), move the matching describe blocks for
RecoveryHandler/RecoveryStrategy/RecoveryResult/_selectRecoveryStrategy/_executeRollback/_escalateToHuman/_generateSuggestions/handleEpicFailure/_executeRecoveryStrategy/_triggerRecoveryWorkflow
into those files, extract shared setup (criarHandler, jest.clearAllMocks(),
mocked fs/path/orchestrator helpers) into a common test helper module and import
it in each new spec, ensure each new file still attaches the beforeEach that
creates handler and restores mocks and that all referenced symbols
(RecoveryHandler, RecoveryStrategy, handler._selectRecoveryStrategy,
handler._executeRollback, handler._escalateToHuman, handler.handleEpicFailure,
handler._generateSuggestions) remain reachable so tests pass.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@tests/core/orchestration/recovery-handler.test.js`:
- Around line 211-221: The test for handler._getStuckDetector uses a weak
assertion (toBeGreaterThanOrEqual) that can pass even when no new log was
emitted; change the assertion so it strictly verifies no additional log entry
was added on the second call: capture handler.logs.length before the second
call, call handler._getStuckDetector() again, and assert handler.logs.length ===
logCountAfterFirst (or assert the last log entry is unchanged) instead of using
toBeGreaterThanOrEqual; this uses the handler.logs and handler._getStuckDetector
symbols to make the test diagnostic.

---

Nitpick comments:
In `@tests/core/orchestration/recovery-handler.test.js`:
- Around line 58-1251: Large single spec; split into focused test files to
improve maintainability. Create separate spec files grouping related describes
(e.g., enums+constructor, strategy selection for _selectRecoveryStrategy,
rollback/escalation for _executeRollback and
_escalateToHuman/_saveEscalationReport, logging/history for
_log/getLogs/getEpicLogs/getAttemptHistory, and integrated flows for
handleEpicFailure/end-to-end), move the matching describe blocks for
RecoveryHandler/RecoveryStrategy/RecoveryResult/_selectRecoveryStrategy/_executeRollback/_escalateToHuman/_generateSuggestions/handleEpicFailure/_executeRecoveryStrategy/_triggerRecoveryWorkflow
into those files, extract shared setup (criarHandler, jest.clearAllMocks(),
mocked fs/path/orchestrator helpers) into a common test helper module and import
it in each new spec, ensure each new file still attaches the beforeEach that
creates handler and restores mocks and that all referenced symbols
(RecoveryHandler, RecoveryStrategy, handler._selectRecoveryStrategy,
handler._executeRollback, handler._escalateToHuman, handler.handleEpicFailure,
handler._generateSuggestions) remain reachable so tests pass.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a67cd50 and 7dc7d31.

📒 Files selected for processing (1)
  • tests/core/orchestration/recovery-handler.test.js

Comment on lines +211 to +221
test('_getStuckDetector retorna mesma instância em chamadas repetidas', () => {
// Primeira chamada retorna null (módulo indisponível)
handler._getStuckDetector();
// Limpa logs para ver se segunda chamada tenta novamente
const logCountAfterFirst = handler.logs.length;
// Não deve tentar carregar de novo pois _stuckDetector já foi setado como null
// Mas o código verifica !this._stuckDetector que é null (falsy), então tenta novamente
handler._getStuckDetector();
// Deve ter logado novamente
expect(handler.logs.length).toBeGreaterThanOrEqual(logCountAfterFirst);
});
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Weak assertion makes this lazy-load test non-diagnostic

At Line 220, toBeGreaterThanOrEqual(logCountAfterFirst) can pass even when no new warning is emitted, so the test does not reliably validate the repeated-call behavior it describes.

Proposed fix
-      expect(handler.logs.length).toBeGreaterThanOrEqual(logCountAfterFirst);
+      expect(handler.logs.length).toBeGreaterThan(logCountAfterFirst);
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
test('_getStuckDetector retorna mesma instância em chamadas repetidas', () => {
// Primeira chamada retorna null (módulo indisponível)
handler._getStuckDetector();
// Limpa logs para ver se segunda chamada tenta novamente
const logCountAfterFirst = handler.logs.length;
// Não deve tentar carregar de novo pois _stuckDetector já foi setado como null
// Mas o código verifica !this._stuckDetector que é null (falsy), então tenta novamente
handler._getStuckDetector();
// Deve ter logado novamente
expect(handler.logs.length).toBeGreaterThanOrEqual(logCountAfterFirst);
});
test('_getStuckDetector retorna mesma instância em chamadas repetidas', () => {
// Primeira chamada retorna null (módulo indisponível)
handler._getStuckDetector();
// Limpa logs para ver se segunda chamada tenta novamente
const logCountAfterFirst = handler.logs.length;
// Não deve tentar carregar de novo pois _stuckDetector já foi setado como null
// Mas o código verifica !this._stuckDetector que é null (falsy), então tenta novamente
handler._getStuckDetector();
// Deve ter logado novamente
expect(handler.logs.length).toBeGreaterThan(logCountAfterFirst);
});
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tests/core/orchestration/recovery-handler.test.js` around lines 211 - 221,
The test for handler._getStuckDetector uses a weak assertion
(toBeGreaterThanOrEqual) that can pass even when no new log was emitted; change
the assertion so it strictly verifies no additional log entry was added on the
second call: capture handler.logs.length before the second call, call
handler._getStuckDetector() again, and assert handler.logs.length ===
logCountAfterFirst (or assert the last log entry is unchanged) instead of using
toBeGreaterThanOrEqual; this uses the handler.logs and handler._getStuckDetector
symbols to make the test diagnostic.

Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Adds a comprehensive Jest unit test suite for the RecoveryHandler orchestration module, aiming to validate recovery strategies, escalation behavior, rollback flow, logging, and event emission.

Changes:

  • Introduces a new test suite covering RecoveryHandler, RecoveryStrategy, and RecoveryResult.
  • Adds mocked filesystem behavior (fs-extra) and simulated “module unavailable” scenarios for external recovery dependencies.
  • Exercises key recovery flows end-to-end (retry → rollback → escalation) plus logging/attempt history utilities.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +211 to +220
test('_getStuckDetector retorna mesma instância em chamadas repetidas', () => {
// Primeira chamada retorna null (módulo indisponível)
handler._getStuckDetector();
// Limpa logs para ver se segunda chamada tenta novamente
const logCountAfterFirst = handler.logs.length;
// Não deve tentar carregar de novo pois _stuckDetector já foi setado como null
// Mas o código verifica !this._stuckDetector que é null (falsy), então tenta novamente
handler._getStuckDetector();
// Deve ter logado novamente
expect(handler.logs.length).toBeGreaterThanOrEqual(logCountAfterFirst);
Copy link

Copilot AI Feb 28, 2026

Choose a reason for hiding this comment

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

Este teste está fraco/inconsistente com o próprio nome e comentários: ele não valida que a segunda chamada realmente gerou uma nova tentativa/log (usa toBeGreaterThanOrEqual, que passa mesmo sem mudança) e também não verifica a “mesma instância”. Ajuste para uma asserção estrita (ex.: > ou +1 no número de logs) e/ou renomeie o teste para refletir o comportamento esperado (re-tentar carregar quando _stuckDetector permanece null).

Suggested change
test('_getStuckDetector retorna mesma instância em chamadas repetidas', () => {
// Primeira chamada retorna null (módulo indisponível)
handler._getStuckDetector();
// Limpa logs para ver se segunda chamada tenta novamente
const logCountAfterFirst = handler.logs.length;
// Não deve tentar carregar de novo pois _stuckDetector já foi setado como null
// Mas o código verifica !this._stuckDetector que é null (falsy), então tenta novamente
handler._getStuckDetector();
// Deve ter logado novamente
expect(handler.logs.length).toBeGreaterThanOrEqual(logCountAfterFirst);
test('_getStuckDetector tenta recarregar módulo quando permanece null em chamadas repetidas', () => {
// Primeira chamada retorna null (módulo indisponível) e deve logar um warn
const logCountBeforeFirst = handler.logs.length;
const firstResult = handler._getStuckDetector();
const logCountAfterFirst = handler.logs.length;
expect(firstResult).toBeNull();
expect(logCountAfterFirst).toBeGreaterThan(logCountBeforeFirst);
// Segunda chamada também retorna null, mas deve tentar carregar novamente e logar de novo
const secondResult = handler._getStuckDetector();
const logCountAfterSecond = handler.logs.length;
expect(secondResult).toBeNull();
// Deve ter logado novamente (número de logs precisa aumentar estritamente)
expect(logCountAfterSecond).toBeGreaterThan(logCountAfterFirst);

Copilot uses AI. Check for mistakes.
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
tests/core/orchestration/context-manager.test.js (1)

79-131: initialize tests still miss filesystem rejection paths.

Current cases cover only happy paths. Add explicit tests for fs.readJson and initial-state fs.writeJson rejection to verify propagation/failure behavior.

As per coding guidelines, "Verify error handling is comprehensive."

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tests/core/orchestration/context-manager.test.js` around lines 79 - 131, Add
tests that cover filesystem rejection paths for manager.initialize: one where
fs.pathExists resolves true and fs.readJson rejects with an error (mock
fs.readJson.mockRejectedValue) and assert that await manager.initialize()
rejects with that error and that fs.readJson was called with manager.statePath;
and another where fs.pathExists resolves false and fs.writeJson rejects (mock
fs.writeJson.mockRejectedValue) and assert initialize rejects with that error
and that fs.ensureDir was called for
manager.stateDir/manager.handoffDir/manager.confidenceDir before the failing
write; use manager.initialize, fs.readJson, fs.writeJson and
manager.statePath/manager.stateDir references in the assertions.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@tests/core/orchestration/context-manager.test.js`:
- Around line 149-155: The test for ISO timestamps should assert both timestamps
with toISOString() rather than only checking updatedAt with not.toThrow; update
the test in context-manager.test.js (the test 'startedAt e updatedAt são strings
ISO válidas') to call new Date(state.updatedAt).toISOString() and expect it
toBe(state.updatedAt) in the same way as startedAt, ensuring both
state.startedAt and state.updatedAt produced by manager._createInitialState()
are validated as proper ISO strings.

---

Nitpick comments:
In `@tests/core/orchestration/context-manager.test.js`:
- Around line 79-131: Add tests that cover filesystem rejection paths for
manager.initialize: one where fs.pathExists resolves true and fs.readJson
rejects with an error (mock fs.readJson.mockRejectedValue) and assert that await
manager.initialize() rejects with that error and that fs.readJson was called
with manager.statePath; and another where fs.pathExists resolves false and
fs.writeJson rejects (mock fs.writeJson.mockRejectedValue) and assert initialize
rejects with that error and that fs.ensureDir was called for
manager.stateDir/manager.handoffDir/manager.confidenceDir before the failing
write; use manager.initialize, fs.readJson, fs.writeJson and
manager.statePath/manager.stateDir references in the assertions.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 7dc7d31 and b16c0e3.

📒 Files selected for processing (2)
  • tests/core/orchestration/context-manager.test.js
  • tests/core/orchestration/recovery-handler.test.js

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@tests/core/orchestration/context-manager.test.js`:
- Around line 1170-1175: The test shows current behavior where an empty string
env var yields 0 because Number('') === 0; change the implementation in
_resolveConfidenceThreshold (the method on manager) to treat empty or
whitespace-only strings as missing and return the fallback (70). Concretely,
read process.env.AIOS_DELIVERY_CONFIDENCE_THRESHOLD into a variable, if it's
null/undefined or raw.trim() === '' return 70, otherwise parse Number(raw) and
return parsed if Number.isFinite(parsed) else 70.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b16c0e3 and 6bd9d45.

📒 Files selected for processing (1)
  • tests/core/orchestration/context-manager.test.js

Comment on lines +1170 to +1175
test('retorna 0 quando env é string vazia (Number("") === 0)', () => {
process.env.AIOS_DELIVERY_CONFIDENCE_THRESHOLD = '';

// Number('') === 0, que é Number.isFinite, então retorna 0
expect(manager._resolveConfidenceThreshold()).toBe(0);
});
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

# Find the implementation of _resolveConfidenceThreshold
ast-grep --pattern $'_resolveConfidenceThreshold() {
  $$$
}'

Repository: SynkraAI/aios-core

Length of output: 44


🏁 Script executed:

# Search for the method definition with broader pattern
rg -n "resolveConfidenceThreshold" --type=js -A 15

Repository: SynkraAI/aios-core

Length of output: 5091


🏁 Script executed:

# Check for environment variable handling and documentation
rg -n "AIOS_DELIVERY_CONFIDENCE_THRESHOLD" --type=js --type=md -B 2 -A 2

Repository: SynkraAI/aios-core

Length of output: 3388


🏁 Script executed:

# Find the implementation file (context-manager source)
fd -t f "context-manager" --extension js | grep -v test | grep -v node_modules

Repository: SynkraAI/aios-core

Length of output: 44


🏁 Script executed:

# Search for the actual implementation of _resolveConfidenceThreshold in source files
rg -n "_resolveConfidenceThreshold\s*\(" --type=js | grep -v test

Repository: SynkraAI/aios-core

Length of output: 44


🏁 Script executed:

# Find the source directory structure
find . -path ./node_modules -prune -o -type d -name "orchestration" -print

Repository: SynkraAI/aios-core

Length of output: 120


🏁 Script executed:

# List files in the orchestration directory
ls -la src/core/orchestration/ 2>/dev/null || echo "Directory not found, searching broader..."
git ls-files | grep -i "orchestration" | grep -v test | head -20

Repository: SynkraAI/aios-core

Length of output: 1181


🏁 Script executed:

# Search for _resolveConfidenceThreshold in all JS files without test
rg "resolveConfidenceThreshold" --type=js -l

Repository: SynkraAI/aios-core

Length of output: 110


🏁 Script executed:

# Read the context-manager.js source file to find the implementation
wc -l .aios-core/core/orchestration/context-manager.js

Repository: SynkraAI/aios-core

Length of output: 114


🏁 Script executed:

# Search for _resolveConfidenceThreshold in the source file
rg -n "_resolveConfidenceThreshold" .aios-core/core/orchestration/context-manager.js -A 20

Repository: SynkraAI/aios-core

Length of output: 1291


The test correctly documents current behavior, but the implementation has a semantic inconsistency worth addressing.

The current implementation treats empty strings differently from other invalid inputs: Number('') === 0 passes Number.isFinite(), returning 0 (accept all scores), while invalid strings return NaN and fall back to 70. Consider updating _resolveConfidenceThreshold() to treat empty strings like other invalid inputs:

_resolveConfidenceThreshold() {
  const raw = process.env.AIOS_DELIVERY_CONFIDENCE_THRESHOLD;
  if (!raw || raw.trim() === '') return 70;
  const parsed = Number(raw);
  return Number.isFinite(parsed) ? parsed : 70;
}

This aligns empty env vars (likely misconfiguration) with the fallback behavior, reducing unintended security gaps.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tests/core/orchestration/context-manager.test.js` around lines 1170 - 1175,
The test shows current behavior where an empty string env var yields 0 because
Number('') === 0; change the implementation in _resolveConfidenceThreshold (the
method on manager) to treat empty or whitespace-only strings as missing and
return the fallback (70). Concretely, read
process.env.AIOS_DELIVERY_CONFIDENCE_THRESHOLD into a variable, if it's
null/undefined or raw.trim() === '' return 70, otherwise parse Number(raw) and
return parsed if Number.isFinite(parsed) else 70.

@Pedrovaleriolopez
Copy link
Contributor

Rebase Necessário

@nikolasdehor O PR #535 (ContextManager tests) acabou de ser mergeado em main. Como ambos os PRs tocam tests/core/orchestration/context-manager.test.js, este PR agora tem conflitos de merge.

Ação necessária: Rebase em main e resolver os conflitos no arquivo de testes compartilhado.

Os 149 testes de RecoveryHandler estão aprovados — assim que o rebase for feito, mergeamos imediatamente.

— Gage (DevOps)

Troca toBeGreaterThanOrEqual por toBeGreaterThan para validar
que segunda chamada realmente gera novo warning. Renomeia teste
para refletir comportamento esperado (tentativa de recarga).
@nikolasdehor nikolasdehor force-pushed the test/recovery-handler-coverage branch from 6bd9d45 to 83ff94c Compare March 7, 2026 02:15
@nikolasdehor
Copy link
Contributor Author

@Pedrovaleriolopez @oalanicolas, esse PR adiciona cobertura de testes pro RecoveryHandler que tava sem nenhum teste unitário. Só testes, sem mudança de código de produção.

…vazia em _resolveConfidenceThreshold

- Corrige imports e asserts do recovery-handler.test.js para .aiox-core
- Trata string vazia como ausente em _resolveConfidenceThreshold (retorna fallback 70)
@github-actions github-actions bot added area: agents Agent system related area: workflows Workflow system related squad mcp type: test Test coverage and quality area: core Core framework (.aios-core/core/) area: installer Installer and setup (packages/installer/) area: synapse SYNAPSE context engine area: cli CLI tools (bin/, packages/aios-pro-cli/) labels Mar 12, 2026
@github-actions github-actions bot added area: pro Pro features (pro/) area: health-check Health check system area: docs Documentation (docs/) area: devops CI/CD, GitHub Actions (.github/) labels Mar 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: agents Agent system related area: cli CLI tools (bin/, packages/aios-pro-cli/) area: core Core framework (.aios-core/core/) area: devops CI/CD, GitHub Actions (.github/) area: docs Documentation (docs/) area: health-check Health check system area: installer Installer and setup (packages/installer/) area: pro Pro features (pro/) area: synapse SYNAPSE context engine area: workflows Workflow system related mcp squad type: test Test coverage and quality

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants