synthesize: anonymous braindump CSV → themed review doc via the co-op gateway
Stdlib-only pipeline for the pre-meeting braindump: CryptPad Form CSV in, review.md + synthesis.json out. Two model stages (tag atomic points with verbatim quotes, cluster into themes/novel/dissent) wrapped in deterministic Python that verifies every quote against the source and computes counts from item ids, so the model never writes the final document. Defaults to tinfoil/glm-5.3 with reasoning_effort=low: without it the model spent the whole 8000-token budget on hidden reasoning and returned nothing (probed 2026-10-19; findings in README). Refuses non-TEE models without a flag. Content-hash cache so prompt tuning reruns are free. Offline unittest suite with a fake gateway; smoke-tested live on 5 synthetic responses for ~$0.03. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
1 parent
a8908c84cf
commit
05f4e88867
12 files changed
+2212
-15
No files matched your search
@@ -0,0 +1,27 @@
|
||||
You are helping a member-governed AI cooperative prepare for a members' meeting. You will receive a numbered list of atomic points extracted from an anonymous braindump survey. Each line looks like:
|
||||
|
||||
`i017 [r03/Q2 idea for] label text`
|
||||
|
||||
where `i017` is the item id, `r03` the anonymous respondent, `Q2` the question, then the item's kind and stance, then its label.
|
||||
|
||||
Group the items into themes that would help the group see where energy is concentrated, what is unusual, and where people disagree. Rules:
|
||||
|
||||
- A theme is a cluster of points about the same underlying topic, regardless of whether they agree. Give each theme a short name (at most 6 words) and a two-sentence neutral summary.
|
||||
- Every item id you reference must come from the list. Do not invent ids. An item may appear in at most one theme.
|
||||
- Prefer 5 to 12 themes. Fold tiny near-duplicate themes together; split a theme that is really two topics.
|
||||
- `novel`: item ids that stand alone (no other respondent raised anything similar) but are specific and actionable enough that the group should see them. Quality over quantity; at most 10.
|
||||
- `dissent`: places where items pull in opposite directions, or where a respondent pushes back on something others want. For each, name the theme it belongs to, list the item ids on the minority or opposing side, and summarize the tension in one or two neutral sentences. Include concerns of kind `concern` with stance `against` even if they stand alone, if they are substantive.
|
||||
- `open_questions`: at most 6 questions the group will need to answer, phrased neutrally, each grounded in the items (reference ids).
|
||||
|
||||
Do not rank themes yourself; counts will be computed from the item ids you assign. Do not write the final document; return only structured data.
|
||||
|
||||
Return exactly one fenced ```json block and nothing else, shaped as:
|
||||
|
||||
```json
|
||||
{
|
||||
"themes": [{"name": "...", "summary": "...", "item_ids": ["i001", "i004"]}],
|
||||
"novel": ["i017"],
|
||||
"dissent": [{"theme": "...", "item_ids": ["i009"], "summary": "..."}],
|
||||
"open_questions": [{"question": "...", "item_ids": ["i001"]}]
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,20 @@
|
||||
You are helping a member-governed AI cooperative make sense of an anonymous braindump survey before a members' meeting. You will receive a batch of survey responses. Each response has an id like `r03` and one or more answered questions, each with a question index like `Q2`.
|
||||
|
||||
Extract every distinct, atomic point a respondent makes. One point per item. Do not merge different points into one item, and do not invent points that are not in the text.
|
||||
|
||||
For each item return:
|
||||
|
||||
- `id`: the response id it came from (e.g. `r03`).
|
||||
- `q`: the question index it came from (e.g. `Q2`).
|
||||
- `label`: a neutral paraphrase of the point in at most 12 words, written so that similar points from different people would get similar labels.
|
||||
- `kind`: one of `idea` (something to build, try, or offer), `want` (something that would make membership more valuable to them), `need` (something missing or broken), `goal` (where the co-op should be), `concern` (a worry, disagreement, or criticism).
|
||||
- `stance`: `for` if the point supports doing or having something, `against` if it opposes or warns against something, `neutral` if it is an observation or question.
|
||||
- `quote`: a short verbatim excerpt (5 to 30 words) copied exactly from the response text that best evidences the point. It must be a character-for-character substring of the source text. Do not paraphrase, do not fix typos, do not add ellipses.
|
||||
|
||||
Skip pleasantries, empty answers, and "nothing to add". Keep the respondent's framing; do not editorialize.
|
||||
|
||||
Return exactly one fenced ```json block and nothing else, shaped as:
|
||||
|
||||
```json
|
||||
{"items": [{"id": "r03", "q": "Q2", "label": "...", "kind": "idea", "stance": "for", "quote": "..."}]}
|
||||
```
|
||||
Reference in new issue
Block a user