Requirements: Add full suite of live integration tests for CLI validation #3
Replies: 14 comments 4 replies
-
Idea ResearchNow I have a thorough understanding of the entire landscape. Here's my analysis: Integration Tests for code-wrapper: Research & AnalysisExecutive SummaryThe ticket as written carries a significant framing mismatch against the actual codebase. code-wrapper is a TypeScript library (not a CLI application) with no binary entry points, no subcommands, and no Python anywhere in the stack. The acceptance criteria reference "CLI binary," "CLI command/subcommand," and "pytest" — none of which apply. However, the intent behind the ticket is sound: the project needs tests that exercise the library's public API against a real Claude Code CLI rather than the existing The existing v0.3 test suite (70 tests, vitest, forks pool) already covers what most projects would call "integration tests" — spawning a real subprocess, exercising timeouts, signal handling, and session persistence. What's missing is live validation against the actual Idea ExplorationWhat "live integration tests" means for this projectcode-wrapper has three independently importable layers:
The core question: are the existing fake-claude tests sufficient, or does the project need tests that hit the real Claude CLI? Arguments for live tests:
Arguments for caution:
The "CLI binary" confusionThe ticket says "Tests invoke the CLI binary directly, not internal Python modules." This needs reinterpretation:
What the ticket likely intends: tests should exercise the library's public API surface ( Potential DirectionsDirection 1: Live smoke test suite (minimal, CI-friendly)A small set of tests (5–10) that invoke the real
Tradeoffs: Requires credentials in CI. Costs ~$0.01–0.05 per run (trivial prompts). Takes 30–60 seconds. Tests are gated behind an env flag (e.g., Direction 2: CLI contract snapshot testsRecord real Claude CLI output once, commit the snapshots, then run Tradeoffs: Snapshots go stale when the CLI updates. Doesn't catch runtime integration issues (process spawn, signal handling, credential selection). But it's free, fast, and fully deterministic. Direction 3: Extended fake-claude scenariosRather than going live, expand the
Tradeoffs: Doesn't validate against real CLI. But covers the most common regression vectors without cost or credential dependencies. Direction 4: Dual-track approach (recommended framing)Combine Directions 1 and 3:
This mirrors Switchyard's pattern: unit tests in References and Prior ArtDocumentation Robotics CLI test infrastructureThe most directly applicable reference. Key patterns worth adopting:
Switchyard integration test patternsSwitchyard's
vitest workspace patternFor projects that need multiple test configurations (fast unit tests vs slow live tests), vitest supports workspace mode where separate configs can define different includes, timeouts, and environment requirements. This is worth investigating as an alternative to separate npm scripts. Technical ConsiderationsCredential managementLive tests require one of:
code-wrapper's In CI, these would be injected as GitHub Actions secrets. The test runner should detect missing credentials and skip live tests with a clear message, not fail. Cost and rate limitingEach live test invocation costs API tokens. With trivial prompts ("respond with exactly 'hello'"), costs are negligible (~100 input + ~10 output tokens per call). But the rate limit concern is real — running 10 live tests in parallel could trigger the Mitigation: run live tests serially ( Deterministic assertionsLLM output is non-deterministic. Live test assertions must be structural:
CI workflowNo
The pytest questionThe ticket mentions "pytest or equivalent." The project uses vitest — this is the correct choice and is already configured. There is no reason to introduce pytest or any Python tooling. The acceptance criteria should be updated to reflect vitest.
|
Beta Was this translation helpful? Give feedback.
-
Business AnalysisNow I have a complete and accurate picture of the codebase. Let me write the analysis. Executive SummaryThe The ticket's acceptance criteria reference "CLI binary," "subcommands," and "pytest" — all inapplicable to a TypeScript library with no binary entry points. The intent, confirmed by research, is to validate the library's public API ( The agreed-upon approach is a dual-track test structure: a fast path ( The Copilot backend implementation is a prerequisite for all Copilot-related test requirements. This dependency must be resolved before Copilot test stories can be accepted. Functional RequirementsFR-1: Live Test Runner ConfigurationThe project must have a dedicated test configuration and npm script that:
FR-2: Claude Fake Fixture ExtensionsThe existing
FR-3: Claude Live Test SuiteA new test file
FR-4: Copilot Fake Fixture (Prerequisite: Copilot Backend Implementation)A new fixture
The fixture must consume stdin (reading ACP request JSON-RPC messages written by FR-5: Copilot Fake Test Suite (Prerequisite: FR-4 and Copilot Backend Implementation)A new test file
FR-6: Copilot Live Test Suite (Prerequisite: FR-5 and Copilot Backend Implementation)A new test file
FR-7: CI WorkflowA GitHub Actions workflow file (
FR-8: README InstructionsThe project README must include a section documenting:
User StoriesStory 1: Live Test RunnerAs a library contributor, Acceptance Criteria:
Story 2: Extended Claude Fake ScenariosAs a developer working on the Claude event stream parser, Acceptance Criteria:
Story 3: Claude Live Golden PathAs a CI pipeline operator, Acceptance Criteria:
Story 4: Claude Live Session ResumeAs a developer using Acceptance Criteria:
Story 5: Claude Live Auth Path CoverageAs a library integrator configuring credentials for deployment, Acceptance Criteria:
Story 6: Claude Live AbortSignal CancellationAs a caller using Acceptance Criteria:
Story 7: Copilot Fake Fixture and Test SuiteAs a developer implementing the Copilot ACP backend, Prerequisite: Copilot backend implementation must be merged to main before this story can be accepted. Acceptance Criteria:
Story 8: Copilot Live Test SuiteAs a developer validating the Copilot ACP integration, Prerequisite: Story 7 must be complete. Acceptance Criteria:
Story 9: CI WorkflowAs a repository maintainer, Acceptance Criteria:
Story 10: README Test DocumentationAs a first-time contributor or downstream integrator, Acceptance Criteria:
Generated by Orchestrator Bot 🤖 |
Beta Was this translation helpful? Give feedback.
-
Architecture DesignI now have complete understanding of every relevant component. Here is the architecture design. Architecture Design: Live Integration Tests for code-wrapperADR-001: Dual-Track Test ArchitectureStatus: Proposed Context: code-wrapper's existing test suite (~70 tests) exercises all three layers via Decision: Adopt a dual-track test architecture:
Consequences:
System ArchitectureTest File LayoutVitest ConfigurationTwo configs, selected by npm script:
export default defineConfig({
test: {
include: ['src/**/*.test.ts'], // excludes *.live.test.ts
pool: 'forks',
testTimeout: 15_000,
},
});
export default defineConfig({
test: {
include: ['src/__tests__/live/**/*.live.test.ts'],
pool: 'forks',
testTimeout: 120_000, // 2 minutes per test — LLM latency
maxConcurrency: 1, // serial to avoid rate limiting
retry: 0, // no retries — LLM non-determinism makes retries unreliable
},
});The npm Scripts{
"scripts": {
"test": "vitest run",
"test:watch": "vitest",
"test:live": "vitest run --config vitest.config.live.ts"
}
}Component DesignLive Test Helper Module (
|
| Test | What it validates | Prompt | Assertions |
|---|---|---|---|
| Golden path | Full event lifecycle | "respond with hello" |
assertEventStreamStructure(), DoneEvent has usage.inputTokens > 0 and usage.outputTokens > 0 |
| ReadyEvent fields | Model and sessionId populated | "respond with hello" |
ReadyEvent.sessionId is non-empty string, ReadyEvent.model is truthy |
| Session resume | --session-id → --resume round-trip |
Two sequential runs: first with isFirstMessage: true, second with isFirstMessage: false and sessionId from first run's DoneEvent |
Second run's ReadyEvent.sessionId matches first run's DoneEvent.sessionId; no ErrorEvents in either run |
| AbortSignal mid-run | Cancellation against real CLI | "write a long essay" |
Abort after ReadyEvent; final event is ErrorEvent { code: 'aborted' } |
| OAuth auth path | OAuth credential selection | "respond with hello" |
Skipped if CLAUDE_CODE_OAUTH_TOKEN not set; run with only OAuth token in env; completes without ErrorEvent |
| API key auth path | API key credential selection | "respond with hello" |
Skipped if ANTHROPIC_API_KEY not set; run with only API key in env; completes without ErrorEvent |
Prompt design: All prompts are trivial and directive — "respond with exactly the word hello" — to minimize token consumption and maximize determinism. The session resume test uses two short prompts. Estimated cost: ~$0.01–0.03 per full suite run.
Timeout strategy: Each test gets maxTimeout: 60 on the ProcessOptions (not just vitest's test timeout). This ensures the spawned CLI process is killed even if LLM latency is unusually high, preventing zombie processes in CI.
Copilot Live Test Suite (src/__tests__/live/copilot.live.test.ts)
Gating: beforeAll calls CliProcess('copilot').isAvailable(). Then attempts a dry-run ACP handshake (initialize only) to verify the binary is authenticated. If either check fails, skips the suite.
Authentication verification: The Copilot CLI requires GitHub authentication. Unlike Claude (where credential presence can be checked via environment variables), Copilot authentication state is opaque — the only reliable check is attempting an invocation. The beforeAll hook runs a minimal CliProcess('copilot').run() with a trivial prompt and a 30-second timeout. If it emits a ReadyEvent, authentication is confirmed. If it errors, the suite skips.
Test cases:
| Test | What it validates | Assertions |
|---|---|---|
| Golden path | ACP event lifecycle | assertEventStreamStructure() |
| ReadyEvent session UUID | ACP session/new response parsed |
ReadyEvent.sessionId matches UUID format |
| Text content emitted | session/update notifications stream |
At least one TextEvent with non-empty text |
| Session resume | --resume=<uuid> round-trip |
Second run with sessionId from first; ReadyEvent.sessionId matches |
| AbortSignal mid-run | Cancellation of ACP session | Abort after ReadyEvent; final event is ErrorEvent { code: 'aborted' } |
No per-token cost: Copilot is subscription-priced. This suite could run on every PR if credentials are available in CI.
Extended Fake Fixture Scenarios
The business analysis identified four additional scenarios for fake-claude.mjs. These strengthen the fast-track suite without requiring credentials.
| Scenario | FAKE_SCENARIO value |
What it tests |
|---|---|---|
| Session resume | session-resume |
Accepts --resume <id> flag, emits system/init with the same session ID. Validates the isFirstMessage: false code path in CliProcess.buildArgs(). |
| Rate limit inline | rate-limit |
Emits a rate_limit_event line on stdout (not stderr). Validates EventParser handles inline rate limits and CliProcess yields ErrorEvent { code: 'rate_limit' }. |
| Permission request | permission-request |
Emits a server_tool_use block inside an assistant event. Validates EventParser maps unrecognized block types to RawEvent { rawSubtype: 'server_tool_use' }. |
| Multi-block assistant | multi-block |
Emits a single assistant event with content: [text_block, tool_use_block]. Validates EventParser yields two events (TextEvent + ToolUseEvent) from one line. |
The Copilot fixture (fake-copilot.mjs) already covers 5 scenarios and does not need extension at this stage — its ACP protocol surface is smaller and more constrained than Claude's stream-json format.
Scalability Design
Test Isolation
Each live test creates its own CliProcess instance and runs in its own forked vitest worker. There is no shared state between tests — no shared session IDs, no shared temp directories, no shared credential state. This mirrors the isolation model used by the existing fake tests and follows Switchyard's pattern of per-test temp_workspace fixtures.
Serial Execution for Live Tests
Live tests run with maxConcurrency: 1. This is not a performance optimization — it is a correctness requirement:
- Rate limiting: Concurrent Claude API calls from the same key can trigger
rate_limit_eventresponses, turning golden-path tests into failure-path tests non-deterministically. - Copilot session contention: The standalone Copilot CLI may not support concurrent ACP sessions from the same authenticated user.
- Predictable CI billing: Serial execution makes per-run API costs deterministic and auditable.
Estimated live suite duration: 2–4 minutes (6 Claude tests × 10–30s each + 5 Copilot tests × 5–15s each).
Future Backend Extension
The architecture supports adding future backends (e.g., cursor, windsurf) by:
- Adding a new
.live.test.tsfile undersrc/__tests__/live/ - Adding a new fake fixture under
src/__tests__/fixtures/ - Extending
CliBackendtype (already a union) - Using
collectLive(backend, options)from the shared helper — no new collection infrastructure needed
The vitest include pattern src/__tests__/live/**/*.live.test.ts automatically picks up new files.
Established Patterns
Pattern: PATH Injection for Fake Binaries
Already established in CliProcess.test.ts. The test's beforeAll creates a temp directory, writes the fixture script as the binary name (claude or copilot), makes it executable, and prepends the directory to PATH. This is the project's canonical pattern for testing subprocess spawning without real binaries.
Live tests do NOT use this pattern. They rely on the real binary being in the system PATH, validated by CliProcess.isAvailable().
Pattern: Event Collection via Async Generator Drain
const events: ClaudeEvent[] = [];
for await (const ev of proc.run(options)) { events.push(ev); }Used in every test that exercises CliProcess.run(). The live helper's collectLive() encapsulates this, matching how collect() works in CliProcess.test.ts.
Pattern: Scenario-Driven Fixtures
FAKE_SCENARIO env var selects fixture behavior. Both fake-claude.mjs and fake-copilot.mjs follow this pattern. New scenarios are added as case branches in a switch statement. Unknown scenarios write to stderr and exit with code 1.
Pattern: Skip-When-Unavailable Gating
Switchyard's integration tests skip when Docker, Redis, or API keys are unavailable. Documentation Robotics' CLI tests skip comprehensive tests unless manually triggered. The live test suites follow this same pattern: check prerequisites in beforeAll, skip the entire describe block if unmet.
vitest provides describe.skipIf(condition) for this:
const claudeAvailable = await new CliProcess('claude').isAvailable();
const hasCredentials = !!process.env.ANTHROPIC_API_KEY || !!process.env.CLAUDE_CODE_OAUTH_TOKEN;
describe.skipIf(!claudeAvailable || !hasCredentials)('claude live', () => { ... });Pattern: Structural Assertions Over Content Assertions
Live tests never assert on LLM-generated text content. They assert on:
- Event type presence (
events.some(e => e.type === 'ready')) - Field existence and type (
ReadyEvent.sessionIdis a non-empty string) - Numeric invariants (
seqmonotonicity,usage.inputTokens > 0) - Absence of errors (
events.filter(e => e.type === 'error').toHaveLength(0))
This is a load-bearing constraint. Any test that asserts on specific generated text will be non-deterministic and will eventually flake.
Component Reuse
From Existing Test Infrastructure
| Component | Reuse in live tests |
|---|---|
CliProcess class |
Instantiated directly with 'claude' or 'copilot' backend — no wrapper needed |
ProcessOptions interface |
Used as-is; live tests set cwd, prompt, maxTimeout, sessionId, isFirstMessage |
ClaudeEvent type union |
All assertions use the existing event type discriminators |
collect() pattern |
Extracted to shared collectLive() helper |
vitest describe.skipIf |
Used for prerequisite gating |
pool: 'forks' |
Reused in live config for process isolation |
From Reference Repositories
| Pattern | Source | Adaptation |
|---|---|---|
| Assertion helpers | Switchyard tests/utils/assertions.py |
assertEventStreamStructure() — same concept, TypeScript implementation |
| Skip-when-unavailable | Switchyard conftest.py markers |
describe.skipIf() in beforeAll hooks |
| Smoke/comprehensive split | Documentation Robotics cli-tests.yml |
Fast path (every PR) / Live path (main push only) |
| Separate CI jobs by speed | Documentation Robotics build-and-smoke vs test-comprehensive |
Unit/typecheck job vs live test job |
| Event stream capture callbacks | Switchyard test_claude_code_integration.py |
collectLive() drains the async generator identically |
CI Architecture
Workflow Design (.github/workflows/ci.yml)
Two jobs, one workflow file:
Job 1: test (runs on every PR and push to main)
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: '20', cache: 'npm' }
- run: npm ci
- run: npm run typecheck
- run: npm test
timeout-minutes: 5Job 2: test-live (runs on push to main only)
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
needs: test
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: '20', cache: 'npm' }
- run: npm ci
- run: npm run test:live
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
timeout-minutes: 10Design decisions:
test-livedepends ontestvianeeds: test. If fast tests fail, live tests don't run — saves API costs on broken builds.- No
CLAUDE_CODE_OAUTH_TOKENin CI initially. OAuth token management is more complex (refresh flows). API key is sufficient for CI smoke testing. OAuth auth path test skips gracefully. - Copilot live tests skip in CI unless
copilotbinary is installed and authenticated in the runner. This is acceptable — Copilot auth requires an interactive GitHub OAuth device flow that can't be automated in standard GitHub Actions runners. Copilot live tests are primarily for local developer validation. continue-on-error: falsefor the live job. If live tests fail onmain, it's a signal that a protocol change has occurred and downstream consumers are at risk. This should be a blocking signal, not a soft warning.- No workflow_dispatch trigger for live tests. Adding it later is trivial if needed. The current design keeps the workflow minimal.
Secret Management
| Secret | Required by | Fallback |
|---|---|---|
ANTHROPIC_API_KEY |
Claude live tests | Suite skips; job exits 0 |
CLAUDE_CODE_OAUTH_TOKEN |
OAuth-specific test only | Individual test skips |
| Copilot auth | Copilot live tests | Suite skips |
If ANTHROPIC_API_KEY is not configured as a repository secret, the live test job runs but all Claude tests skip and the job succeeds. This follows Documentation Robotics' pattern where test-comprehensive runs but individual tests skip based on availability.
Implementation Plan
Prerequisites
P0: Merge feat/v0.4-copilot-backend to main.
The Copilot backend implementation (ACP protocol support, createCopilotAcpParser(), fake-copilot.mjs, 13 Copilot fake tests) is complete on the feature branch but not yet merged. All Copilot-related work in this plan depends on it. The user has indicated intent to merge — this should happen before implementation begins.
Phase 1: Test Infrastructure (no new tests yet)
1.1. Create vitest.config.live.ts
New vitest config file targeting src/__tests__/live/**/*.live.test.ts with 120s timeout, maxConcurrency: 1, and pool: 'forks'.
1.2. Add test:live npm script
"test:live": "vitest run --config vitest.config.live.ts" in package.json.
1.3. Create src/__tests__/live/ directory
Empty directory (with a placeholder or the first test file from Phase 2).
1.4. Create src/__tests__/helpers/live-helpers.ts
Shared utilities: collectLive(), assertEventStreamStructure(), credential-check helpers, and skipUnlessAvailable() for beforeAll hooks.
Phase 2: Claude Live Tests
2.1. Create src/__tests__/live/claude.live.test.ts
Six test cases as specified in the Component Design section: golden path, ReadyEvent fields, session resume, AbortSignal, OAuth auth path, API key auth path. All gated on binary availability and credential presence.
2.2. Validate locally
Run ANTHROPIC_API_KEY=<key> npm run test:live and confirm all six tests pass (or skip appropriately when credentials are absent).
Phase 3: Copilot Live Tests
3.1. Create src/__tests__/live/copilot.live.test.ts
Five test cases as specified: golden path, ReadyEvent UUID, text content, session resume, AbortSignal. Gated on binary availability and authentication via dry-run handshake.
3.2. Validate locally
Run npm run test:live with copilot installed and authenticated. Confirm tests pass or skip when the binary is absent.
Phase 4: Extended Fake Scenarios
4.1. Add four new scenarios to fake-claude.mjs
session-resume, rate-limit, permission-request, multi-block as specified in the Component Design section.
4.2. Add corresponding tests to CliProcess.test.ts and/or EventParser.test.ts
One test per new scenario, following the existing pattern (set FAKE_SCENARIO, collect events, assert structure).
Phase 5: CI Workflow
5.1. Create .github/workflows/ci.yml
Two-job workflow as specified: test (all PRs, all pushes) and test-live (main pushes only, needs test).
5.2. Configure repository secret
ANTHROPIC_API_KEY must be added to the repository's GitHub Actions secrets. This is a manual step outside the codebase.
Phase 6: Documentation
6.1. Update README.md
Add a "Testing" section covering:
npm test— offline fast tests, no prerequisitesnpm run test:live— live smoke tests, prerequisites (binary in PATH, credentials)- Environment variables:
ANTHROPIC_API_KEY,CLAUDE_CODE_OAUTH_TOKEN - Copilot:
copilotCLI installed and authenticated viagh auth login - Behavior when prerequisites are missing (suites skip, don't fail)
- Running a specific test:
npx vitest run src/__tests__/live/claude.live.test.ts --config vitest.config.live.ts
6.2. Update ROADMAP.md
Mark live integration tests as completed under the appropriate milestone.
Risks and Mitigations
| Risk | Likelihood | Impact | Mitigation |
|---|---|---|---|
Claude CLI stream-json format changes silently |
Medium | High — parser breaks, downstream consumers affected | Live tests on main push detect drift within hours |
| Copilot ACP protocol changes between versions | Medium | High — ACP is GA but young (Feb 2026) | Live tests catch JSON-RPC contract changes; RawEvent fallback preserves unknown events |
| Live tests flake due to LLM non-determinism | Low | Medium — false CI failures | Structural assertions only; no content matching; no retries (retries mask real issues) |
| API cost accumulation | Low | Low — trivial prompts cost <$0.05 per run | Only runs on main push; Copilot is subscription-priced |
CI runner lacks copilot binary |
Certain | Low — tests skip gracefully | Copilot live tests designed for local validation; describe.skipIf prevents CI failures |
| Rate limiting during live tests | Low | Medium — test appears to fail | Serial execution (maxConcurrency: 1); trivial prompts minimize token usage |
Generated by Orchestrator Bot 🤖
Processed by the software_architect agent
Beta Was this translation helpful? Give feedback.
-
Beta Was this translation helpful? Give feedback.
-
Pr Code ReviewerAll five review agents have completed. Let me now compile the findings into the required structured format, filtering to only Critical and High Priority issues. PR Review FindingsCritical Issues
High Priority Issues
Clean Areas
Generated by Orchestrator Bot 🤖 |
Beta Was this translation helpful? Give feedback.
-
Requirements VerifierNow I have everything I need to assess the implementation against the acceptance criteria. Parent Issue Requirements VerificationGaps Found
DeviationsNone found. Verified
Generated by Orchestrator Bot 🤖 |
Beta Was this translation helpful? Give feedback.
-
Requirements VerifierNow I have the full picture of the PR. Let me compare each functional requirement against what was implemented. Business Analyst Output VerificationGaps Found
DeviationsNone found. Verified
Generated by Orchestrator Bot 🤖 |
Beta Was this translation helpful? Give feedback.
-
Requirements VerifierNow I have everything I need for a complete analysis. Let me compile the findings. Software Architect Output VerificationGaps FoundNone found. DeviationsNone found. Verified
Generated by Orchestrator Bot 🤖 |
Beta Was this translation helpful? Give feedback.
-
Pr Code ReviewerGroups:
Generated by Orchestrator Bot 🤖 |
Beta Was this translation helpful? Give feedback.
-
Pr Code ReviewerNow I have all the data I need. Let me compile the final review findings. The prior cycle #13 addressed "Error Handling and Event Parsing" and #14 addressed "Copilot Test Infrastructure" — the fixes for those are visible in the current code (the PR Review FindingsCritical IssuesNone found High Priority Issues
Clean Areas
Generated by Orchestrator Bot 🤖 |
Beta Was this translation helpful? Give feedback.
-
Requirements VerifierParent Issue Requirements VerificationGaps FoundNone found. DeviationsNone found. Verified
Generated by Orchestrator Bot 🤖 |
Beta Was this translation helpful? Give feedback.
-
Requirements VerifierNow I have enough information to compare the implementation against the functional requirements. Business Analyst Output VerificationGaps Found
Deviations
Verified
Generated by Orchestrator Bot 🤖 |
Beta Was this translation helpful? Give feedback.
-
Requirements VerifierNow I have a complete picture. Let me compile the verification report. Software Architect Output VerificationGaps FoundNone found. DeviationsNone found. Verified
Generated by Orchestrator Bot 🤖 |
Beta Was this translation helpful? Give feedback.
-
Pr Code ReviewerVerification complete. Two BA findings are false positives — the CI file has both {"groups":[{"name":"ACP Protocol Handling","severity":"high","findings":"- ACP Handshake Sends Generated by Orchestrator Bot 🤖 |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
Requirements Analysis
Auto-created from Issue #2
User Request
Overview
Add a comprehensive suite of live integration tests that validate the code-wrapper CLI is functional end-to-end. Tests should exercise real invocations against a live environment rather than mocked dependencies.
Goals
Acceptance Criteria
Labels: None
Requested by: @tinkermonkey
The orchestrator will analyze this request and develop detailed requirements.
When complete, Issue #2 will be updated with final requirements.
Beta Was this translation helpful? Give feedback.
All reactions