Text Workflow Desks
Triage email, extract actions, rewrite prose, group feedback and write changelogs. Every output waits for review.
- Concepts and terms
- Tasks and commands
- Annotated code
- Diagrams
- Comparisons
- Defaults and numbers
- Troubleshooting
- Questions and tips
Run each desk#
| Command | What it does |
|---|---|
python3 scripts/ | Makes a workspace. The first stage fails |
python3 scripts/ | Checks the reference solution |
python3 main.py --input ./ | Builds the inbox review desk |
python3 cli.py samples/ | Proposes actions. Exports approved rows only |
node cli.ts sample.json output | Compares rewrites. Writes output/report.html |
node cli.ts sample.jsonl themes.json output | Groups feedback into themes |
go run . | Writes a changelog from a two-commit fixture |
From inbox-triage-desk/README.md, meeting-notes-to-actions/README.md, plain-language-rewrite-desk/README.md, feedback-theme-board/README.md, changelog-writer-from-git/README.md
Changelog from a Git range#
cd projects/changelog-writer-from-git/solutiongo run . --repo <path> --from <rev> --to HEADimmutable rangego run . --input <file>NUL-delimited exportgit log --format=%H%x00%s%x00%b%x00 FROM..TOthe export formatgo run . --output release.md --receipt release.jsonreusable filesFrom changelog-writer-from-git/README.md, solution/main.go, solution/integration.go
Baseline and model option#
| Factor | Inbox | Meeting | Rewrite | Feedback |
|---|---|---|---|---|
| Baseline | Explicit phrase rules | ACTION lines | Phrase substitutions | Word phrases |
| Model option | --provider-url | None | Recorded proposals | --suggest |
| Model output | model-proposals.json | None | Author proposal | themes.proposed.json |
| Review gate | Every draft needs review | Explicit decision | Author accepts | Review before use |
| Never does | Send replies | Post tasks | Prove meaning | Post to a tracker |
From inbox-triage-desk/README.md, meeting-notes-to-actions/API.md, plain-language-rewrite-desk/README.md, feedback-theme-board/README.md, solution/cli.ts
Defaults and limits#
| Setting | Default | Note |
|---|---|---|
| Label flag | v0.2.0 | Release title |
| To flag | HEAD | Inclusive end revision |
| Commits per release | 1000 | More gives budget exceeded |
Inbox --model | local-model | Optional provider only |
| Message size | 1 MB | Per .eml file |
| Feedback input | 2 MB | At most 10000 records |
| Model theme input | 50 | Feedback records for --suggest |
| Long word | 8 | More letters count as long |
From solution/main.go, solution/main.py, solution/main.ts, solution/cli.ts, solution/main.ts
Errors and fixes#
| Symptom | Cause | Fix |
|---|---|---|
| "Conflicting duplicate Message-ID" | Two files share an id | Keep one copy of the message |
| Category is uncertain | Rules conflict or none match | Edit the phrases in --rules |
Body status no-plain-body | HTML-only message | Review it by hand |
| "unknown or stale action ids" | Source lines changed | Regenerate the inbox. Review again |
| "cannot approve missing owner or due date" | Owner or due is "?" | Fill it in the notes |
| "Resolve factual issues before accepting" | Numbers or protected terms changed | Fix the proposal first |
| "Provide 1 to 30 themes" | Theme list is empty or long | Keep 1 to 30 themes |
| "changelog: budget exceeded" | Range has over 1000 commits | Narrow --from and --to |
From solution/main.py, inbox-triage-desk/README.md, solution/cli.py, meeting-notes-to-actions/API.md, solution/main.ts, solution/main.ts, changelog-writer-from-git/solution, changelog-writer-from-git/README.md
What each desk builds#
- Inbox triage desk
- .eml folder in. index.html, triage.json and unsent .eml drafts out.
- Meeting notes to actions
- notes.txt in. actions.json, actions.html and approved.csv out.
- Plain language rewrite desk
- prose JSON in. Accepted Markdown and revision-decisions.json out.
- Feedback theme board
- JSONL feedback and themes in. Evidence board and issue drafts out.
- Changelog writer from Git
- a Git range in. release.md and a release.json receipt out.
- Runtimes
- Python 3.10 for inbox and meeting. Node 22.18 for rewrite. Go 1.22 for changelog.
From inbox-triage-desk/README.md, meeting-notes-to-actions/README.md, plain-language-rewrite-desk/README.md, feedback-theme-board/README.md, changelog-writer-from-git/README.md
Inbox desk pipeline#
Meeting review loop#
From meeting-notes-to-actions/solution, meeting-notes-to-actions/API.md, meeting-notes-to-actions/README.md
Project functions#
| Task | Code |
|---|---|
| Classify one message | triage(message, |
| Write an unsent reply | build_draft(message: dict, |
| Publish the checklist | publish(actions, |
| Measure a paragraph | measures(text:string) |
| Export accepted text | exportRevisions(comparisons, |
| Match a phrase span | findEvidence(row: Feedback, |
| Build the theme board | buildBoard(rows: Feedback[], |
| Render release notes | Release(label string, |
From solution/main.py, meeting-notes-to-actions/API.md, plain-language-rewrite-desk/README.md, solution/main.ts, changelog-writer-from-git/solution
Rules in code#
- Triage priority
- action 0, uncertain 1, information 2.
- Action phrases
- please, can you, could you, confirm.
- Rewrites
- "in order to" to "to", "utilize" to "use", "prior to" to "before".
- Duplicates
- same source and NFKC lower-case text count once.
- Theme order
- most distinct sources first, then id.
- Groups
- Breaking changes, Features, Fixes, Other.
- Breaking
- a
BREAKING CHANGE:footer or!after the type. - Revert
- "This reverts commit" with a 40 hex id.
From solution/main.py, solution/main.ts, solution/main.ts, changelog-writer-from-git/solution
Questions#
- Does the inbox desk send mail?
- No. It never connects to a mailbox.
- What stays unassigned in notes?
- Suggestions outside the two grammars.
- Do the rewrite checks prove facts?
- No. They are lexical safeguards. The author reviews meaning.
- Do source counts measure demand?
- No. Labels are not verified people or market size.
- Which hash does the changelog support?
- SHA-1 commit IDs. SHA-256 needs an extension.
From inbox-triage-desk/README.md, meeting-notes-to-actions/API.md, plain-language-rewrite-desk/README.md, feedback-theme-board/README.md, changelog-writer-from-git/README.md
Tips#
- Write down the expected result before you run your own export.
- Keep the input beside the output so others can reproduce it.
- Read the JSON receipt and test one new input before you integrate.
- Remote providers need HTTPS. HTTP works only for loopback.
- Read integration.go after the core stages.
From inbox-triage-desk/README.md, meeting-notes-to-actions/README.md, feedback-theme-board/README.md, changelog-writer-from-git/README.md