Skip to content

Ditto v0.3.0 — voice registers

Choose a tag to compare

@ohad6k ohad6k released this 13 Jul 09:04

Ditto used to average every voice you use into one blend. Your reddit replies, your messages to the agent, your work emails, all mashed into a single "how you write." A user who ran it on ~120 sessions caught the cost: the drafted message to his boss came out too casual.

0.3.0 fixes that with voice registers.

What changed

  • Every mined write evidence item and rule now carries a register: casual, professional, or shared. Classified at mining time from the receipts: who the text addresses, the platform, the artifact type. Messages to the agent count as casual signal only, never professional.
  • you-writer.md is grouped into ## Voice laws (always apply), ## Casual register, and ## Professional register. A rule keeps its evidence's register; mixed evidence reduces to a shared voice law. A rule can never claim a register its receipts don't show.
  • ditto:write picks the register from context instead of asking. Say "for my boss" and it wins; otherwise the pasted thread, recipient, or artifact type decides. The pick is stated in one correctable line. If the register you need was never mined, it loads voice laws only and tells you, instead of sending casual banter to a client.
  • Validation got stricter: write rules must cite write evidence that carries a register, and every rule must sit under its own register section in the profile. Mis-filed rules fail the pack.
  • Schema bumps across the mining contract (report 2, prompt 2, reducer 2, scout 3, domain draft 2). Installed profiles keep loading; the next mining run re-mines under the new contract.
  • New docs/FEEDBACK.md: a running log of user feedback and what each item changed in the tool.

Upgrade

Cross-agent bootstrap:

npx skills add ohad6k/ditto@ditto

Native Codex plugin:

codex plugin marketplace add ohad6k/ditto --ref v0.3.0 --json
codex plugin add ditto@ditto --json

Flat writing profiles from 0.2.0 keep working unchanged. Re-mine to get registers.

Verified

  • 141 unit tests pass, including new register validation, section membership, and render tests.
  • Two review-confirmed validation holes were reproduced against the code and re-verified closed after the fix.
  • The v0.3.0 tag was fetched live and both pinned runtime files hash-match the bootstrap manifest.
  • Not yet claimed: a full real-history re-mine under the register contract. That proof run is next.