Eighteen comments about a fictional accounting product do not fit into one tidy complaint. Some describe import problems. Two describe imports that worked. One comment concerns both the preview and the PDF. Another is too vague to classify.
The first report keeps those distinctions. It is an actual output from the local workflow below, not a picture of a proposed dashboard.
Open a theme and follow the items
The model grouped five of the 18 items under PDF presentation and four under approval workflow. Those are counts of feedback items, not unique people or all customers. One item can appear in several themes, so the shares can exceed 100% when added together.
Every theme links to its items. A complaint about a request reaching two approvers does not, by itself, establish an accidental duplicate. A vague comment stays unclassified. An instruction embedded in feedback is treated as data, not permission to act.
Open the first report · Original model JSON · Item assignments
A different batch, not a manufactured trend
The second report uses 12 different fictional items. It separates access to approval actions from routing and reminders. A corrected invoice footer and a broken mobile link can both be true in one comment; the classification keeps both.
This is a new analysis, not a panel of the same customers. A different theme name or percentage does not measure improvement. Longitudinal research needs a comparable sample and a stable definition, neither of which these examples supply.
What repeats, and what still needs judgment
Codex reads the text and proposes themes and observations. Python checks IDs and structure, counts the assignments and renders the report. The code never asks the model to do the arithmetic and then trusts its answer.
Internal review checked all 30 items and their cited observations in these two runs; no material semantic defect was found. That is a bounded observation, not an accuracy rate for other feedback.
For a one-off question, attaching files directly to your usual Agent may be simpler. Choose this package when you want the same input checks, counting and output files on the next batch.
Run it locally
You need Python 3.10 or later and an installed Codex CLI already signed in through ChatGPT. There are no Python dependencies. Inputs go to the chosen model service through Codex; this is not an offline model or a hosted CodexWork service.
Download the complete workflow, then open examples/feedback-workflow/START.md. From that folder:
python3 run.py --input examples/first/feedback_export.csv --context examples/first/collection.md --out results/first
Open the reported HTML file. For a later batch, change the two input paths and choose a fresh output folder. The start guide gives the exact CSV columns, prerequisites and recovery steps.
The runner does not schedule itself, retry automatically or overwrite earlier results. In the recorded trial, a duplicate ID was rejected before a model call; correct input then completed in a new folder. A failure produces diagnostics, not an empty report disguised as success.
Keep the sharing boundary visible
A quotation flag controls what original wording appears inline. It does not grant permission to send private material to a model. The saved folder also contains raw input snapshots, including items whose quotes are withheld in the report. Select and review files before sharing.
These runs used GPT-6.1 Sol at High reasoning through saved ChatGPT CLI login on 24 October 2026: one call per batch, no retry. See the execution record and implementation identities. Codex non-interactive mode documents the interface; account and command availability remain environment-specific.