32 KiB
Codebase Audit Findings
Status: in progress
This document is the working ledger and final report for the audit defined by the audit plan and audit sequence. The audit is investigative: candidate findings below are not remediation changes.
Audit Identity And Baseline
| Field | Value |
|---|---|
| Audited revision | 74e2d21de5fb2ada0be5ef3fe9333e0d48ac7fb3 (Close the completed roadmap documents) |
| Branch | main, attached worktree |
| Initial worktree state | Untracked docs/roadmap/audit-plan.md and docs/roadmap/audit-sequence.md; no production or test changes |
| Audit date | 2026-08-10 UTC |
| Toolchain | go version go1.26.5 linux/amd64 |
| Platform | GOOS=linux, GOARCH=amd64 |
| Repository root | /home/eric/Workspace/narratio |
The two initial untracked files are the audit specification supplied for this run. Adding this ledger and tracking those documents changes documentation only; all implementation and test evidence remains pinned to the revision above. If implementation or tests change, affected audit stages must be rerun and this section must record the new revision.
Baseline Commands
| Command | Result | Wall time | Evidence or limitation |
|---|---|---|---|
go test -count=1 ./... |
pass | 3.34 s | All 23 packages passed; cmd/narratio has no test files. |
go test -race -count=1 ./... |
fail | 55.65 s | Race in internal/adapters/whisperx.(*FakeClient).Transcribe at fake.go:45, reached concurrently by TestTranscribeStageTranscribesPreparedAudio; candidate TST-001. All packages reported before internal/stage passed. |
go vet ./... |
pass | 0.47 s | No diagnostics. |
go build -o "$audit_build_dir/narratio" ./cmd/narratio |
pass | 1.03 s | Built outside the repository in /tmp/tmp.x11pJL7014. |
go test -coverprofile="$audit_build_dir/coverage.out" ./... |
pass | 11.05 s | Diagnostic coverage only; no percentage is treated as a gate. |
Coverage ranged from 69.8% (internal/manifest) to 100% (internal/logging)
among tested packages. cmd/narratio reported 0% because it has no tests. The
remaining package results ranged from 70.1% to 88.1%. Stage 12 owns the
risk-based interpretation; these numbers are inventory signals only.
Code Graph Freshness And Structural Inventory
The narratio graph was rebuilt in moderate mode after the revision was
pinned. Its branch record reports the exact audited HEAD, main, and the
repository root above. The index contains 2,407 nodes and 13,181 edges across
224 modeled files: 1,494 functions, 136 methods, 226 structs, 12 interfaces,
and 20 modeled package nodes. The moderate filter excluded documentation,
examples, .git, .codex, and cmd/narratio; the executable entry point was
therefore verified through go list and direct inspection instead of graph
evidence. Internal production code is represented at the pinned revision.
Repository inventory at that revision:
- 23 Go packages, including
cmd/narratio; - 221 tracked Go files and 95 tracked
_test.gofiles; - 278 tracked files total;
- one process entry point,
cmd/narratio/main.go, delegating tointernal/app.Execute; - 11 canonical stages returned by
internal/stage.All; and - 12 modeled interfaces, of which 11 are Narratio boundaries and one is the private AWS S3 client seam.
Graph call tracing from internal/app.Execute confirms command dispatch into
run, single-stage, clean, and session-helper paths, followed by configuration,
artifact/path, manifest, stage, storage, restore, and cleanup owners. The
production import inventory shows no lower-level package importing
internal/app; apparent graph rollups such as stage -> app, adapters -> app,
and config -> app came from test relationships or graph classification and
are rejected as production dependency reversals at this mapping stage.
Metric Signals For Later Review
These are prioritization signals, not findings:
| Signal | Evidence | Assigned review |
|---|---|---|
| High fan-in | app.Error (207), stage Run symbols (151), app.Execute (108), stage.sessionPathsForEnv (105), manifest.New (72), manifest.MarkStageSucceeded (56), app.executeStages (48), artifacts.S3SessionPrefix (41), and artifacts.SessionWorkDirForCampaign (37) |
Owning behavior stages, then Stage 11 |
| High complexity | app.executeStages cyclomatic 54/cognitive 96; previouscache.BuildPlan 22/38; analyzeStage.Run 20/27; audita.NewSubprocessRunner 17/25; app.SessionInit 20/21 |
Stages 2, 5, 7, 10, then 11 |
| Exact similarity | app.Analyze/app.Publish, manifest.Load/LoadRun, manifest.Create/CreateRun, adapter constructors, and Seriatim fake methods |
Owning behavior stages, then Stage 11 |
| Test-heavy hotspot noise | Several test functions and fakes rank highly in transitive-depth and fan-in results | Stage 12; do not infer production risk from the metric |
Automation And Fixture Inventory
.woodpecker/release.ymlis tag-only release automation. It cross-builds Linux, macOS, and Windows binaries with Go 1.25, then publishes release assets. It does not run tests, race tests, vet, or example validation.examples/contains 19 maintained files: pipeline, campaign, session, template, stable-input, and placeholder-audio fixtures. Configuration tests are documented as their validation owner.- No fuzz tests, golden files, golden-update switches, opt-in/live test tags, or
go:generatetest mechanisms were found. - Platform build constraints exist for the native no-replace directory tests
and unsupported-platform fallback in
internal/fileops.
Execution Coverage Ledger
| Stage | Status | Evidence and result |
|---|---|---|
| 0: baseline | complete | Revision/environment pinned; graph refreshed; inventories and every prescribed baseline command recorded. TST-001 owns the non-blocking race limitation. |
| 1: contract and boundary map | complete | Canonical contracts and focused internal docs read; ownership, stage-contract, lifecycle, scenario, area, and preliminary risk-to-test matrices recorded below. |
| 2: runner and manifest | not_started | Assigned lifecycle and dual-ledger questions below. |
| 3: paths and filesystem | not_started | Assigned path, lock, artifact, and mutation questions below. |
| 4: publish and cleanup | not_started | Assigned remote commit and cleanup scenarios below. |
| 5: restore and previous state | not_started | Assigned restore and previous-cache scenarios below. |
| 6: configuration and composition | not_started | Assigned configuration, CLI composition, and process-boundary areas below. |
| 7: adapters and shared support | not_started | Assigned external-boundary and cancellation areas below. |
| 8: ordinary stages | not_started | Assigned prepare/transcript behavior and disabled-outcome questions below. |
| 9: extraction | not_started | Assigned extraction promotion, provenance, and resume scenario below. |
| 10: analyze and dependencies | not_started | Assigned artifact dependency/source and selection scenario below. |
| 11: maintainability | not_started | Seeded by graph complexity, similarity, and fan-in signals only. |
| 12: test policy | not_started | Seeded by intended owners and baseline execution observations. |
| 13: synthesis | not_started | No final ranking or accepted-risk decisions yet. |
Area Coverage And Ownership
Every area in the audit plan has a primary execution owner. assigned means it
has been mapped but not behaviorally audited.
| Inspection area | Canonical implementation owner | Primary audit stage | Status |
|---|---|---|---|
| Process and application boundary | cmd/narratio, internal/app |
6 (runner lifecycle portions in 2; publish/restore portions in 4-5) | assigned |
| Stage registry and runner | internal/stage, internal/app |
2 | assigned |
| Configuration | internal/config |
6 | assigned |
| Prepare and audio | internal/stage, internal/audio, internal/previouscache |
8 | assigned |
| Transcript stages | internal/stage plus tool adapters |
8 | assigned |
| Extraction | internal/stage, Notarius adapter, internal/fileops |
9 | assigned |
| Analyze and artifact dependencies | internal/stage, internal/artifacts, internal/artifactpolicy |
10 | assigned |
| Publish and cleanup | internal/stage, internal/app |
4 | assigned |
| Manifest state | internal/manifest, transition policy in internal/app |
2 | assigned |
| Artifacts, paths, and policy | internal/artifacts, internal/artifactpolicy, internal/pathsafe |
3 (resolution consumption revisited in 10) | assigned |
| Restore | internal/app, internal/artifacts, internal/previouscache, internal/audio |
5 | assigned |
| File operations | internal/fileops, internal/pathsafe, local artifact store |
3 (promotion vertical slice in 9) | assigned |
| External adapters and storage | internal/adapters, internal/audio |
7 | assigned |
| Shared models and diagnostics | internal/artifactmodel, internal/contracts, internal/logging |
7 (maintainability revisited in 11) | assigned |
| Tests, examples, and automation | package test owners, examples/, .woodpecker/ |
12 | assigned |
Package And Interface Ownership Map
| Package | Owned contract or policy | Important boundaries | Audit owner |
|---|---|---|---|
cmd/narratio |
Process entry and exit; CLI delegates behavior to app | main -> app.Execute |
6 |
internal/app |
Command dispatch, composition, locking, planning, lifecycle, restore, cleanup, reporting | Execute, executeStages; consumes stage/artifact/manifest/adapter contracts |
2, 4-6 |
internal/config |
Strict discovery, defaults, resolve, template, and validation rules | Config models and load/resolve/validate functions | 6 |
internal/stage |
Canonical order and stage behavior | Stage, ResumeValidator, Env; adapter interfaces are injected |
2, 4, 8-10 |
internal/manifest |
Session/run models, transitions, validation, atomic persistence | Store; transition methods record but do not choose policy |
2 |
internal/artifacts |
Artifact identity/resolution, paths/keys, local store, remote current-state mechanics | Store; consumes explicit storage keys |
3, 5, 10 |
internal/artifactpolicy |
Configured source/destination identity and safety policy | Narrow validators used by config, artifacts, app, and stages | 3, 10 |
internal/artifactmodel |
Shared serialized artifact, contract, and provenance models | Data contract only | 3, 7 |
internal/pathsafe |
Confined relative path and destination mechanics | Narrow validation helpers; no stage policy | 3 |
internal/fileops |
Atomic files, copies, hashing, no-replace directory promotion | Filesystem mechanics receive explicit paths | 3, 9 |
internal/previouscache |
Deterministic previous-session requirement planning/materialization | Uses explicit object-store and artifact contracts | 5, 8, 10 |
internal/audio |
S3 audio spool/cache materialization | Uses storage.ObjectStore; no stage ordering |
5, 8 |
internal/contracts |
Bounds and shared JSON validation models | Data contract only | 7, 8 |
internal/logging |
Shared logger construction | slog composition |
7, 11 |
internal/adapters/whisperx |
WhisperX HTTP protocol | Client |
7 |
internal/adapters/seriatim |
Merge/normalize/trim/render subprocess protocol | Runner |
7 |
internal/adapters/audita |
Audita subprocess protocol | Runner |
7 |
internal/adapters/scriptorium |
Scriptorium run/render subprocess protocol | Runner |
7 |
internal/adapters/notarius |
Notarius invocation and receipt boundary | Runner |
7 (vertical behavior in 9) |
internal/adapters/notify |
Notification transport | Sender |
7 |
internal/adapters/storage |
Explicit bucket-relative object-store operations and S3 mechanics | ObjectStore; private s3API test seam |
7 |
internal/adapters/subprocess |
Shared bounded subprocess/config/log mechanics | Concrete helper package, not stage policy | 7 |
The graph reported no inbound production callers of Stage.Declares; text
search found definitions and test stubs but no production invocation. This
reduces the current impact of ARC-001 but makes the interface's intended owner
and future use an explicit question rather than resolving the mismatch.
Stage Contract Matrix
The table separates declared/static contracts from dynamic behavior. All executed stages use the runner's session/run transitions. Unless noted, a successful result records returned outputs, diagnostics, generated configuration, and metadata; a different effective executed outcome can stale succeeded downstream work, while force pre-stales succeeded downstream work.
| Order and stage | Inputs and outputs | Configuration and adapters | Skip/resume behavior | Materialization and manifest effects |
|---|---|---|---|---|
1 prepare |
Config, stable inputs, one audio mode, optional previous requirements -> canonical inputs/**, audio/**, optional previous/**, manifest.inputs |
All resolved config; storage for S3/current previous state; audio/artifact/previous-cache services | No stage-specific resume validator or explicit self-skip | Writes canonical session inputs and deterministic input records; unlike processing stages, Declares labels produced canonical files as inputs. |
2 transcribe |
Prepared FLAC files -> raw per-speaker JSON | WhisperX URL/language/retry/timeout/concurrency; whisperx.Client |
Ordinary succeeded-record skip; no validator/self-skip | Bounded concurrent run-local writes, validation, then canonical transcript materialization. |
3 merge |
Raw transcripts, speakers, autocorrect -> base transcript, optional report | Seriatim merge fields; seriatim.Runner |
Ordinary succeeded-record skip | Normalized scratch inputs and run-local results validate before canonical transcript/report materialization. |
4 polish |
Base transcript, glossary -> polished transcript, optional report | Audita fields/credential reference; audita.Runner |
Ordinary succeeded-record skip | Run-local output, report, logs, and generated config; validates before canonical materialization. |
5 normalize |
Polished transcript -> final transcript, optional report | Normalize plus Seriatim fields; seriatim.Runner |
Ordinary succeeded-record skip | Manifest-first input; run-local validation then configurable canonical output/report. |
6 trim |
Final transcript -> final-trimmed transcript and, when enabled, bounds | Trim, bounds, Scriptorium, and Seriatim fields; both runners when enabled | Disabled trim copies input and still succeeds; no explicit self-skip or resume validator | Run-local bounds/trim result validates then materializes; debug render is diagnostic, not output. |
7 extract |
Final-trimmed source -> immutable index and configured lane outputs | Notarius executable/config/pipeline/timeout/output contracts; notarius.Runner |
Disabled is explicit notarius_disabled self-skip; only current ResumeValidator; obsolete reruns, unsafe validation errors |
Validates run-local receipt/bundle completely, promotes to unique immutable bundle, records checksums/contracts/provenance; identical repeated self-skip is stable. |
8 render |
Final and final-trimmed JSON -> two Markdown transcripts | Render and Seriatim fields; seriatim.Runner |
Disabled returns a zero-disposition result with skip metadata, therefore runner-level success rather than explicit self-skip; no validator | Run-local text validates non-empty before canonical materialization when enabled. |
9 analyze |
Dynamic built-in, prepared, extraction, configured, and previous sources -> selected configured artifact outputs | Scriptorium artifact graph/selection; scriptorium.Runner |
Missing config or no executable artifacts returns success with skip metadata; no validator | Topological run-local generation/reuse, validation, canonical outputs, deterministic metadata; static Declares omits dynamic outputs and several input families. |
10 publish |
Session/run state, selected output rules, locks, previous cache -> remote run/output/current objects | Publish/storage/selection fields; storage.ObjectStore |
Disabled publish or run upload returns success with skip metadata; force cannot bypass locks; no validator | Deterministic uploads; current/manifest.json before current/run_id.txt; commit metadata gates cleanup. Static prerequisites omit extract because disabled extraction is valid and lane resolution enforces required extraction state when selected. |
11 notify |
No implemented persisted pipeline input/output | Optional notify.Sender; default no-op |
Ordinary succeeded-record skip; no explicit self-skip or validator | Placeholder metadata and optional notification call; no returned output. Declares nevertheless advertises placeholder input/output paths. |
Configuration, adapters, skip policy, and dynamic outputs are not represented
by IODecl; their current canonical owners are the focused stage,
configuration, and integration contracts. Whether IODecl should remain a
partial display type or become an enforceable declaration is deferred as
ARC-001.
Lifecycle Matrix
This is the intended contract map to be walked through both durable ledgers in
Stage 2. Cells marked unknown are not treated as implementation conclusions.
| Outcome | Session manifest intent | Invocation manifest intent | Downstream and next-invocation intent |
|---|---|---|---|
| First run | Pending/non-succeeded stage becomes running, then succeeded/failed/skipped; executing clears older result payload first | New run record; action run; terminal status records this invocation |
Success enables later stages; failure stops current execution and an effective outcome change may stale succeeded downstream records. |
| Already-succeeded skip | Existing succeeded session record and payload remain unchanged, subject to resume validation | Action/status record a skip and stable reason for this invocation | Reusable result remains authoritative; pipeline continues. |
| Explicit self-skip | Session stage becomes skipped, clears older result payload, and may record bounded current skip details | Action was run, outcome is skipped with reason |
Reconsidered later; a changed effective upstream outcome stales succeeded downstream work; identical extraction disabled skip is stable. |
| Failure | Current stage becomes failed with error; current output/log/config/metadata payload is cleared | Action run, failed outcome and overall failed run |
Current execution stops; affected succeeded downstream work is intended to stale; later invocation reruns non-succeeded stages. |
| Interruption | Model admits interrupted, but no production transition reference has yet been found; process death can leave persisted running state |
A process death can leave the run non-terminal; exact recovery semantics are unknown | CLI promises continuation of interrupted/partial sessions because non-succeeded stages run; explicit status normalization is RSK-001 for Stage 2. |
| Forced replacement | Target execution starts fresh; succeeded downstream records are pre-marked stale; current target payload clears on running | Force flag and run action recorded |
Replacement result determines later execution; locks and safety policy remain authoritative. |
| Non-resumable success | Prior success becomes stale while retaining details long enough for diagnosis/validation, then running clears them | Current invocation records execution after validation rejects skip | Obsolete result reruns; unsafe inability to decide stops without silently replacing current success. |
| Successful rerun | Target becomes succeeded with only new outputs/diagnostics/config/metadata | Current invocation records its own new success; earlier run manifests remain immutable | Changed effective outcome stales succeeded downstream work; identical effective outcome should avoid unnecessary invalidation. |
Stage 2 must separately verify save failures before and after each session/run transition, first- and last-stage behavior, and which fields are retained in historical invocation records.
Cross-Boundary Scenario Assignments
| Scenario | Primary audit stage | Supporting packages and focused tests |
|---|---|---|
| 1. Success becomes non-resumable, rerun fails, later reuse decision | 2 | internal/app, internal/manifest, stage.ResumeValidator; runner_test.go, extract_lifecycle_test.go, manifest transition tests |
| 2. Forced/changed upstream outcome with succeeded, self-skipped, disabled downstream | 2 | internal/app, internal/stage, internal/manifest; run-control, runner, extraction-lifecycle tests; disabled-stage detail revisited in 8 |
| 3. Extraction bundle followed by configuration/transitive-input change | 9 | Extract/resume, Notarius adapter, artifacts/fileops tests; downstream resolution revisited in 10 |
| 4. Published/restored/prepared previous state consumed locally by analyze | 5 | internal/app, internal/previouscache, internal/audio, internal/artifacts; restore/prepare tests; analyze consumption revisited in 10 |
| 5. Publish failure at every upload boundary, then status/restore/retry | 4 | Publish stage, storage fake/adapter, app status/restore; publish and operator-helper tests; restore interpretation revisited in 5 |
| 6. Restore identical/conflict/unsafe/cache/pre-manifest-install cases | 5 | Restore discovery/plan/execute/report, artifacts, previouscache, audio; restore test suite |
| 7. Cleanup after skipped/failed/locked/partial/committed publish | 4 | Publish metadata, post-publish cleanup, cleanup targets, pathsafe; publish/cleanup tests |
| 8. Cancellation through workers, HTTP, subprocess, storage, manifests | 7 | Adapter and subprocess tests; transcribe/stage tests in 8; runner reporting in 2 |
| 9. Disabled/unselected/reused/generated/extraction/previous source then publish filtering | 10 | Analyze, artifact catalog/resolver/policy, publish tests; config ownership in 6 and publish result in 4 |
| 10. Concurrent same-session invocation and lock cleanup failures | 3 | Runner lock lifetime in 2; local artifact store, path/file cleanup and lock tests in 3 |
Preliminary Risk-To-Test Matrix
This matrix identifies intended owners only. It makes no sufficiency judgment.
| Architectural invariant or risk | Implementation owner | Intended test owner |
|---|---|---|
| One deterministic canonical stage order | internal/stage, planner in internal/app |
internal/app/planner_test.go, narrow registry tests |
| Session manifest is cross-invocation authority; run manifest is immutable invocation audit | internal/app, internal/manifest |
Manifest transition tests plus assembled runner/run-stage tests |
| First run, skip, self-skip, failure, force, invalidation, and rerun transitions | internal/app, internal/manifest |
App lifecycle tests as primary; manifest helpers own field mutation |
| Obsolete versus unsafe resume validation | Stage-specific ResumeValidator, runner |
Extract resume tests plus runner integration tests |
| Run-local validation before canonical materialization | Individual stages and run_local.go |
Focused stage package behavioral tests; fileops owns atomic mechanism |
| Strict config, defaults, identity, and cross-field validation | internal/config |
Config package tests; example load/validation test samples assembly |
| Canonical path/key ownership and traversal confinement | Artifacts, artifactpolicy, pathsafe | Owning package tests; app/stage tests only for assembled policy |
| Immutable extraction promotion and provenance/checksum validation | Extract, fileops, artifacts, Notarius adapter | Fileops mechanism, extract behavior, artifact hydration, adapter contract tests |
| Deterministic artifact dependency and source resolution | Artifacts, artifactpolicy, analyze | Artifact/package tests and analyze package behavior tests |
| Previous-session consumption remains local in analyze | Previouscache/prepare/artifacts/analyze | Previouscache and prepare tests; one analyze boundary test for no remote call |
| Remote current pointer is publish's final commit point | Publish stage | Publish tests with stateful object-store fake; storage tests own transport only |
| Restore is confined, deterministic, conflict-safe, and installs manifest last | Restore app modules, artifacts/previouscache/audio | Restore plan/execution/workflow tests plus low-level path/file tests |
| Cleanup requires explicit scope and committed publish metadata | App cleanup modules, pathsafe | Cleanup-target and post-publish integration tests |
| Session single-writer lock and safe release | Local artifact store, app lifetime | Artifact local-store tests plus assembled concurrent runner tests |
| Adapter cancellation, error adaptation, and resource closure | Each adapter and shared subprocess package | Focused adapter boundary tests; stage tests sample propagation |
| Bounded deterministic transcription concurrency | Transcribe stage and WhisperX client | Stage concurrency/result-order tests; HTTP adapter retry/cancel tests |
| Secrets never persist or appear in diagnostics | Config/app composition and each adapter/logging boundary | Owning config/adapter tests plus selected assembled redaction checks |
| Default suite remains deterministic, offline, and credential-free | Every package; automation | Stage 12 repository-wide execution and test-policy audit |
Candidate Register
No candidate is confirmed by Stage 1. Later owning stages must inspect the implementation, focused tests, canonical contract, realistic scenario, and callers before promoting or rejecting it.
ARC-001: IODecl is not a complete or consistently classified stage contract
- Category: architectural boundary/ownership candidate.
- Evidence:
prepare.Declareslists files it produces underInputs;analyze.Declaresomits dynamic input families and has no outputs;publish.Declaresexposes only the manifest; andnotify.Declaresadvertises placeholder paths although its result has no persisted output. No production caller ofDeclareswas found. - Contract tension: architecture says every stage declares required inputs, produced output state, configuration, adapters, lifecycle, and failure behavior; the Go interface declares only partial static artifacts.
- Realistic risk: a future planner, validator, or operator view could treat the interface as authoritative and make incorrect dependency or readiness decisions. Current likelihood appears low because the method has no production caller.
- Confirmation owners: Stages 8-10 for dynamic contracts, then Stage 11 for interface purpose/simplification. Smallest plausible outcome may be clearer naming/documentation, a complete contract, or removal; do not choose yet.
ARC-002: disabled-stage “skip” terminology spans two different durable outcomes
- Category: architectural/lifecycle ownership candidate.
- Evidence: production use of
StageDispositionSkippedwas found only in extraction. Disabled render, absent/no-op analyze, and disabled publish return zero-disposition results with skip metadata, which the runner treats as success. Focused and operator docs use “skip” for several of these cases, while manifest docs reserve self-skip for a durable skipped state. - Realistic risk: maintainers or operator features may assume all disabled outcomes clear state, are reconsidered, and invalidate downstream work in the same way. Conversely, changing them to explicit self-skip could break valid pipeline continuation or cleanup semantics.
- Confirmation owners: Stage 2 for runner truth table, Stage 4 for publish and cleanup, Stage 8 for ordinary disabled stages. Treat wording and behavior as unresolved until those flows are traced.
RSK-001: interruption has a documented state but no mapped production transition
- Category: correctness/operational risk candidate.
- Evidence:
manifest.StatusInterruptedis admitted and external docs promise continuation of interrupted sessions, but graph-augmented code search found the constant only in its declaration and an artifact rejection test. No production transition to it was found during mapping. - Realistic risk: a killed process may leave session/run records as
running, producing confusing status or dual-ledger interpretation even though the planner reruns all non-succeeded stages. - Confirmation owner: Stage 2 must trace load normalization, process failure boundaries, status reporting, and next-invocation behavior before deciding whether this is a defect, compatibility state, or unused model value.
TST-001: full race baseline fails in the concurrent transcribe test
- Category: test-suite execution candidate.
- Evidence: the race detector reported concurrent slice access in
internal/adapters/whisperx/fake.go:45from transcribe workers inTestTranscribeStageTranscribesPreparedAudio. - Observed impact: the canonical full race command exits nonzero, weakening its signal for other packages. The report currently points to a test fake, not a production data race.
- Confirmation owners: Stage 8 should inspect the worker/fake contract; Stage 12 should classify suite impact and the smallest durable fix. Do not change the fake during this investigative stage.
Candidate Classification Log
| Candidate signal | Classification | Reason |
|---|---|---|
Graph rollups stage -> app, adapters -> app, config -> app |
rejected as a production reversal at Stage 1 | go list production imports contain no lower-level import of internal/app; graph connections include tests and ambiguous package grouping. Reopen only with a concrete production edge. |
| Similar wrapper/manifest/adapter functions | deferred metric signals, not findings | Similarity alone does not establish duplicated policy; owning behavior stages must first establish contracts. |
| Coverage percentages | deferred diagnostic signals, not findings | Stage 12 must reason from risk and test ownership, not a numeric target. |
Unresolved Questions And Follow-Up
- Does loading a persisted
runningstage or run normalize it tointerrupted, or isinterruptedonly a compatibility value? - What exact session/run disagreement states are possible when either save fails at each transition boundary?
- Are disabled render/analyze/publish outcomes intentionally successful so pipeline continuation and optional outputs work, and do all operator views describe that distinction accurately?
- Is
IODeclintended only for display/tests, or should it own enforceable dependency declarations? - Does publish's omission of extract from its static prerequisite list combine safely with every configured extraction output rule and disabled extraction?
- Which native CI runner limitations explain the absence of validation jobs in the tag-only release workflow? Stage 12 owns the automation conclusion.
No accepted risks or final audit conclusions are recorded yet.
Completed-Stage Evidence
Stage 0
- Contracts and records: development guide, audit plan and sequence, all policy documents, repository/branch/toolchain state.
- Graph evidence: refreshed moderate index at exact HEAD; architecture,
interface, complexity, similarity, fan-in, and
Executecall trace queries. - Commands: every baseline command listed above; Go/package/file/test and automation inventories.
- Candidates:
TST-001; metric signals assigned to later owners. - Explicit no-finding conclusion: no production dependency reversal into
internal/appwas found in the package import inventory. - Limitation disposition: the graph excludes the executable entry point, which was verified directly; the race failure is owned by Stages 8 and 12 and does not prevent read-only audit work.
Stage 1
- Contracts reviewed: architecture, testing and documentation policy; internal overview and every focused internal document; CLI, configuration, operations, and every integration contract.
- Code/evidence reviewed: canonical registry and stage declarations; all modeled interfaces; production import graph; application dispatch trace; explicit self-skip usages; interrupted-state usages; focused test ownership references.
- Outputs: package/interface ownership, area coverage, stage contract, lifecycle, cross-boundary scenario, and preliminary risk-to-test matrices.
- Candidates:
ARC-001,ARC-002,RSK-001; no candidate was confirmed from mapping evidence alone. - Explicit no-finding conclusion: the canonical stage order agrees across the registry, internal overview, CLI, and operations contract.
- Follow-up: all unresolved behavior has a named owner in Stages 2-12; every area and invariant has an implementation owner and intended test owner.