- Skill ID
- daymade/claude-code-skills/transcript-fixer
- Publisher
- daymade
- Repository
- claude-code-skills
- Installs
- 0
- Files
- 127
- Synced
- Sep 23, 2026
Open any RiverX project, open the Skills panel in the chat, and search for this identifier. The files are fetched from the source repository at install time.
daymade/claude-code-skills/transcript-fixerInstalls these files- .gitignore
- CHANGELOG.md
- SKILL.md
- references/advanced_correction_evidence.md
- references/architecture.md
- references/best_practices.md
- references/database_schema.md
- references/dictionary_guide.md
- references/dictionary_identity_and_context.md
- references/domain_context_guide.md
- references/example_session.md
- references/example_session_dji_minutes.md
- references/false_positive_guide.md
- references/file_formats.md
- references/glm_api_setup.md
- references/installation_setup.md
- references/iteration_workflow.md
- references/native_ai_full_workflow.md
- references/native_review_packets.md
- references/quick_reference.md
- references/review_queue_dashboard.md
- references/script_parameters.md
- references/sql_queries.md
- references/team_collaboration.md
- references/troubleshooting.md
- references/workflow_guide.md
- requirements.txt
- scripts/__init__.py
- scripts/check_type_hints.py
- scripts/cli/__init__.py
- scripts/cli/argument_parser.py
- scripts/cli/commands.py
- scripts/core/__init__.py
- scripts/core/ai_processor.py
- scripts/core/ai_processor_async.py
- scripts/core/ai_utils.py
- scripts/core/change_extractor.py
- scripts/core/connection_pool.py
- scripts/core/corpus_probe.py
- scripts/core/correction_repository.py
- scripts/core/correction_service.py
- scripts/core/defaults.py
- scripts/core/dictionary_processor.py
- scripts/core/learning_engine.py
- scripts/core/name_convergence_guard.py
- scripts/core/people_roster.py
- scripts/core/protected_spans.py
- scripts/core/review_queue.py
- scripts/core/schema.sql
- scripts/core/trap_scanner.py
- scripts/core/uncertain_extractor.py
- scripts/data/tech_presets.py
- scripts/ensure_deps.py
- scripts/examples/bulk_import.py
- scripts/fetch_minute_audio.py
- scripts/fix_transcript_enhanced.py
- scripts/fix_transcript_timestamps.py
- scripts/fix_transcription.py
- scripts/generate_diff_report.py
- scripts/generate_word_diff.py
- scripts/harvest_corrections.py
- scripts/native_review.py
- scripts/review-dashboard/server.py
- scripts/review-dashboard/static/app.js
- scripts/review-dashboard/static/index.html
- scripts/review-dashboard/static/style.css
- scripts/run_tests.py
- scripts/scan_numeric_consistency.py
- scripts/split_transcript_sections.py
- scripts/tests/__init__.py
- scripts/tests/test_add_guards.py
- scripts/tests/test_audit_log_retention.py
- scripts/tests/test_close_sidecars.py
- scripts/tests/test_common_words_safety.py
- scripts/tests/test_connection_pool.py
- scripts/tests/test_corpus_probe.py
- scripts/tests/test_correction_service.py
- scripts/tests/test_dashboard_context.py
- scripts/tests/test_domain_hint.py
- scripts/tests/test_domain_validator.py
- scripts/tests/test_error_recovery.py
- scripts/tests/test_fix_transcript_timestamps.py
- scripts/tests/test_frontmatter_ledger.py
- scripts/tests/test_harvest_corrections.py
- scripts/tests/test_learning_engine.py
- scripts/tests/test_lookup.py
- scripts/tests/test_multi_domain.py
- scripts/tests/test_name_convergence_guard.py
- scripts/tests/test_numeric_consistency.py
- scripts/tests/test_path_validator.py
- scripts/tests/test_people_roster_configured.py
- scripts/tests/test_review_queue.py
- scripts/tests/test_skill_doc_examples.py
- scripts/tests/test_split_transcript_sections.py
- scripts/tests/test_stage1_auto_finalize.py
- scripts/tests/test_trap_demotion.py
- scripts/tests/test_trap_scanner.py
- scripts/tests/test_word_boundary_straddle.py
- scripts/utils/__init__.py
- scripts/utils/audit_log_retention.py
- scripts/utils/common_words.py
- scripts/utils/concurrency_manager.py
- scripts/utils/config.py
- scripts/utils/database_migration.py
- scripts/utils/db_migrations_cli.py
- scripts/utils/diff_formats/__init__.py
- scripts/utils/diff_formats/change_extractor.py
- scripts/utils/diff_formats/html_format.py
- scripts/utils/diff_formats/inline_format.py
- scripts/utils/diff_formats/markdown_format.py
- scripts/utils/diff_formats/text_splitter.py
- scripts/utils/diff_formats/unified_format.py
- scripts/utils/diff_generator.py
- scripts/utils/domain_validator.py
- scripts/utils/health_check.py
- scripts/utils/logging_config.py
- scripts/utils/metrics.py
- scripts/utils/migrations.py
- scripts/utils/path_validator.py
- scripts/utils/rate_limiter.py
- scripts/utils/retry_logic.py
- scripts/utils/security.py
- scripts/utils/validation.py
- scripts/verify_queue_audio.py
- tests/test_database_migration.py
- tests/test_native_review.py
- tests/test_people_roster.py
What this skill tells the agent
Transcript Fixer
Use a two-phase loop:
- Stage 1 applies deterministic, already-known corrections.
- Native AI Correction reads the complete transcript, fixes one-off errors, verifies uncertain entities, and compounds reusable fixes.
Native AI Correction is the default. Stage 1 alone is incomplete. Stage 3 API exists only for automation that has no Claude/Codex agent available.
Operating contract
- Finish Stage 1 → Native AI Correction → compound confirmed recurring fixes. Do not report a transcript clean after Stage 1 alone.
- Skip Native AI only when the human explicitly limits this run to the dictionary pass or a dated artifact proves Native AI already ran on this exact transcript.
- In Claude Code or Codex, do not run Stage 3. Use Stage 1 plus the native workflow.
- Never rewrite speech for fluency. A correction must explain a plausible ASR error and preserve who said what.
- Never infer or reassign speaker identities. Preserve speaker-label lines; human-confirmed labels and user verdicts are authoritative.
- When comparing two transcripts of the same session (a 1.3x-sped Feishu 妙记 vs a full-speed one, DJI vs 录音豆, two devices, or any duplicate/overlapping capture), do NOT let an alignment script's output stand in for reading. Script diffs (
difflib, normalize-and-compare, per-turn speaker-label counts) are locators for candidate divergent segments only — their similarity ratios, "identical turn counts", and "speaker-divergence counts" are never the conclusion. Read both transcripts turn by turn yourself and decide from that. Real case 2026-09-18: a per-line regex that missed continuation lines reported "150 speaker divergences, all empty" then flipped to "1" once multi-line bodies were parsed — the whole numeric range was parser noise, and a canonical swap was nearly made on it. Corroboration that is genuinely independent requires a different recognizer over the source audio (rung 7), not a re-segmentation of the same recognition. - Parsing a Feishu 妙记
.txt(or anyspeaker HH:MM:SS.mmmtranscript): the spoken text lives on the lines AFTER the speaker-label line, up to the next label — not on the label line itself. A single-line regex (group(3)of the label) reads every multi-line turn's body as empty. Counting speakers or turns: use UTF-8-safe tooling (Python), neversort | uniq -corawk '{print $1}'— both silently collapse distinct CJK speaker labels into one (2026-08-29sort|uniqfolded 5 speakers' 106 turns into "说话人A 106"; 2026-09-18awk $1reported "说话人A 373" for a file whose real distribution was 说话人A17/说话人B287/说话人C60/说话人D9). - Before correcting any person name, directly read both the configured global people roster and the owning project's explicit identity roster or alias ledger. Stage 1 auto-loads only global
ASR 变体entries; it does not load project rosters or expose suppressed, disabled, and unlisted entries. If an expected source is missing or the sources conflict, leave the name unchanged and enqueue or ask once. Never use occurrence frequency as identity evidence. Read references/dictionary_identity_and_context.md before settling the name. - Resolve doubts from available evidence before escalating. Audio download is one evidence channel, not a prerequisite for Native correction. When it is unavailable, follow evidence selection and escalation; do not require the user to change download permissions or treat every pending row as a question only they can answer.
- Leave genuinely unresolved text unchanged and enqueue it. A visible garble is safer than a fluent wrong guess; a pending row records uncertainty, not an automatic human handoff.
- Treat an unfamiliar token as unknown, not as an error. Exhaust the local evidence ladder first. For a load-bearing token that remains unresolved, use the clip-level cross-recognizer rung only when source audio and a permitted second engine are already available; otherwise continue with the available evidence under the escalation policy above. Agreement from a genuinely different recognizer family strongly corroborates the sound, but never chooses between homophonic spellings or overrides the person-name gate. Read native workflow step 4, rung 7 before using it. A backlog of exhausted pendings is the batch form of this rung: when a native pass leaves a queue of locally-unresolvable rows, do not hand the queue to the user wholesale — adjudicate it with
verify_queue_audio.py(one transcript, one source audio, one second engine, both windows per row); the adjudication matrix and timestamp-mapping pitfalls live inadvanced_correction_evidence.md§ Batch pending adjudication. Only rows whose two windows disagree or stay silent survive to the human. - Treat a single-line
asr_notevalue as correction provenance: it intentionally cites old forms and is excluded from matching. Multi-line YAML ledger values are not masked; keywords, titles, other ASR-derived metadata, and body text remain in correction scope. - Read references/native_ai_full_workflow.md in full before performing a native pass. Read the task-specific references named below before their corresponding action.
Run context
Run every entrypoint through uv run; entrypoints that need third-party Python packages declare them with PEP 723, while stdlib/internal-only utilities may omit the metadata block. Execute commands from the skill directory printed when this skill was invoked, or prefix every script path with that directory. Do not rely on $CLAUDE_SKILL_DIR; it is not available in every harness.
If the bundle location is genuinely unknown, use the installation-resolution procedure in references/installation_setup.md. Do not select the first result from a broad find: caches, backups, and old versions can coexist.
Quick start
# Initialize once
uv run scripts/fix_transcription.py --init
# Stage 1 for one project domain. --apply-domain trusts that explicitly
# selected, human-curated project domain at every risk level.
uv run scripts/fix_transcription.py \
--input meeting.md --stage 1 \
--domain myproject --apply-domain --json
# Several sibling domains may be loaded as one union.
uv run scripts/fix_transcription.py \
--input meeting.md --stage 1 \
--domain myproject,myproject-alt --apply-domain --json
# Preview without writing the Stage 1 output.
uv run scripts/fix_transcription.py \
--input meeting.md --stage 1 --domain myproject --dry-run
# Scan all documented context traps after the native read-through.
uv run scripts/fix_transcription.py --scan-traps \
--context-file ~/.transcript-fixer/contexts/myproject.md \
--input meeting.mdSafe mode is the Stage 1 default: low-risk rules apply; medium/high-risk matches defer to *_needs_review.md and the persistent review queue. Applied: 0 is a valid result, not proof that the transcript is clean.
The Stage 1 JSON contract is:
{
"applied": 0,
"deferred": 0,
"output_path": null,
"needs_review_path": null,
"input_unchanged": true,
"review_enqueued": 0,
"stage1_only_incomplete": true,
"stage2_total_chunks": 0,
"stage2_failed_chunks": 0,
"stage2_degraded": false,
"boundary_refused": 0
}More from daymade
Use this skill in a project
Open any RiverX project, search the Skills panel for daymade/claude-code-skills/transcript-fixer, and install it in one click.
