transcripto 0.1.1__tar.gz → 0.1.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: transcripto
3
- Version: 0.1.1
3
+ Version: 0.1.3
4
4
  Summary: Search everything your coding agents ever did, grade your own prompts, and price your decisions. Local, stdlib-only, your data never leaves the machine.
5
5
  Author: Oscar Morke
6
6
  License: MIT
@@ -29,43 +29,92 @@ your disk and never opens a socket.
29
29
  uvx transcripto coach
30
30
  ```
31
31
 
32
- ## what you get back
32
+ > **which build you got.** `uvx transcripto --version` should print **0.1.3**. If `--version`
33
+ > is not a recognised flag at all you are on 0.1.1, which predates `trace`, Cursor support and
34
+ > this README. `uvx --refresh transcripto` forces a fresh resolve past uv's cache.
35
+ >
36
+ > The repo always matches this README and needs nothing installed:
37
+ >
38
+ > ```
39
+ > git clone https://github.com/Morkeeth/transcripto && cd transcripto
40
+ > python3 transcripto.py coach
41
+ > ```
33
42
 
34
- this is a real run on one machine, pasted unedited, 2026-08-28:
43
+ ## three harnesses, one instrument
35
44
 
45
+ ```
46
+ transcripto coach # Claude Code, ~/.claude/projects
47
+ transcripto coach --harness codex # Codex, ~/.codex
48
+ transcripto coach --harness cursor # Cursor, ~/.cursor/projects/*/agent-transcripts
36
49
  ```
37
50
 
38
- YOUR PROMPT HABITS, GRADED (offline, your machine only)
51
+ **Authorship is not the same gate in all three, and the tool says so rather than pooling them.**
52
+ Claude Code stamps `promptSource: typed`, which is the measured-reliable signal: about 95% of raw
53
+ `type: user` records are not the operator at all. Cursor has no such field. Its one honest
54
+ equivalent is the `<user_query>` wrapper it puts around a submitted prompt, which injected and
55
+ tool-result records do not carry. That is a weaker signal and it is labelled weaker.
39
56
 
40
- harness: claude
41
- corpus : 2720 transcript(s), 381,804 records
42
- kept : 3678 prompts you actually typed (0.96% of records)
43
- episodes: 1946 ranked, 910 survived (47%)
44
- tiers : commit 373 | write/edit 537 | reverted 2 | nothing durable 1034
57
+ ## `trace` — what actually happened after you asked
45
58
 
46
- SURVIVAL IS A PROXY: survival = a durable Write/Edit or an un-reverted git commit in-episode. A PROXY, not proof the work was correct or shipped.
59
+ `ask` shows what you typed. `find` shows what a file went through. Neither answers the
60
+ question that matters after the fact: **you asked for X, did anything durable happen?**
47
61
 
48
- SURVIVES MOST do more of these:
49
- 64% (167/260) detailed (>40 words)
50
- 63% (66/104) states-a-check-or-done-condition
51
- 58% (414/708) intent:CHANGE
52
- 58% (21/36) no-object (pronoun/vague)
53
- 57% (99/175) cites-a-file-or-path
62
+ ```
63
+ transcripto trace "the gate"
64
+ ```
54
65
 
55
- SURVIVES LEAST these tend to loop:
56
- 33% (4/12) intent:REVERT
57
- 39% (411/1043) intent:none
58
- 40% (4/10) intent:TEST
59
- 42% (298/715) terse (<8 words)
60
- 45% (77/173) intent:DESCRIBE
66
+ It walks each of your matching prompts forward inside its own session and lists the writes
67
+ and edits that followed, stopping at your next prompt so one turn cannot claim the next
68
+ turn's work. Green dot = something durable landed. Red = nothing was touched.
61
69
 
62
- + your best landed prompt, with its witness:
63
- "mTERMINAL 8 — Mountain of Helicon · ~/CODE/mountain-of-helicon Read ~/CODE/mountain-of-helicon. Two…"
64
- COMMIT-WITNESSED: git commit · corrections: 0
70
+ **Honest limit:** a write following a prompt in the same session is CO-OCCURRENCE, not proof
71
+ the write was caused by that prompt or that it was correct. Same proxy `coach` uses, labelled
72
+ the same way.
73
+
74
+ ## what you get back
75
+
76
+ this is a real run on one machine, pasted unedited, 2026-08-31:
77
+
78
+ ```
79
+
80
+ YOUR PROMPT HABITS, GRADED (offline, your machine only)
65
81
 
66
82
  - your worst looped prompt, with its witness:
67
83
  "ok, and lets see they might solve it in the future so i can go back to my beloeved routine :) Befor…"
68
84
  NO-DURABLE-RECORD: read-only Bash only, no file change · corrections: 15 · assistant turns: 221
85
+
86
+ + your best landed prompt, with its witness:
87
+ "mTERMINAL 8 — Mountain of Helicon · ~/CODE/mountain-of-helicon Read ~/CODE/mountain-of-helicon. Two…"
88
+ COMMIT-WITNESSED: git commit · corrections: 0
89
+
90
+ SURVIVAL IS A PROXY: survival = a durable Write/Edit or an un-reverted git commit in-episode. A PROXY, not proof the work was correct or shipped.
91
+
92
+ SURVIVES MOST do more of these:
93
+ 65% (71/110) states-a-check-or-done-condition
94
+ 64% (178/276) detailed (>40 words)
95
+ 59% (22/37) no-object (pronoun/vague)
96
+ 59% (451/763) intent:CHANGE
97
+ 57% (106/187) cites-a-file-or-path
98
+
99
+ SURVIVES LEAST these tend to loop:
100
+ 31% (4/13) intent:REVERT
101
+ 40% (451/1129) intent:none
102
+ 42% (320/765) terse (<8 words)
103
+ 42% (81/192) intent:DESCRIBE
104
+ 45% (5/11) intent:TEST
105
+
106
+ harness claude · 2957 transcript(s), 431,085 records · 3969 typed by you (0.92%)
107
+ episodes: 2108 ranked, 992 survived (47%)
108
+ commit 454 · write/edit 538 · reverted 2 · nothing durable 1114
109
+
110
+ ─────────────────────────────────────────────────────────
111
+ compare yours. numbers only, nothing from your prompts:
112
+
113
+ transcripto coach · claude · 2108 episodes · 47% survived
114
+ states-a-check-or-done-condition 65% (71/110)
115
+ intent:none 40% (451/1129)
116
+ gap 1.6x
117
+ ─────────────────────────────────────────────────────────
69
118
  ```
70
119
 
71
120
  those are my numbers on that date, and they move every session i run, so treat
@@ -73,9 +122,13 @@ them as a snapshot rather than a constant. yours will be different, which is the
73
122
  whole point. the last two lines are the ones that sting: it hands you back your
74
123
  own best and worst prompt, verbatim, with the receipt for why it scored each one.
75
124
 
76
- on that machine, prompts that wrote down what done looks like survived **63% of
77
- the time (66 of 104)**. prompts with no stated intent survived **39% (411 of
78
- 1043)**. i had spent a year blaming the model.
125
+ on that machine, on that date, prompts that wrote down what done looks like
126
+ survived **63% of the time (66 of 104)**. prompts with no stated intent survived
127
+ **39% (411 of 1043)**. i had spent a year blaming the model.
128
+
129
+ one day later, 2026-08-29, the same command on the same machine read 63% (67 of
130
+ 107) and 40% (424 of 1072) over 2,874 transcripts. the percentages held and the
131
+ denominators moved, which is what a snapshot is supposed to do.
79
132
 
80
133
  ## the proxy caveat, which travels with every number
81
134
 
@@ -127,8 +180,10 @@ read these before you quote a number at anyone.
127
180
  - **one operator's corpus.** every figure in this README comes from one machine.
128
181
  it is an existence proof that the measurement runs, not a finding about how
129
182
  people prompt. run it on yours and you get yours.
130
- - **two harnesses today: Claude Code and Codex.** nothing else is supported.
131
- cursor, aider, and the rest are not read.
183
+ - **three harnesses today: Claude Code, Codex, Cursor.** nothing else is supported.
184
+ aider and the rest are not read. and the three are not equal: Claude Code has a
185
+ measured-reliable authorship field, Cursor has only the `<user_query>` wrapper,
186
+ which is weaker and is labelled weaker wherever it is used.
132
187
  - **the habit labels are heuristics.** "states-a-check-or-done-condition" is a
133
188
  pattern match over your text, not comprehension. it will misfile some prompts.
134
189
  - **correlation, not instruction.** detailed prompts surviving more often does not
@@ -144,25 +199,50 @@ claim, so here is the grep that settles it against the single file it ships as:
144
199
  $ grep -nE '^[[:space:]]*(import|from) ' transcripto.py
145
200
  8:import sys, os, json, glob, re, sqlite3, argparse
146
201
  9:from datetime import datetime, timezone
147
- 225: import time
202
+ 260: import time
203
+ 1051: import datetime
204
+ 1061: from the separator), so the result is checked on disk and dropped if it is
148
205
  ```
149
206
 
150
- that is the whole import list, three lines. `time` sits inside the `watch` loop,
151
- which is why the pattern allows for indentation. anchor it at `^import` and you
152
- would miss one, so do not take my word for the anchor either.
207
+ five lines, four of which are imports and all four are stdlib. `time` and
208
+ `datetime` sit inside functions, which is why the pattern allows for indentation —
209
+ anchor it at `^import` and you would miss two, so do not take my word for the
210
+ anchor either. line 1061 is the pattern catching a docstring that happens to begin
211
+ with the word `from`; it is prose, not an import, and it is left in rather than
212
+ tuned out, because a grep you tuned until it agreed with you proves nothing.
213
+
214
+ what the list does NOT contain is the actual claim: no `socket`, no `urllib`, no
215
+ `requests`, no `http.client`, no `subprocess`. that one is checkable too, and the
216
+ right answer is no output at all:
217
+
218
+ ```
219
+ $ grep -nE '\b(socket|urllib|requests|http\.client|subprocess)\b' transcripto.py
220
+ $
221
+ ```
153
222
 
154
- your transcripts stay in `~/.claude` and `~/.codex`. the index it builds stays in
155
- `~/.trace`.
223
+ your transcripts stay in `~/.claude`, `~/.codex` and `~/.cursor`. the index it
224
+ builds stays in `~/.trace`.
156
225
 
157
226
  ## the rest of it
158
227
 
228
+ `coach` and `cost` read your transcript files directly and need nothing set up.
229
+ **the other six read a local index, so run this once first:**
230
+
231
+ ```
232
+ transcripto index # a few minutes on a large corpus, incremental after that
233
+ ```
234
+
235
+ on a 2,874-file corpus that was 164 seconds, measured 2026-08-29. if you skip it,
236
+ the six say so and exit 2.
237
+
159
238
  ```
160
239
  transcripto index build / refresh (incremental)
161
240
  transcripto watch live, new sessions get picked up as your agents work
162
241
  transcripto ask YOUR OWN messages about a topic, newest first + a rollup
163
242
  transcripto search full-text across everything (you + agents + tool logs)
164
243
  transcripto find every session that wrote / edited / read a file
165
- transcripto sessions recent sessions + their opening ask
244
+ transcripto trace what durably happened after each prompt you typed (0.1.2+)
245
+ transcripto sessions recent sessions + the first prompt YOU typed in each
166
246
  transcripto stats what you actually work on
167
247
  transcripto cost what ONE of your decisions costs
168
248
  transcripto coach which of YOUR prompt habits survive (a proxy)
@@ -172,11 +252,17 @@ transcripto coach which of YOUR prompt habits survive (a proxy)
172
252
  thinking about X across ALL my sessions", in your own words only.
173
253
 
174
254
  ```
175
- $ transcripto find USER-JOURNEY.md
176
- 2026-08-20 WROTE ~/CODE/mountain-of-helicon-main/USER-JOURNEY.md
255
+ $ transcripto find USER-JOURNEY.md # run 2026-08-29
256
+ USER-JOURNEY.md 4 touches across sessions (3 were writes/edits)
257
+
258
+ 2026-08-20 WROTE ~/CODE/mountain-of-helicon-main/USER-JOURNEY.md abd9e871
259
+ 2026-08-21 WROTE ~/…/Obsidian LIFE/00 Dashboard/suite-user-journey.md 0f845ede
260
+ 2026-08-27 read ~/CODE/hack-fleet-ata/docs/USER-JOURNEY.md cddfde29
261
+ 2026-08-27 WROTE ~/CODE/hack-fleet-ata/docs/USER-JOURNEY.md cddfde29
177
262
  ```
178
263
 
179
- the file you lost, found across every session you ever ran, one line.
264
+ the file you lost, found across every session you ever ran, with the session id
265
+ that touched it. `find` needs `transcripto index` first.
180
266
 
181
267
  ## Codex
182
268
 
@@ -215,11 +301,15 @@ just gives the file a name on your PATH.
215
301
  ## tests
216
302
 
217
303
  ```
218
- ./test_coach.sh 14 assertions
219
- ./test_codex.sh 14 assertions
220
- ./test_cost.sh 12 assertions
304
+ ./test_coach.sh 15 assertions
305
+ ./test_codex.sh 14 assertions
306
+ ./test_cost.sh 12 assertions
307
+ ./test_small_n.sh 7 assertions
308
+ ./test_label_bands.sh 13 assertions
221
309
  ```
222
310
 
311
+ 61 assertions, all green, re-run 2026-08-31.
312
+
223
313
  offline, no keys, on fixtures that inherit the real transcript shape including
224
314
  all four ways a non-human record disguises itself as `type: user`.
225
315
 
@@ -227,6 +317,15 @@ the load-bearing one in `test_coach.sh` is `REVERTED IS NOT SURVIVED`: a commit
227
317
  that got `reset --hard` in the same session left no durable record. flip that one
228
318
  line and the suite goes red, which is the point. a generous proxy is a broken one.
229
319
 
320
+ `test_label_bands.sh` is the other one, and it exists because 0.1.1 shipped the
321
+ defect it pins. `SURVIVES MOST` took the top five habits and `SURVIVES LEAST` took
322
+ the bottom five, which overlap whenever you have fewer than ten rankable habits —
323
+ so a new user, who necessarily has few, read the same habit at the same percentage
324
+ under both "do more of these" and "these tend to loop". on a 3-habit corpus 0.1.1
325
+ reprinted all three, all at 65% (22/34). the suite is red on the published 0.1.1
326
+ file and green on this one, and its `wide` band asserts the fix leaves a large
327
+ corpus byte-identical.
328
+
230
329
  ## why though
231
330
 
232
331
  your agent history is proof. every "yeah it's done" has a real trace sitting
@@ -11,43 +11,92 @@ your disk and never opens a socket.
11
11
  uvx transcripto coach
12
12
  ```
13
13
 
14
- ## what you get back
14
+ > **which build you got.** `uvx transcripto --version` should print **0.1.3**. If `--version`
15
+ > is not a recognised flag at all you are on 0.1.1, which predates `trace`, Cursor support and
16
+ > this README. `uvx --refresh transcripto` forces a fresh resolve past uv's cache.
17
+ >
18
+ > The repo always matches this README and needs nothing installed:
19
+ >
20
+ > ```
21
+ > git clone https://github.com/Morkeeth/transcripto && cd transcripto
22
+ > python3 transcripto.py coach
23
+ > ```
24
+
25
+ ## three harnesses, one instrument
26
+
27
+ ```
28
+ transcripto coach # Claude Code, ~/.claude/projects
29
+ transcripto coach --harness codex # Codex, ~/.codex
30
+ transcripto coach --harness cursor # Cursor, ~/.cursor/projects/*/agent-transcripts
31
+ ```
32
+
33
+ **Authorship is not the same gate in all three, and the tool says so rather than pooling them.**
34
+ Claude Code stamps `promptSource: typed`, which is the measured-reliable signal: about 95% of raw
35
+ `type: user` records are not the operator at all. Cursor has no such field. Its one honest
36
+ equivalent is the `<user_query>` wrapper it puts around a submitted prompt, which injected and
37
+ tool-result records do not carry. That is a weaker signal and it is labelled weaker.
15
38
 
16
- this is a real run on one machine, pasted unedited, 2026-08-28:
39
+ ## `trace` — what actually happened after you asked
17
40
 
41
+ `ask` shows what you typed. `find` shows what a file went through. Neither answers the
42
+ question that matters after the fact: **you asked for X, did anything durable happen?**
43
+
44
+ ```
45
+ transcripto trace "the gate"
18
46
  ```
19
47
 
20
- YOUR PROMPT HABITS, GRADED (offline, your machine only)
48
+ It walks each of your matching prompts forward inside its own session and lists the writes
49
+ and edits that followed, stopping at your next prompt so one turn cannot claim the next
50
+ turn's work. Green dot = something durable landed. Red = nothing was touched.
21
51
 
22
- harness: claude
23
- corpus : 2720 transcript(s), 381,804 records
24
- kept : 3678 prompts you actually typed (0.96% of records)
25
- episodes: 1946 ranked, 910 survived (47%)
26
- tiers : commit 373 | write/edit 537 | reverted 2 | nothing durable 1034
52
+ **Honest limit:** a write following a prompt in the same session is CO-OCCURRENCE, not proof
53
+ the write was caused by that prompt or that it was correct. Same proxy `coach` uses, labelled
54
+ the same way.
27
55
 
28
- SURVIVAL IS A PROXY: survival = a durable Write/Edit or an un-reverted git commit in-episode. A PROXY, not proof the work was correct or shipped.
56
+ ## what you get back
29
57
 
30
- SURVIVES MOST do more of these:
31
- 64% (167/260) detailed (>40 words)
32
- 63% (66/104) states-a-check-or-done-condition
33
- 58% (414/708) intent:CHANGE
34
- 58% (21/36) no-object (pronoun/vague)
35
- 57% (99/175) cites-a-file-or-path
58
+ this is a real run on one machine, pasted unedited, 2026-08-31:
36
59
 
37
- SURVIVES LEAST these tend to loop:
38
- 33% (4/12) intent:REVERT
39
- 39% (411/1043) intent:none
40
- 40% (4/10) intent:TEST
41
- 42% (298/715) terse (<8 words)
42
- 45% (77/173) intent:DESCRIBE
60
+ ```
43
61
 
44
- + your best landed prompt, with its witness:
45
- "mTERMINAL 8 — Mountain of Helicon · ~/CODE/mountain-of-helicon Read ~/CODE/mountain-of-helicon. Two…"
46
- COMMIT-WITNESSED: git commit · corrections: 0
62
+ YOUR PROMPT HABITS, GRADED (offline, your machine only)
47
63
 
48
64
  - your worst looped prompt, with its witness:
49
65
  "ok, and lets see they might solve it in the future so i can go back to my beloeved routine :) Befor…"
50
66
  NO-DURABLE-RECORD: read-only Bash only, no file change · corrections: 15 · assistant turns: 221
67
+
68
+ + your best landed prompt, with its witness:
69
+ "mTERMINAL 8 — Mountain of Helicon · ~/CODE/mountain-of-helicon Read ~/CODE/mountain-of-helicon. Two…"
70
+ COMMIT-WITNESSED: git commit · corrections: 0
71
+
72
+ SURVIVAL IS A PROXY: survival = a durable Write/Edit or an un-reverted git commit in-episode. A PROXY, not proof the work was correct or shipped.
73
+
74
+ SURVIVES MOST do more of these:
75
+ 65% (71/110) states-a-check-or-done-condition
76
+ 64% (178/276) detailed (>40 words)
77
+ 59% (22/37) no-object (pronoun/vague)
78
+ 59% (451/763) intent:CHANGE
79
+ 57% (106/187) cites-a-file-or-path
80
+
81
+ SURVIVES LEAST these tend to loop:
82
+ 31% (4/13) intent:REVERT
83
+ 40% (451/1129) intent:none
84
+ 42% (320/765) terse (<8 words)
85
+ 42% (81/192) intent:DESCRIBE
86
+ 45% (5/11) intent:TEST
87
+
88
+ harness claude · 2957 transcript(s), 431,085 records · 3969 typed by you (0.92%)
89
+ episodes: 2108 ranked, 992 survived (47%)
90
+ commit 454 · write/edit 538 · reverted 2 · nothing durable 1114
91
+
92
+ ─────────────────────────────────────────────────────────
93
+ compare yours. numbers only, nothing from your prompts:
94
+
95
+ transcripto coach · claude · 2108 episodes · 47% survived
96
+ states-a-check-or-done-condition 65% (71/110)
97
+ intent:none 40% (451/1129)
98
+ gap 1.6x
99
+ ─────────────────────────────────────────────────────────
51
100
  ```
52
101
 
53
102
  those are my numbers on that date, and they move every session i run, so treat
@@ -55,9 +104,13 @@ them as a snapshot rather than a constant. yours will be different, which is the
55
104
  whole point. the last two lines are the ones that sting: it hands you back your
56
105
  own best and worst prompt, verbatim, with the receipt for why it scored each one.
57
106
 
58
- on that machine, prompts that wrote down what done looks like survived **63% of
59
- the time (66 of 104)**. prompts with no stated intent survived **39% (411 of
60
- 1043)**. i had spent a year blaming the model.
107
+ on that machine, on that date, prompts that wrote down what done looks like
108
+ survived **63% of the time (66 of 104)**. prompts with no stated intent survived
109
+ **39% (411 of 1043)**. i had spent a year blaming the model.
110
+
111
+ one day later, 2026-08-29, the same command on the same machine read 63% (67 of
112
+ 107) and 40% (424 of 1072) over 2,874 transcripts. the percentages held and the
113
+ denominators moved, which is what a snapshot is supposed to do.
61
114
 
62
115
  ## the proxy caveat, which travels with every number
63
116
 
@@ -109,8 +162,10 @@ read these before you quote a number at anyone.
109
162
  - **one operator's corpus.** every figure in this README comes from one machine.
110
163
  it is an existence proof that the measurement runs, not a finding about how
111
164
  people prompt. run it on yours and you get yours.
112
- - **two harnesses today: Claude Code and Codex.** nothing else is supported.
113
- cursor, aider, and the rest are not read.
165
+ - **three harnesses today: Claude Code, Codex, Cursor.** nothing else is supported.
166
+ aider and the rest are not read. and the three are not equal: Claude Code has a
167
+ measured-reliable authorship field, Cursor has only the `<user_query>` wrapper,
168
+ which is weaker and is labelled weaker wherever it is used.
114
169
  - **the habit labels are heuristics.** "states-a-check-or-done-condition" is a
115
170
  pattern match over your text, not comprehension. it will misfile some prompts.
116
171
  - **correlation, not instruction.** detailed prompts surviving more often does not
@@ -126,25 +181,50 @@ claim, so here is the grep that settles it against the single file it ships as:
126
181
  $ grep -nE '^[[:space:]]*(import|from) ' transcripto.py
127
182
  8:import sys, os, json, glob, re, sqlite3, argparse
128
183
  9:from datetime import datetime, timezone
129
- 225: import time
184
+ 260: import time
185
+ 1051: import datetime
186
+ 1061: from the separator), so the result is checked on disk and dropped if it is
130
187
  ```
131
188
 
132
- that is the whole import list, three lines. `time` sits inside the `watch` loop,
133
- which is why the pattern allows for indentation. anchor it at `^import` and you
134
- would miss one, so do not take my word for the anchor either.
189
+ five lines, four of which are imports and all four are stdlib. `time` and
190
+ `datetime` sit inside functions, which is why the pattern allows for indentation —
191
+ anchor it at `^import` and you would miss two, so do not take my word for the
192
+ anchor either. line 1061 is the pattern catching a docstring that happens to begin
193
+ with the word `from`; it is prose, not an import, and it is left in rather than
194
+ tuned out, because a grep you tuned until it agreed with you proves nothing.
195
+
196
+ what the list does NOT contain is the actual claim: no `socket`, no `urllib`, no
197
+ `requests`, no `http.client`, no `subprocess`. that one is checkable too, and the
198
+ right answer is no output at all:
199
+
200
+ ```
201
+ $ grep -nE '\b(socket|urllib|requests|http\.client|subprocess)\b' transcripto.py
202
+ $
203
+ ```
135
204
 
136
- your transcripts stay in `~/.claude` and `~/.codex`. the index it builds stays in
137
- `~/.trace`.
205
+ your transcripts stay in `~/.claude`, `~/.codex` and `~/.cursor`. the index it
206
+ builds stays in `~/.trace`.
138
207
 
139
208
  ## the rest of it
140
209
 
210
+ `coach` and `cost` read your transcript files directly and need nothing set up.
211
+ **the other six read a local index, so run this once first:**
212
+
213
+ ```
214
+ transcripto index # a few minutes on a large corpus, incremental after that
215
+ ```
216
+
217
+ on a 2,874-file corpus that was 164 seconds, measured 2026-08-29. if you skip it,
218
+ the six say so and exit 2.
219
+
141
220
  ```
142
221
  transcripto index build / refresh (incremental)
143
222
  transcripto watch live, new sessions get picked up as your agents work
144
223
  transcripto ask YOUR OWN messages about a topic, newest first + a rollup
145
224
  transcripto search full-text across everything (you + agents + tool logs)
146
225
  transcripto find every session that wrote / edited / read a file
147
- transcripto sessions recent sessions + their opening ask
226
+ transcripto trace what durably happened after each prompt you typed (0.1.2+)
227
+ transcripto sessions recent sessions + the first prompt YOU typed in each
148
228
  transcripto stats what you actually work on
149
229
  transcripto cost what ONE of your decisions costs
150
230
  transcripto coach which of YOUR prompt habits survive (a proxy)
@@ -154,11 +234,17 @@ transcripto coach which of YOUR prompt habits survive (a proxy)
154
234
  thinking about X across ALL my sessions", in your own words only.
155
235
 
156
236
  ```
157
- $ transcripto find USER-JOURNEY.md
158
- 2026-08-20 WROTE ~/CODE/mountain-of-helicon-main/USER-JOURNEY.md
237
+ $ transcripto find USER-JOURNEY.md # run 2026-08-29
238
+ USER-JOURNEY.md 4 touches across sessions (3 were writes/edits)
239
+
240
+ 2026-08-20 WROTE ~/CODE/mountain-of-helicon-main/USER-JOURNEY.md abd9e871
241
+ 2026-08-21 WROTE ~/…/Obsidian LIFE/00 Dashboard/suite-user-journey.md 0f845ede
242
+ 2026-08-27 read ~/CODE/hack-fleet-ata/docs/USER-JOURNEY.md cddfde29
243
+ 2026-08-27 WROTE ~/CODE/hack-fleet-ata/docs/USER-JOURNEY.md cddfde29
159
244
  ```
160
245
 
161
- the file you lost, found across every session you ever ran, one line.
246
+ the file you lost, found across every session you ever ran, with the session id
247
+ that touched it. `find` needs `transcripto index` first.
162
248
 
163
249
  ## Codex
164
250
 
@@ -197,11 +283,15 @@ just gives the file a name on your PATH.
197
283
  ## tests
198
284
 
199
285
  ```
200
- ./test_coach.sh 14 assertions
201
- ./test_codex.sh 14 assertions
202
- ./test_cost.sh 12 assertions
286
+ ./test_coach.sh 15 assertions
287
+ ./test_codex.sh 14 assertions
288
+ ./test_cost.sh 12 assertions
289
+ ./test_small_n.sh 7 assertions
290
+ ./test_label_bands.sh 13 assertions
203
291
  ```
204
292
 
293
+ 61 assertions, all green, re-run 2026-08-31.
294
+
205
295
  offline, no keys, on fixtures that inherit the real transcript shape including
206
296
  all four ways a non-human record disguises itself as `type: user`.
207
297
 
@@ -209,6 +299,15 @@ the load-bearing one in `test_coach.sh` is `REVERTED IS NOT SURVIVED`: a commit
209
299
  that got `reset --hard` in the same session left no durable record. flip that one
210
300
  line and the suite goes red, which is the point. a generous proxy is a broken one.
211
301
 
302
+ `test_label_bands.sh` is the other one, and it exists because 0.1.1 shipped the
303
+ defect it pins. `SURVIVES MOST` took the top five habits and `SURVIVES LEAST` took
304
+ the bottom five, which overlap whenever you have fewer than ten rankable habits —
305
+ so a new user, who necessarily has few, read the same habit at the same percentage
306
+ under both "do more of these" and "these tend to loop". on a 3-habit corpus 0.1.1
307
+ reprinted all three, all at 65% (22/34). the suite is red on the published 0.1.1
308
+ file and green on this one, and its `wide` band asserts the fix leaves a large
309
+ corpus byte-identical.
310
+
212
311
  ## why though
213
312
 
214
313
  your agent history is proof. every "yeah it's done" has a real trace sitting
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "transcripto"
7
- version = "0.1.1"
7
+ version = "0.1.3"
8
8
  description = "Search everything your coding agents ever did, grade your own prompts, and price your decisions. Local, stdlib-only, your data never leaves the machine."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"