Skip to content

Technical guide · Overview

Page status: HistoricalHistory group: Reports

NutsNews issue

Generated on 2026-07-20 for ramideltoro/nutsnews#282.

Visual overview

Primary diagram

System map

Generated on 2026-07-20 for ramideltoro/nutsnews#282.

Render the repository-owned system map when you need it.

Diagram is not rendered yet.

View as text
NutsNews issue

Generated on 2026-07-20 for ramideltoro/nutsnews#282.

flowchart TB
  accTitle: NutsNews issue
  accDescr {
    Generated on 2026-07-20 for ramideltoro/nutsnews#282.
  }
  A["NutsNews issue #282 final translation backfill audit"] --> B["reports/translations/nutsnews-issue-282-final-audit.md"]
  B --> C["Auto-generated placeholder diagram"]

NutsNews issue

Fullscreen diagram view.

NutsNews issue #282 final translation backfill audit

Section titled “NutsNews issue #282 final translation backfill audit”

Generated on 2026-07-20 for ramideltoro/nutsnews#282.

The production backfill filled every non-cached missing translation row found in the public feed and latest-500 article scans. The remaining recent-content gaps are provider failures that were cached for a later retry. No critical translation quality issues remain in either final audit, and completed translation_pending articles were published.

Follow-up provider work is tracked in ramideltoro/nutsnews#287. The wider historical backlog discovered during final confirmation is tracked separately in ramideltoro/nutsnews#289.

Scope:

  • Repository: ramideltoro/nutsnews
  • Branch: agent/nutsnews-282-translation-backfill
  • Sources audited: public_feed_snapshot and articles
  • Languages: fr, ja, de-CH, de, el
  • Live provider path: local AI at https://ai.nutsnews.com, model qwen2.5:3b
  • OpenAI fallback: unavailable in the active environment because no OPENAI_API_KEY was present

Final audit results:

SourceAudit limitExpected rowsAvailable rowsCoverageMissingWarningsCritical
public_feed_snapshot10050047495%26450
articles5002500245598%452470

Failure cache after live batches:

MetricCount
Failed rows cached55
el failures49
ja failures4
de failures1
fr failures1
Non-JSON provider responses32
Missing title/summary provider responses23

Pending publication status after the final no-op publish confirmation:

MetricCount
translation_pending articles with images and summaries0

The final full articles dry scan selected no non-cached work:

Terminal window
LANGUAGE_CODES=fr,ja,de-CH,de,el \
BACKFILL_SOURCE=articles \
CANDIDATE_LIMIT=500 \
CANDIDATE_PAGE_SIZE=100 \
SCAN_ALL_CANDIDATES=1 \
BACKFILL_LIMIT=50 \
DRY_RUN=1 \
PUBLISH_READY=1 \
FAILED_TRANSLATION_CACHE=/tmp/nutsnews-282-translation-failures.json \
node scripts/backfill_article_summaries.mjs

Result:

Candidate articles scanned: 500
Missing translation rows selected: 0
Nothing to backfill.

The final wider historical scan found additional older published-article gaps outside #282’s recent-public-content acceptance criteria:

MetricCount
Published articles with image and summary1,923
Expected supported-language rows9,615
Existing rows for those published articles6,709
Missing historical rows2,906
Missing fr rows1
Missing ja rows3
Missing de-CH rows951
Missing de rows953
Missing el rows998

That long-tail scope is tracked in ramideltoro/nutsnews#289.

The audit and backfill scripts needed reliability fixes before the production backfill could be trusted:

  • audit_article_translations.mjs now initializes supported language codes before parsing env-provided languages.
  • Numeric env parsing now treats unset or blank values as the documented fallback instead of coercing to 0.
  • Audit summary lookup is URL-scoped and batched, so it cannot undercount rows by reading an unrelated capped slice of article_summaries.
  • backfill_article_summaries.mjs rejects generated rows that would be critical in the audit before saving them.
  • Publish-ready confirmation batches the summary lookup and article status patch, avoiding oversized PostgREST filters.

Backfill flow:

flowchart TD
A[Run diagnostic and initial audit] --> B[Dry-run public-feed backfill]
B --> C[Run live public-feed batches]
C --> D{Provider row valid?}
D -->|Yes| E[Save article_summaries row]
D -->|No| F[Add row to FAILED_TRANSLATION_CACHE]
E --> G[Audit public feed]
F --> G
G --> H[Run articles source batches]
H --> I[Publish fully translated articles]
I --> J[Final public-feed and latest-500 audits]
J --> K{Non-cached recent rows remain?}
K -->|No| L[Confirm translation_pending is zero]
L --> M[Open provider fallback and historical backlog follow-ups]

Initial diagnostics and dry run:

Terminal window
LANGUAGE_CODES=fr,ja,de-CH,de,el \
AUDIT_LIMIT=100 \
WINDOW_MINUTES=90 \
node scripts/diagnose_missing_article_translations.mjs
LANGUAGE_CODES=fr,ja,de-CH,de,el \
BACKFILL_SOURCE=articles \
CANDIDATE_LIMIT=500 \
SCAN_ALL_CANDIDATES=1 \
CANDIDATE_PAGE_SIZE=100 \
BACKFILL_LIMIT=25 \
DRY_RUN=1 \
PUBLISH_READY=1 \
FAILED_TRANSLATION_CACHE=/tmp/nutsnews-282-translation-failures.json \
node scripts/backfill_article_summaries.mjs

Final publish confirmation:

Terminal window
LANGUAGE_CODES=fr,ja,de-CH,de,el \
BACKFILL_SOURCE=articles \
CANDIDATE_LIMIT=500 \
CANDIDATE_PAGE_SIZE=100 \
SCAN_ALL_CANDIDATES=1 \
BACKFILL_LIMIT=50 \
PUBLISH_READY=1 \
FAILED_TRANSLATION_CACHE=/tmp/nutsnews-282-translation-failures.json \
node scripts/backfill_article_summaries.mjs

Result:

Candidate articles scanned: 500
Missing translation rows selected: 0
Published/confirmed 456 fully translated article(s).
Nothing to backfill.

Live public-feed batches:

Terminal window
LANGUAGE_CODES=fr,ja,de-CH,de,el \
BACKFILL_SOURCE=public_feed_snapshot \
CANDIDATE_LIMIT=100 \
BACKFILL_LIMIT=50 \
PUBLISH_READY=0 \
FAILED_TRANSLATION_CACHE=/tmp/nutsnews-282-translation-failures.json \
node scripts/backfill_article_summaries.mjs

Live article batches:

Terminal window
LANGUAGE_CODES=fr,ja,de-CH,de,el \
BACKFILL_SOURCE=articles \
CANDIDATE_LIMIT=500 \
CANDIDATE_PAGE_SIZE=100 \
SCAN_ALL_CANDIDATES=1 \
BACKFILL_LIMIT=50 \
PUBLISH_READY=1 \
FAILED_TRANSLATION_CACHE=/tmp/nutsnews-282-translation-failures.json \
node scripts/backfill_article_summaries.mjs

Final audits:

Terminal window
LANGUAGE_CODES=fr,ja,de-CH,de,el \
AUDIT_LIMIT=100 \
AUDIT_SOURCE=public_feed_snapshot \
TRANSLATION_QUALITY_REPORT_PATH=/tmp/nutsnews-282-final-public-feed-audit.md \
node scripts/audit_article_translations.mjs
LANGUAGE_CODES=fr,ja,de-CH,de,el \
AUDIT_LIMIT=500 \
AUDIT_SOURCE=articles \
TRANSLATION_QUALITY_REPORT_PATH=/tmp/nutsnews-282-final-articles-audit.md \
node scripts/audit_article_translations.mjs

The remaining recent missing rows are intentionally left out of repeated live retries because they already failed through the active provider path. To reach complete recent-content coverage, resolve ramideltoro/nutsnews#287, then rerun the saved failure cache with RETRY_FAILED=1 against an authorized fallback provider. To clear the older published-article backlog, resolve ramideltoro/nutsnews#289.