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.
- {transcripto-0.1.1/transcripto.egg-info → transcripto-0.1.3}/PKG-INFO +142 -43
- {transcripto-0.1.1 → transcripto-0.1.3}/README.md +141 -42
- {transcripto-0.1.1 → transcripto-0.1.3}/pyproject.toml +1 -1
- {transcripto-0.1.1 → transcripto-0.1.3/transcripto.egg-info}/PKG-INFO +142 -43
- {transcripto-0.1.1 → transcripto-0.1.3}/transcripto.py +345 -53
- {transcripto-0.1.1 → transcripto-0.1.3}/LICENSE +0 -0
- {transcripto-0.1.1 → transcripto-0.1.3}/setup.cfg +0 -0
- {transcripto-0.1.1 → transcripto-0.1.3}/transcripto.egg-info/SOURCES.txt +0 -0
- {transcripto-0.1.1 → transcripto-0.1.3}/transcripto.egg-info/dependency_links.txt +0 -0
- {transcripto-0.1.1 → transcripto-0.1.3}/transcripto.egg-info/entry_points.txt +0 -0
- {transcripto-0.1.1 → transcripto-0.1.3}/transcripto.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: transcripto
|
|
3
|
-
Version: 0.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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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
|
|
77
|
-
the time (66 of 104)**. prompts with no stated intent survived
|
|
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
|
-
- **
|
|
131
|
-
|
|
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
|
-
|
|
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
|
-
|
|
151
|
-
which is why the pattern allows for indentation
|
|
152
|
-
would miss
|
|
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 `~/.
|
|
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
|
|
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
|
-
|
|
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,
|
|
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
|
|
219
|
-
./test_codex.sh
|
|
220
|
-
./test_cost.sh
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
-
|
|
56
|
+
## what you get back
|
|
29
57
|
|
|
30
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
59
|
-
the time (66 of 104)**. prompts with no stated intent survived
|
|
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
|
-
- **
|
|
113
|
-
|
|
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
|
-
|
|
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
|
-
|
|
133
|
-
which is why the pattern allows for indentation
|
|
134
|
-
would miss
|
|
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 `~/.
|
|
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
|
|
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
|
-
|
|
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,
|
|
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
|
|
201
|
-
./test_codex.sh
|
|
202
|
-
./test_cost.sh
|
|
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.
|
|
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"
|