Skip to content

Works Store and Privacy

m4bwav edited this page Oct 9, 2026 · 2 revisions

editwright makes no network calls. ew.py uses only the Python standard library and reads and writes files on your machine; your text goes nowhere beyond the agent you already use. What it keeps about your work goes in one folder, the works store.

Where the store is

ew.py takes the first of these that is set:

  1. --works PATH on the command line (before the command name)
  2. the environment variable EDITWRIGHT_WORKS
  3. works in a .editwright.json in the current folder; a relative path there is taken from that folder
  4. works in the user config file: ~/.editwright.json, or the file named by EDITWRIGHT_CONFIG
  5. ~/editwright-works

The config file is JSON with one key, works. Each route finds the same store here, so author prints the same tallies:

$ EDITWRIGHT_WORKS=works python3 ew.py author "Test Author" | head -1
by category: typo 1/1 taken; repetition 1/1 taken; tense 1/1 taken; stakes 1/1 taken; rhythm 0/1 taken; punctuation 0/1 taken
$ mkdir -p cfg && cd cfg && echo '{"works": "../works"}' > .editwright.json && python3 ../ew.py author "Test Author" | head -1
by category: typo 1/1 taken; repetition 1/1 taken; tense 1/1 taken; stakes 1/1 taken; rhythm 0/1 taken; punctuation 0/1 taken

With nothing set, the store is editwright-works in your home folder. For this run HOME was /tmp/demo/home:

$ python3 ew.py author "Test Author"
no preferences yet for Test Author (/tmp/demo/home/editwright-works/authors)

The README names all five since 0.1.1 (the 0.1.0 README named only 2, 4 and 5). They come from the script's own lookup (works_root in ew.py). Point the store at a private folder that is backed up. Keep it out of any public repository: the editwright repository's own .gitignore lists works/, editwright-works/ and .editwright.json for that reason.

What is in it

The store after the runs on Commands, with three works (a story, an essay and the essay's PDF stand-in) and one author:

$ find works | sort
works
works/authors
works/authors/test-author.json
works/authors/test-author.md
works/essay
works/essay-pdf
works/essay-pdf/jobs
works/essay-pdf/jobs/20261009-1-full
works/essay-pdf/jobs/20261009-1-full/clean.md
works/essay-pdf/jobs/20261009-1-full/cleanup-log.md
works/essay-pdf/jobs/20261009-1-full/job.json
works/essay-pdf/jobs/20261009-1-full/notes.md
works/essay-pdf/jobs/20261009-1-full/source-text.md
works/essay-pdf/jobs/20261009-1-full/source.pdf
works/essay-pdf/story-bible.md
works/essay-pdf/style-sheet.md
works/essay-pdf/work.json
works/essay/jobs
works/essay/jobs/20261009-1-line
works/essay/jobs/20261009-1-line/clean.md
works/essay/jobs/20261009-1-line/cleanup-log.md
works/essay/jobs/20261009-1-line/job.json
works/essay/jobs/20261009-1-line/notes.md
works/essay/jobs/20261009-1-line/provenance-ledger.md
works/essay/jobs/20261009-1-line/provenance.json
works/essay/jobs/20261009-1-line/review.md
works/essay/jobs/20261009-1-line/source-text.md
works/essay/jobs/20261009-1-line/source.md
works/essay/jobs/20261009-1-line/suggestions.json
works/essay/jobs/20261009-1-line/suggestions.md
works/essay/story-bible.md
works/essay/style-sheet.md
works/essay/work.json
works/last-check.txt
works/the-salt-road
works/the-salt-road/jobs
works/the-salt-road/jobs/20261009-1-full
works/the-salt-road/jobs/20261009-1-full/chunks
works/the-salt-road/jobs/20261009-1-full/chunks/001.md
works/the-salt-road/jobs/20261009-1-full/chunks/002.md
works/the-salt-road/jobs/20261009-1-full/chunks/003.md
works/the-salt-road/jobs/20261009-1-full/chunks/INDEX.md
works/the-salt-road/jobs/20261009-1-full/clean.md
works/the-salt-road/jobs/20261009-1-full/cleanup-log.md
works/the-salt-road/jobs/20261009-1-full/edited-2-changelog.md
works/the-salt-road/jobs/20261009-1-full/edited-2.md
works/the-salt-road/jobs/20261009-1-full/edited-3-changelog.md
works/the-salt-road/jobs/20261009-1-full/edited-3.docx
works/the-salt-road/jobs/20261009-1-full/edited-3.md
works/the-salt-road/jobs/20261009-1-full/edited-changelog.md
works/the-salt-road/jobs/20261009-1-full/edited.md
works/the-salt-road/jobs/20261009-1-full/job.json
works/the-salt-road/jobs/20261009-1-full/notes.md
works/the-salt-road/jobs/20261009-1-full/provenance-ledger.md
works/the-salt-road/jobs/20261009-1-full/provenance.json
works/the-salt-road/jobs/20261009-1-full/review.docx
works/the-salt-road/jobs/20261009-1-full/review.md
works/the-salt-road/jobs/20261009-1-full/source-text.md
works/the-salt-road/jobs/20261009-1-full/source.md
works/the-salt-road/jobs/20261009-1-full/stats.json
works/the-salt-road/jobs/20261009-1-full/suggestions.json
works/the-salt-road/jobs/20261009-1-full/suggestions.md
works/the-salt-road/story-bible.md
works/the-salt-road/style-sheet.md
works/the-salt-road/work.json
Path Holds
<work>/work.json the work's slug, title, author, genre and creation time
<work>/story-bible.md, style-sheet.md started empty at the first intake; the agent fills them during the passes. They belong to the work, not the job.
<work>/jobs/<date>-<n>-<level>/ one folder per intake
source.<ext> a byte-for-byte copy of your file, made read-only
source-text.md, clean.md the text as read, and after cleanup
job.json the job's settings, the source's SHA-256, size and modification time, and the source's full path on your machine
notes.md a timestamped log: intake, each apply, feedback notes, overrides with the user's words, each check
authors/<name>.json, .md an author's tallies of what they took and turned down, and their taste notes
last-check.txt the result of the newest check in this store

So the store holds full copies of your manuscripts, and the paths they came from. Treat it like the manuscripts themselves.

The refused PDF intake on How it works left nothing in the store. In 0.1.0 it left a works/book folder with a source.pdf and no job.json, because intake copied the snapshot before it found it could not read the file. Delete such a folder by hand.

Deleting a job or a work

Delete the folder. The snapshot is read-only, and some tools refuse to delete it. On Windows, Python's shutil.rmtree stopped with "Access is denied" at source.md (Python 3.14.6, 2026-10-08). rm -rf in Git Bash removed the same folder. Uninstalling the plugin leaves the store in place.

What never goes in the repository

The skill's rules keep notes about a work private. Manuscripts, style sheets, story bibles and author preferences live in the store. They never go in a repository, an issue or a public file. The editwright repository follows the same rule for its own tests and evals, which use invented text written at test time. When you report a problem, describe it with invented text too.

Clone this wiki locally