Briefcraft Lab - PO technical QA pilot example

This is a fictional demonstration, not client work. No customer files,
credentials, payment or delivery are represented by this package.

Run with Python 3:
  python po_qa.py fictional-example.po --output report

The parser dependency polib 1.2.0 is bundled under lib/ with its MIT license.
Our QA wrapper and fictional example are separate from the third-party library.
Package origin: PyPI polib 1.2.0. API documentation:
https://polib.readthedocs.io/en/latest/api.html

Outputs: findings.csv (UTF-8 BOM, formula-sensitive cells prefixed for spreadsheet
safety) and summary.json. The tool never intentionally changes the input PO.
Up to 500 active entries; obsolete entries are excluded and counted separately.
Duplicate means the same context plus msgid. Same text in different contexts is
allowed. Fuzzy and blank translations are flagged separately.

Placeholder conventions must be agreed with the client. Default auto mode uses
python-brace-format, python-format or c-format flags. Unflagged strings containing
braces or percent signs in either source or translation are sent to manual review. --formats brace, printf, or
brace,printf can select agreed conventions explicitly.
Named placeholders may be reordered. Type changes and missing/repeated variables
are reported. Brace format specifications are compared conservatively.
Simple printf arguments are supported; length modifiers (h/l/L), dynamic widths, unrecognized percent
syntax, ICU syntax and differing singular/plural placeholders need manual review.
Plural completeness uses nplurals from the header; the plural expression is never
executed. Missing nplurals is not assumed to mean complete plural coverage.

Limits: not a gettext compiler, not a universal placeholder validator, and not a
linguistic translator or in-game proofreader. Findings require project context.
No Crowdin integration, font/glyph validation or screen-overflow testing claimed.
No automatic edits, external network calls or credentials required.

Version 2, October 18, 2026: percent length modifiers are routed to manual review instead of silently discarded. Unflagged translation-only format syntax is now routed to manual review. This conservative wrapper does not replace gettext msgfmt --check-format. No customer files were used.
References:
https://www.gnu.org/software/gettext/manual/html_node/c_002dformat-Flag.html
https://www.gnu.org/software/gettext/manual/html_node/c_002dformat.html

Version 3, October 18, 2026: Python brace fields using mixed automatic and numeric argument numbering, including nested format specifications, are routed to manual review. Unknown Python conversions are also routed to review. This remains a conservative technical checker, not a universal runtime or translation-quality validator.
