Commit ·
b6b084e
1
Parent(s): 2d3963a
Make sin meta a verbatim user quote, not a paraphrased citation
Browse filesTitle 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.
- 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
|
| 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-
|
| 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.
|
| 169 |
-
3.
|
| 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.
|
| 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
|
| 195 |
-
"
|
|
|
|
|
|
|
| 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=[
|