Cheat sheets

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

Source

Run each desk#

CommandWhat it does
python3 scripts/project_test.py <project> --init <workspace>Makes a workspace. The first stage fails
python3 scripts/project_test.py <project> --all --solution --strictChecks the reference solution
python3 main.py --input ./fixtures --out ./inbox-outputBuilds the inbox review desk
python3 cli.py samples/notes.txt --today 2026-09-29 --output actions.json --html actions.html --csv approved.csvProposes actions. Exports approved rows only
node cli.ts sample.json outputCompares rewrites. Writes output/report.html
node cli.ts sample.jsonl themes.json outputGroups 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/solution
go run . --repo <path> --from <rev> --to HEADimmutable range
go run . --input <file>NUL-delimited export
git log --format=%H%x00%s%x00%b%x00 FROM..TOthe export format
go run . --output release.md --receipt release.jsonreusable files

From changelog-writer-from-git/README.md, solution/main.go, solution/integration.go

Baseline and model option#

FactorInboxMeetingRewriteFeedback
BaselineExplicit phrase rulesACTION linesPhrase substitutionsWord phrases
Model option--provider-urlNoneRecorded proposals--suggest
Model outputmodel-proposals.jsonNoneAuthor proposalthemes.proposed.json
Review gateEvery draft needs reviewExplicit decisionAuthor acceptsReview before use
Never doesSend repliesPost tasksProve meaningPost 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#

SettingDefaultNote
Label flagv0.2.0Release title
To flagHEADInclusive end revision
Commits per release1000More gives budget exceeded
Inbox --modellocal-modelOptional provider only
Message size1 MBPer .eml file
Feedback input2 MBAt most 10000 records
Model theme input50Feedback records for --suggest
Long word8More letters count as long

From solution/main.go, solution/main.py, solution/main.ts, solution/cli.ts, solution/main.ts

Errors and fixes#

SymptomCauseFix
"Conflicting duplicate Message-ID"Two files share an idKeep one copy of the message
Category is uncertainRules conflict or none matchEdit the phrases in --rules
Body status no-plain-bodyHTML-only messageReview it by hand
"unknown or stale action ids"Source lines changedRegenerate 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 changedFix the proposal first
"Provide 1 to 30 themes"Theme list is empty or longKeep 1 to 30 themes
"changelog: budget exceeded"Range has over 1000 commitsNarrow --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#

store.eml folderat most 1 MB eachprocessparse_messageplain body, Message-IDprocessgroup_threadsReferences andIn-Reply-Toprocesstriagephrase rules plusevidenceprocessbuild_draftX-Unsent replyclientindex.htmlsorted by prioritystoretriage.jsonthreads and entriesstore.eml folderat most 1 MB eachprocessparse_messageplain body, Message-IDprocessgroup_threadsReferences andIn-Reply-Toprocesstriagephrase rules plusevidenceprocessbuild_draftX-Unsent replyclientindex.htmlsorted by prioritystoretriage.jsonthreads and entries

From solution/main.py, inbox-triage-desk/README.md

Meeting review loop#

1parse_notesread ACTION owner | due | task lines with linenumbers.2proposalsadd NAME will TASK by YYYY-MM-DD lines asproposals.3validate_action"?" owner or due adds needs_owner or needs_date.4deduplicatecasefold owner, due and task. Merge their sourcelines.5inboxgive each action a 16 hex id from SHA-256.6Reviewerchoose pending, approved or rejected. Downloaddecisions.json.7Rerun--decisions decisions.json exports approvedcomplete actions only.

From meeting-notes-to-actions/solution, meeting-notes-to-actions/API.md, meeting-notes-to-actions/README.md

Project functions#

TaskCode
Classify one messagetriage(message, rules)
Write an unsent replybuild_draft(message: dict, decision: dict)
Publish the checklistpublish(actions, today)
Measure a paragraphmeasures(text:string)
Export accepted textexportRevisions(comparisons,value?)
Match a phrase spanfindEvidence(row: Feedback, phrase: string)
Build the theme boardbuildBoard(rows: Feedback[], themes: Theme[])
Render release notesRelease(label string, commits []Commit, max int)

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