mervenoyan commited on
Commit
b6b084e
·
1 Parent(s): 2d3963a

Make sin meta a verbatim user quote, not a paraphrased citation

Browse files

Title stays as the roast sentence; the smaller second line (meta) is
now strictly a verbatim top_quote in smart quotes — the user's own
words as the receipt for the sin. No render.py change needed since
.tpb-sin-meta already renders smaller and below the title.

Files changed (1) hide show
  1. analyze.py +9 -7
analyze.py CHANGED
@@ -141,7 +141,7 @@ Return EXACTLY one JSON object, no prose, no markdown:
141
  "archetype": ["The <adjective>", "<Noun>"],
142
  "tagline": "<130-170 chars, 2-3 italic lines, sentences only, end on a punchline>",
143
  "sins": [
144
- {"n":"01","title":"<50-90 chars, one concrete user behaviour, smart quotes for quoted phrases>","meta":"<30-60 chars, lowercase, mono, cite with · separators (turns, tools, sessions, percents)>"},
145
  {"n":"02","title":"...","meta":"..."},
146
  {"n":"03","title":"...","meta":"..."}
147
  ],
@@ -153,7 +153,7 @@ Field budgets (hard limits — overflow breaks the layout):
153
  - archetype[1]: 6-14 chars (line 2, title-cased punch noun)
154
  - tagline: 130-170 chars
155
  - sins[].title: 50-90 chars
156
- - sins[].meta: 30-60 chars
157
  - forecast.body: 270-340 chars, ends with "Lucky <x>: <y>. Avoid: <z>."
158
 
159
  The sins array MUST contain exactly 3 objects. Do not emit fewer.
@@ -165,15 +165,15 @@ Voice:
165
 
166
  Hard rules:
167
  1. Roast the USER, not the agent. The user cannot run code; only the agent can. Wrong: "Parsed JSON with a regex twice." (that's the agent). Right: "Asked the agent to parse JSON with a regex twice." / "Demanded a regex over a JSON parser, against advice."
168
- 2. No invented quotes. Anything in "" inside sins[].title or tagline must literally appear in a digest's top_quotes (case-flexible, light editing for length OK).
169
- 3. Cite or omit. Every sins[].meta must reference something verifiable sessions, mood, counts, toolsdrawn from the digests. If you cannot cite, pick a different sin.
170
  4. No PII. No emails, no real names, no private repos. Public handles and public dataset names are fine.
171
  5. No identity punching. Roast process and habits — not who the user is. Off-limits: appearance, nationality, gender, politics, illness. Fair game: ignoring docs, refactor addiction, regex misuse, vibes-driven coding, asking the same thing six ways, premature optimisation, late-night commits.
172
 
173
  Procedure:
174
  1. Skim the digests for recurring patterns (repeated questions, premature optimisation, doc avoidance, tone, tool misuse, mood arc).
175
  2. Pick ONE crisp archetype. Examples: The Premature Optimizer · The Vibes Driver · The Doc Avoider · The Refactor Romantic · The Confidence Auditor · The Apology Engineer · The TODO Composer. Invent freely.
176
- 3. Pick three sins the digests support. Cite each.
177
  4. Tagline: 2-3 short sentences piling on the archetype with concrete examples. End on a punchline.
178
  5. Horoscope: one absurd technical prediction grounded in a real user pattern. Close with "Lucky <something>: <x>. Avoid: <y>."
179
  6. Validate lengths against budgets. Trim or pad before emitting.
@@ -191,8 +191,10 @@ def bulletin(
191
  f"user: {user}\n"
192
  f"dataset: {dataset_id}\n\n"
193
  f"digests (JSON list):\n{json.dumps(digests, ensure_ascii=False, indent=2)}\n\n"
194
- "Reminder: emit EXACTLY 3 sins and respect every length budget. "
195
- "Tagline ≤170 chars; forecast.body ≤340 chars."
 
 
196
  )
197
  resp = client.chat_completion(
198
  messages=[
 
141
  "archetype": ["The <adjective>", "<Noun>"],
142
  "tagline": "<130-170 chars, 2-3 italic lines, sentences only, end on a punchline>",
143
  "sins": [
144
+ {"n":"01","title":"<50-90 chars: one concrete user behaviour, sentence case, no quotes>","meta":"<30-110 chars: a VERBATIM quote from the user from a top_quotes entry, wrapped in smart quotes — no paraphrasing, no citation, no commentary>"},
145
  {"n":"02","title":"...","meta":"..."},
146
  {"n":"03","title":"...","meta":"..."}
147
  ],
 
153
  - archetype[1]: 6-14 chars (line 2, title-cased punch noun)
154
  - tagline: 130-170 chars
155
  - sins[].title: 50-90 chars
156
+ - sins[].meta: 30-110 chars (a verbatim user quote, smart-quoted)
157
  - forecast.body: 270-340 chars, ends with "Lucky <x>: <y>. Avoid: <z>."
158
 
159
  The sins array MUST contain exactly 3 objects. Do not emit fewer.
 
165
 
166
  Hard rules:
167
  1. Roast the USER, not the agent. The user cannot run code; only the agent can. Wrong: "Parsed JSON with a regex twice." (that's the agent). Right: "Asked the agent to parse JSON with a regex twice." / "Demanded a regex over a JSON parser, against advice."
168
+ 2. EVERY sins[].meta MUST be a verbatim top_quote from one of the digests, wrapped in smart quotes ( " " ). No paraphrasing, no rewording, no citation text, no analysis. Just the user's own words. If no top_quote fits a sin you've drafted, pick a different sin that does have a fitting quote.
169
+ 3. The title is the roast sentence (no quotes inside it); the meta below it is the receipt the user's own words that prove the sin. Title and meta must be different content, not paraphrases of each other.
170
  4. No PII. No emails, no real names, no private repos. Public handles and public dataset names are fine.
171
  5. No identity punching. Roast process and habits — not who the user is. Off-limits: appearance, nationality, gender, politics, illness. Fair game: ignoring docs, refactor addiction, regex misuse, vibes-driven coding, asking the same thing six ways, premature optimisation, late-night commits.
172
 
173
  Procedure:
174
  1. Skim the digests for recurring patterns (repeated questions, premature optimisation, doc avoidance, tone, tool misuse, mood arc).
175
  2. Pick ONE crisp archetype. Examples: The Premature Optimizer · The Vibes Driver · The Doc Avoider · The Refactor Romantic · The Confidence Auditor · The Apology Engineer · The TODO Composer. Invent freely.
176
+ 3. Pick three sins the digests support. For each: write a roast sentence as the title, then pick a verbatim top_quote that proves the sin and place it (smart-quoted) as the meta.
177
  4. Tagline: 2-3 short sentences piling on the archetype with concrete examples. End on a punchline.
178
  5. Horoscope: one absurd technical prediction grounded in a real user pattern. Close with "Lucky <something>: <x>. Avoid: <y>."
179
  6. Validate lengths against budgets. Trim or pad before emitting.
 
191
  f"user: {user}\n"
192
  f"dataset: {dataset_id}\n\n"
193
  f"digests (JSON list):\n{json.dumps(digests, ensure_ascii=False, indent=2)}\n\n"
194
+ "Reminder: emit EXACTLY 3 sins. Each sin's `meta` MUST be a verbatim "
195
+ "top_quote from the digests, wrapped in smart quotes — no paraphrasing, "
196
+ "no citation, no analysis. The `title` is the roast; the `meta` is the "
197
+ "user's own words. Tagline ≤170 chars; forecast.body ≤340 chars."
198
  )
199
  resp = client.chat_completion(
200
  messages=[