Skip to content

Epic 8: Guided Inspection Flow (Stories 8.1–8.7)#34

Draft
don-petry wants to merge 8 commits into
epic7-apiary-hive-crudfrom
epic8-guided-inspection
Draft

Epic 8: Guided Inspection Flow (Stories 8.1–8.7)#34
don-petry wants to merge 8 commits into
epic7-apiary-hive-crudfrom
epic8-guided-inspection

Conversation

@don-petry

Copy link
Copy Markdown
Contributor

Summary

Stacked on #33 (Epic 7).

Core Infrastructure

  • Inspection types — InspectionType, Observation, VoiceCaptureState, analysis result types
  • Prompt tree — 8 configurable prompts with adaptive branching (swarm risk path)
  • Step engine — full/quick mode, branch insertion, dynamic total calculation
  • Inspection store — Zustand + MMKV persistence for crash recovery, full lifecycle (start/pause/resume/complete/clear)
  • GraphQL operations — start, addObservation, pause, resume, complete, media upload URL, image/acoustic analysis

Screens

  • 8.1 Entry — Scope confirmation (full vs quick), resume detection for in-progress inspections, offline banner
  • 8.2 Guided Steps — Single prompt per screen, progress bar, observation options with classification badges (normal/cautionary/urgent), voice hint, free-text fallback
  • 8.3-8.5 Voice/Image/AI — Types and GraphQL scaffolded; VoiceLogCapture state machine, image compression/upload, Vision AI polling interfaces defined
  • 8.6 Acoustic — Types and GraphQL scaffolded for hive sound analysis
  • 8.7 Summary — Observation list with status counts, colony improvement signal, save flow

Design Compliance

  • All interactive elements meet 48px touch targets
  • Classification badges use icon + text + color (never color alone)
  • Colors via ICON_COLORS constants (no hardcoded hex/rgb)
  • Incremental local persistence via MMKV (NFR9d)

Test plan

  • 315 TypeScript tests pass (38 suites, 16 new)
  • Step engine: 8 tests (prompt sequence, branching, quick mode, next index)
  • Inspection store: 8 tests (lifecycle, observations, pause/resume, safety)
  • Go tests pass, lint clean

🤖 Generated with Claude Code

Core inspection infrastructure:
- Inspection types, prompt tree (8 prompts with adaptive branching)
- Step engine with full/quick mode, swarm-risk branch insertion
- Inspection Zustand store with MMKV persistence for crash recovery
- GraphQL operations for all inspection lifecycle mutations

Inspection screens:
- Entry screen with scope confirmation (full vs quick), resume detection
- Guided step screen with progress bar, observation options, classification
  badges (normal/cautionary/urgent), voice hint, free-text fallback
- Summary screen with observation list, status counts, colony improvement
  signal, save flow

Voice/media capture scaffolded via types and GraphQL operations:
- VoiceLogCapture states (idle/listening/processing/confirm)
- Image capture, compression, upload via signed URL
- Vision AI and acoustic analysis result types and polling queries

315 tests passing (38 suites), 16 new tests for step engine and
inspection store. Lint clean, Go tests passing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings March 30, 2026 00:08
@coderabbitai

coderabbitai Bot commented Mar 30, 2026

Copy link
Copy Markdown

Important

Review skipped

Draft detected.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: e34fa4f6-a765-4cbe-bf59-a23740d4d416

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch epic8-guided-inspection

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.

Copilot AI 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.

Pull request overview

Implements Epic 8’s guided inspection flow in the mobile app, including local/persisted inspection state, prompt sequencing with branching, GraphQL operation scaffolding, and the entry/step/summary screens.

Changes:

  • Added a persisted Zustand inspection store (MMKV-backed) with lifecycle actions and tests.
  • Added inspection domain types, prompt tree configuration, and a step engine (+ tests) to compute sequences/totals.
  • Added GraphQL operations for inspection lifecycle and media/analysis scaffolding, plus new inspection entry/step/summary screens.

Reviewed changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
apps/mobile/src/store/inspection-store.ts New persisted inspection lifecycle store (Zustand + MMKV).
apps/mobile/src/store/inspection-store.test.ts Unit tests for inspection store lifecycle and mutations.
apps/mobile/src/services/graphql/inspection.ts GraphQL queries/mutations for inspection lifecycle + analysis scaffolding.
apps/mobile/src/features/inspection/types/index.ts New inspection/prompt/observation domain types.
apps/mobile/src/features/inspection/services/step-engine.ts Prompt sequencing + branching logic and step calculations.
apps/mobile/src/features/inspection/services/step-engine.test.ts Tests for sequencing, branching behavior, and totals.
apps/mobile/src/features/inspection/constants/prompt-tree.ts Full/quick prompt configuration + branch override metadata.
apps/mobile/app/(tabs)/apiaries/[id]/hives/[hiveId]/inspect/index.tsx Inspection entry (type selection, offline banner, resume detection).
apps/mobile/app/(tabs)/apiaries/[id]/hives/[hiveId]/inspect/step.tsx Guided step screen (single prompt, options/free-text, progress).
apps/mobile/app/(tabs)/apiaries/[id]/hives/[hiveId]/inspect/summary.tsx Summary screen (counts, observation list, save/clear flow).
_bmad-output/implementation-artifacts/sprint-status.yaml Updates Epic 8 sprint status tracking.

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

Comment on lines +47 to +60
{
id: 'swarm_risk',
title: 'Swarm Risk Assessment',
description: 'Swarm cells were found. How crowded is the hive? Are there eggs in the cells? This helps determine urgency.',
compactLabel: 'Swarm risk details',
observationType: 'swarm_risk',
options: [
{ id: 'capped', label: 'Cells are capped — swarm imminent', classification: 'urgent' },
{ id: 'uncapped_eggs', label: 'Uncapped with eggs/larvae', classification: 'cautionary' },
{ id: 'empty_cups', label: 'Empty queen cups only', classification: 'normal' },
],
isRequired: false,
quickMode: false,
},

Copilot AI Mar 30, 2026

Copy link

Choose a reason for hiding this comment

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

swarm_risk is included in FULL_INSPECTION_PROMPTS unconditionally, so full inspections will always show this step even when the user selects a non-swarm option in queen_cells. If this step is intended to be conditional (per the nextPromptOverride branching), it should be excluded from the base prompt list and only added by the step engine when the triggering observation occurs (and getTotalSteps will then reflect the dynamic total).

Copilot uses AI. Check for mistakes.
Comment on lines +16 to +18
const startInspection = useInspectionStore((s) => s.startInspection);
const hasActive = useInspectionStore((s) => s.hasActiveInspection);
const isOnline = useConnectivityStore((s) => s.isOnline);

Copilot AI Mar 30, 2026

Copy link

Choose a reason for hiding this comment

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

hasActive is selected as the hasActiveInspection function, so this screen won’t re-render when inspectionId/status changes (the function reference is stable). This can leave the UI stuck showing the start UI even after an inspection becomes active (or vice versa) while the screen remains mounted in the navigation stack. Select a derived boolean from store state instead (e.g., via a selector that returns inspectionId !== null && status !== 'completed', or expose hasActiveInspection as a computed value in the store).

Copilot uses AI. Check for mistakes.
Comment on lines +107 to +129
8 steps — entrance, brood, queen cells, stores, pests, colony health, actions
</Text>
</View>
</View>
</Pressable>

<Pressable
className={`p-4 rounded-xl border-2 min-h-[48px] ${
selectedType === 'quick' ? 'border-primary-500 bg-primary-50' : 'border-outline-200'
}`}
onPress={() => setSelectedType('quick')}
accessibilityRole="radio"
accessibilityState={{ selected: selectedType === 'quick' }}
accessibilityLabel="Quick inspection: key observations only"
testID="type-quick"
>
<View className="flex-row items-center gap-3">
<Ionicons name="flash-outline" size={24} color={ICON_COLORS.muted} />
<View className="flex-1">
<Heading size="md">Quick Check</Heading>
<Text size="sm" className="text-typography-500">
5 steps — entrance, brood, queen cells, colony health, actions
</Text>

Copilot AI Mar 30, 2026

Copy link

Choose a reason for hiding this comment

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

The step counts in the option descriptions are hardcoded (8 steps, 5 steps). Since total steps are computed dynamically by the step engine (and may change with prompt-tree edits/branching), these strings can easily drift out of sync with actual behavior. Consider deriving these counts from getTotalSteps(...) / getPromptSequence(...) so the UI stays accurate.

Copilot uses AI. Check for mistakes.
Comment on lines +8 to +23
const basePrompts = getPromptsForType(type);
const result: InspectionPrompt[] = [];

for (const prompt of basePrompts) {
result.push(prompt);

// Check if any observation for this prompt triggers a branch
const obs = observations.find((o) => o.promptId === prompt.id);
if (obs && prompt.options) {
const selected = prompt.options.find((o) => o.id === obs.value);
if (selected?.nextPromptOverride) {
const branchPrompt = basePrompts.find((p) => p.id === selected.nextPromptOverride);
if (branchPrompt && !result.includes(branchPrompt)) {
// Insert branch prompt after current
result.push(branchPrompt);
}

Copilot AI Mar 30, 2026

Copy link

Choose a reason for hiding this comment

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

Branch insertion currently searches basePrompts (already filtered by inspection type) to find nextPromptOverride. This means a branch target that’s not in the base list (e.g., a quickMode: false prompt like swarm_risk) can never be inserted for quick inspections, even when an option explicitly requests it. Consider keeping an unfiltered prompt lookup (e.g., from the full tree) for override targets, while still starting from the type-filtered base sequence.

Copilot uses AI. Check for mistakes.
- Replace misleading `as 'checkmark-circle'` casts with proper
  `as keyof typeof Ionicons.glyphMap` across 3 files
- Add updateObservation test to inspection store (covers public API)
- Fix swarm_risk test: assert exact count (1) and verify placement
  immediately after queen_cells when branching triggers
- Add branch ordering test for swarm risk insertion

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@sonarqubecloud

Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
0.0% Coverage on New Code (required ≥ 80%)
7.9% Duplication on New Code (required ≤ 3%)

See analysis details on SonarQube Cloud

@don-petry

don-petry commented Apr 16, 2026

Copy link
Copy Markdown
Contributor Author
Superseded by automated re-review at 8973da12e4c806de6fb91aedb19c2e96bada62e2 — click to expand prior review.

Review — fix requested (cycle 1/3)

The automated review identified the following issues. Please address each one:

Findings to fix

  • [major] apps/mobile/app/(tabs)/apiaries/[id]/hives/[hiveId]/inspect/step.tsx:64 — Stale memoized prompts used in handleNext: after calling store.addObservation() the component still holds the pre-observation prompts memo, so getNextPromptIndex computes against the old sequence. When a user selects 'swarm cells', swarm_risk is inserted into the sequence on re-render but the already-committed currentPromptIndex skips over it entirely. The fix is to compute the updated prompt sequence inside handleNext using the new observations list before calling setPromptIndex.
  • [major] SonarCloud Quality Gate FAILED: 0.0% coverage on new code (required >= 80%) and 7.9% duplication on new code (required <= 3%). mergeStateStatus is UNSTABLE.
  • [minor] apps/mobile/app/(tabs)/apiaries/[id]/hives/[hiveId]/inspect/step.tsx:13 — CLASSIFICATION_STYLES (step.tsx) and CLASSIFICATION_CONFIG (summary.tsx) are nearly identical records mapping ObservationClassification to badge styles. Should be extracted to a shared constants file to eliminate the ~15-line duplication that contributes to the SonarCloud duplication failure.
  • [minor] apps/mobile/app/(tabs)/apiaries/[id]/hives/[hiveId]/inspect/step.tsx:38 — Router side-effect called directly in the render body: if (!currentPrompt) { router.replace(...); return null; }. This should be moved into a useEffect to avoid calling router during render, which can cause React warnings or double-navigation in strict mode.

Additional tasks

  1. Resolve all unresolved review thread comments from other reviewers
  2. Ensure all CI checks pass after your changes
  3. Rebase on epic7-apiary-hive-crud if the branch is behind
  4. Do NOT modify files unrelated to the findings above

The review cascade will automatically re-review after new commits are pushed.

@don-petry

Copy link
Copy Markdown
Contributor Author

@claude Please address all open review comments on this PR from CodeRabbit and Copilot.

@claude

claude Bot commented May 6, 2026

Copy link
Copy Markdown

Claude finished @don-petry's task in 11m 10s —— View job


Addressing Review Comments — Done

All open Copilot and cycle-1 review findings addressed in commit 4069dcc.


Changes made

prompt-tree.tsswarm_risk removed from base sequence (Copilot: line 60)

swarm_risk was in FULL_INSPECTION_PROMPTS unconditionally, so every full inspection showed that step even without swarm cells observed. It is now a branch-only prompt in a separate BRANCH_PROMPTS array. A new ALL_PROMPTS export (base + branch) is used by the step engine for override lookups. getPromptsForType('full') no longer returns swarm_risk by default — full inspections now run 7 base steps instead of 8.

step-engine.ts — branch lookup uses ALL_PROMPTS (Copilot: line 23)

Previously nextPromptOverride targets were looked up in basePrompts (already filtered by type), so quick inspections could never branch to full-only prompts like swarm_risk. The lookup now uses the full ALL_PROMPTS table, fixing the branching path for quick inspections too.

step.tsx — stale prompts in handleNext (Review: line 64)

After store.addObservation() is dispatched, the component's memoised prompts is stale (it reflects observations from the last render). handleNext now explicitly builds [...store.observations, newObservation] and calls getPromptSequence with it before computing getNextPromptIndex, so branch insertions are reflected immediately.

step.tsx — router side-effect moved to useEffect (Review: line 38)

router.replace(...) was called directly in the render body when currentPrompt was undefined. This can cause React warnings and double-navigation in strict mode. It is now in a useEffect(..., [currentPrompt, ...]). The return null guard remains for rendering safety.

constants/classification.ts — shared classification styles (Review: line 13)

CLASSIFICATION_STYLES in step.tsx and CLASSIFICATION_CONFIG in summary.tsx were nearly identical ~15-line records. Both are replaced with a single import from src/features/inspection/constants/classification.ts, eliminating the duplication that was contributing to the SonarCloud duplication score.

index.tsx — reactive hasActiveInspection selector (Copilot: line 18)

useInspectionStore((s) => s.hasActiveInspection) was selecting the action function, which has a stable reference and doesn't trigger re-renders when inspectionId/status changes. Changed to useInspectionStore((s) => s.inspectionId !== null && s.status !== 'completed') — a derived boolean that re-renders the component on state change.

index.tsx — step counts derived from getTotalSteps (Copilot: line 129)

Hardcoded "8 steps" and "5 steps" strings replaced with getTotalSteps('full', []) and getTotalSteps('quick', []) computed at module level. Values now track the prompt tree automatically.

__tests__/inspect-screens.test.tsx — 28 new tests (SonarCloud coverage)

Covers all three inspect screens: entry (scope selection, resume detection, online/offline, begin flow), step (option selection, advancement, swarm branching integration, last-step navigation, pause), and summary (stats, classification rendering, save flow). The swarm-branching test is an end-to-end integration that validates the stale-prompts fix: it walks state to queen_cells, selects swarm, presses Next, and asserts that currentPromptIndex advances to 3 (the swarm_risk slot) rather than skipping it.


Note on SonarCloud duplication

The duplication score was partly driven by the classification constants being copy-pasted. Extracting them to a shared file eliminates that contribution. Coverage improvement requires CI to run the new 28 tests — the metric will update after the next SonarCloud scan.
· Branch

github-actions Bot and others added 2 commits May 6, 2026 11:36
…ion, screen tests

Addresses all open Copilot and cycle-1 review findings:

- prompt-tree: remove swarm_risk from base sequence; add ALL_PROMPTS export so
  the step engine can find branch-only prompts without them appearing in every
  full inspection unconditionally (Copilot: prompt-tree.ts:60)
- step-engine: use ALL_PROMPTS for nextPromptOverride lookup so quick-mode
  inspections can also branch to full-only prompts like swarm_risk
  (Copilot: step-engine.ts:23)
- step.tsx: fix stale memoised prompts in handleNext by recomputing the sequence
  with the new observation before calculating the next index, so swarm_risk
  insertion is reflected before setPromptIndex is called (Review: step.tsx:64)
- step.tsx: move router.replace out of render body into useEffect to avoid
  side-effects during render / strict-mode double-navigation (Review: step.tsx:38)
- classification.ts: extract shared CLASSIFICATION_STYLES constant from step.tsx
  and CLASSIFICATION_CONFIG from summary.tsx into a single source of truth,
  eliminating the ~15-line duplication (Review: step.tsx:13)
- index.tsx: select derived boolean for hasActiveInspection rather than the
  function reference so the component re-renders on state changes
  (Copilot: index.tsx:18); derive step counts from getTotalSteps instead of
  hardcoding them (Copilot: index.tsx:129)
- inspect-screens.test.tsx: 28 new tests covering all three inspect screens,
  including swarm branching integration, to improve SonarCloud new-code coverage

Co-authored-by: Don Petry <don-petry@users.noreply.github.com>
@donpetry-bot

Copy link
Copy Markdown
Contributor

Review — fix requested (cycle 2/3)

The automated review identified the following issues. Please address each one:

Findings to fix

[Findings would be inserted here]

Additional tasks

  1. Resolve all unresolved review thread comments from other reviewers
  2. Ensure all CI checks pass after your changes
  3. Rebase on the target branch if behind
  4. Do NOT modify files unrelated to the findings above

The review cascade will automatically re-review after new commits are pushed.

don-petry and others added 2 commits May 11, 2026 00:08
* Epic 9: Recommendation Engine (Stories 9.1–9.5)

Story 9.1: Context assembly service — assembles hive context from
inspection history, seasonal phase, region, telemetry with freshness
timestamps and missing source flagging

Story 9.2: Confidence penalty system — adjusts recommendation confidence
based on stale/missing data sources, downgrades confidence type
appropriately (HIGH→MODERATE→LOW→INSUFFICIENT_DATA)

Story 9.3: Conservative defaults — generates safe fallback recommendations
when data is insufficient, season-aware (winter: food stores, spring:
swarm prep)

Story 9.4: Degraded mode — confidence floor at 0.1, INSUFFICIENT_DATA
capped at 0.5, configurable staleness thresholds (weather 24h, flora 7d)

Story 9.5: Skill mismatch detection — detects sustained behavioral
patterns (5+ signals in 14-day window) suggesting misconfigured skill
level, returns gentle suggestion message

14 new Go tests covering all service methods. All tests passing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Fix Epic 9 review: confidence downgrade cascade, conservative default ID

- Reorder confidence type downgrade to use else-if chain, preventing
  MODERATE from being immediately overwritten by LOW when penalty is
  in the 0.2-0.3 range. Most severe condition (missing sources) now
  checked first.
- Give conservative default recommendation a proper ID instead of empty
  string, and handle NewRecommendation error explicitly.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Fix Epic 9 review: monotonic confidence downgrade, propagate errors, clean AssembleContext stub

- ApplyConfidencePenalty: guard HIGH→LOW downgrade so INSUFFICIENT_DATA and
  other non-standard types are never upgraded; reorder INSUFFICIENT_DATA cap
  before universal floor with inline invariant comments (Copilot + cycle-1 review)
- AssembleContext: remove unconditional stub that marked all three sources as
  missing on every call, making HIGH/MODERATE confidence unreachable; return
  clean context — integration hooks documented in godoc (cycle-1 major)
- GenerateConservativeDefault: return (*domain.Recommendation, error) instead
  of silently swallowing the error and returning nil (Copilot + cycle-1 minor)
- Tests: update AssembleContext test for corrected stub behavior; add
  INSUFFICIENT_DATA-not-upgraded-to-LOW test; update GenerateConservativeDefault
  tests to handle error return (Copilot)
- sonar-project.properties: add sonar.go.coverage.reportPaths so SonarCloud
  picks up the coverage.out emitted by the CI Go job (cycle-1 major)

Co-authored-by: Don Petry <don-petry@users.noreply.github.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Don Petry <don-petry@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
@donpetry-bot

Copy link
Copy Markdown
Contributor

Review — fix requested (cycle 2/3)

The automated review identified the following issues. Please address each one:

Findings to fix

[Findings would be inserted here]

Additional tasks

  1. Resolve all unresolved review thread comments from other reviewers
  2. Ensure all CI checks pass after your changes
  3. Rebase on the target branch if behind
  4. Do NOT modify files unrelated to the findings above

The review cascade will automatically re-review after new commits are pushed.

@donpetry-bot

Copy link
Copy Markdown
Contributor

Review — fix requested (cycle 2/3)

The automated review identified the following issues. Please address each one:

Findings to fix

[Findings would be inserted here]

Additional tasks

  1. Resolve all unresolved review thread comments from other reviewers
  2. Ensure all CI checks pass after your changes
  3. Rebase on the target branch if behind
  4. Do NOT modify files unrelated to the findings above

The review cascade will automatically re-review after new commits are pushed.

@don-petry don-petry marked this pull request as draft May 21, 2026 00:36
@github-actions

github-actions Bot commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

CI Failure: SonarCloud Code Analysis

Step: SonarCloud Scan
Root cause: Config error

sonar-project.properties was updated in this PR to add sonar.go.coverage.reportPaths=apps/api/coverage.out, but the .github/workflows/sonarcloud.yml workflow has no step to generate that file — it goes directly from actions/checkout to the SonarCloud scan action. SonarCloud cannot find the coverage report, so it treats Go coverage as 0% and the quality gate fails on new-code coverage.

Suggested fix: Add a Go test step to .github/workflows/sonarcloud.yml before the scan — e.g., cd apps/api && go test -coverprofile=coverage.out ./... — so the coverage report exists when SonarCloud reads it.

View run logs

@sonarqubecloud

sonarqubecloud Bot commented Jun 4, 2026

Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
0.0% Coverage on New Code (required ≥ 80%)
10.5% Duplication on New Code (required ≤ 3%)

See analysis details on SonarQube Cloud

@github-actions

github-actions Bot commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

CI Failure: SonarCloud Code Analysis

Step: SonarCloud Quality Gate
Root cause: Config error

This PR adds sonar.go.coverage.reportPaths=apps/api/coverage.out to sonar-project.properties, but the file apps/api/coverage.out is never generated — no CI step runs go test -coverprofile before SonarCloud analysis. As a result, SonarCloud either cannot read coverage data or sees 0% coverage on the 183 lines of new Go code in recommendation.go, failing the quality gate. The missing coverage report is the misconfiguration; SonarCloud cannot ingest what does not exist.

Suggested fix: Add a step in the SonarCloud workflow to generate the coverage report before analysis runs: go test ./... -coverprofile=apps/api/coverage.out -covermode=atomic executed from the apps/api directory.

View run logs

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.

4 participants