{"slug":"persona-review","title":"persona-review","summary":"Convene a small panel of persistent reviewer personas (curated colleague-likenesses plus invent-on-demand) to review a document cold, in character, then synthesize a panel verdict. Use when the user wants a document reviewed by a panel, wants named perspectives on a plan or desig","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-08-23T09:00:49.097992Z","repo":{"url":"https://github.com/ConnorGriffin/skills","stars":20,"forks":5,"license":null,"updatedAt":"2026-09-25T01:23:31Z"},"bodyHtml":"<hr>\n<h2>name: persona-review\ndescription: Convene a small panel of persistent reviewer personas (curated colleague-likenesses plus invent-on-demand) to review a document cold, in character, then synthesize a panel verdict. Use when the user wants a document reviewed by a panel, wants named perspectives on a plan or design, or when another skill (e.g. plan-review) convenes a persona panel for a load-bearing review.</h2>\n<h1>Persona review</h1>\n<p>A panel of reviewer personas reads a document cold, each from its own memory, and\nreturns a position in its own voice. The skill picks the panel, runs each reviewer\nin isolation, and synthesizes the verdict. Personas persist across reviews: what a\npanelist decided last time is not re-litigated unless the document changed the\ngrounds for it.</p>\n<h2>Verbs</h2>\n<ul>\n<li><strong><code>review &lt;doc&gt;</code></strong> (default). Pick a panel, review cold, synthesize a verdict.</li>\n<li><strong><code>mine &lt;person&gt; &lt;org|org/repo&gt;</code></strong>. Build or refresh a real-colleague persona's\nprofile from their actual PR history within the given scope. Also the re-mine\ncommand.</li>\n<li><strong><code>roster</code></strong>. List available personas: curated, real-colleague, and invented-and-kept,\neach with its last-mine date (real-colleague) or last-used date, derived from its\nnewest review-log entry.</li>\n</ul>\n<h2>First-time setup</h2>\n<p>This skill ships no personas and no personal data. Persona memory lives in a\nseparate <strong>data repository</strong> you own, resolved by a config pointer:</p>\n<ol>\n<li><code>PERSONA_REVIEW_HOME</code> env var (the data repo path itself), if set, else</li>\n<li><code>$XDG_CONFIG_HOME/persona-review/config.json</code> (or <code>~/.config/persona-review/config.json</code>),\ncontaining <code>{\"data_repo\": \"&lt;path&gt;\"}</code>.</li>\n</ol>\n<p>If <code>PERSONA_REVIEW_HOME</code> already resolves to a data repo, skip straight to the\n<code>CONTEXT.md</code> check below. Otherwise, if neither pointer resolves, or the resolved\ndata repo has no <code>CONTEXT.md</code>, walk the user through:</p>\n<ol>\n<li><p>Creating a private repo (not this one) to hold persona memory.</p>\n</li>\n<li><p>Proposing the config pointer file's contents (path and format above) and writing\nit only after the user approves it. Skip this step when <code>PERSONA_REVIEW_HOME</code>\nalready resolves.</p>\n</li>\n<li><p>Proposing a starter <code>CONTEXT.md</code> for that repo (the data repo's own schema\ndocument, distinct from any project domain glossary), covering:</p>\n<ul>\n<li><strong>Record types:</strong> persona profile, review-log entry, override ruling.</li>\n<li><strong>Supersession rule:</strong> a stance change is a new record linking the record it\nsupersedes; existing records are never edited in place.</li>\n<li><strong>Distillation rule:</strong> records hold distilled stances and quoted evidence lines,\nnever full transcripts of a review or a mined PR.</li>\n<li><strong>Grounds rule:</strong> every condition in a review-log entry, blocking or note,\nends with a labeled clause <code>grounds: when &lt;document-independent property&gt;</code>\nalongside the document-specific detail. Grounds are what a future review\ntests to decide whether a new document reopens the point.</li>\n<li><strong>Disposition rule:</strong> a later review that finds a prior condition met or\nmooted records that disposition in its own entry, never by editing the\nold one.</li>\n</ul>\n<p>Show the proposed <code>CONTEXT.md</code> and commit it to the data repo only after the user\napproves it. Never write persona memory, profiles, or mined evidence into this\nskill's own repository.</p>\n</li>\n</ol>\n<p>Every later write to the data repo follows the data repo's own <code>CONTEXT.md</code> for record\nshape and layout — read it before writing, and defer to it over the shapes described\nhere if the two disagree. That deference is scoped to shape and layout only: approval\nbefore commit, append-only logs, supersession-not-mutation, and distilled-not-transcript\nrecords hold regardless of what the data repo's <code>CONTEXT.md</code> says.</p>\n<p>This data repo is this skill's only persona store, separate from <code>ui-craft</code>'s\nproject-local <code>.claude/qa/personas</code>: design-surface persona critique belongs to\n<code>ui-craft</code>, not here.</p>\n<h2>Roster</h2>\n<p>Two kinds of persona:</p>\n<ul>\n<li><strong>Curated.</strong> Named archetypes (e.g. \"the security skeptic\", \"the API minimalist\")\nwith a profile grown by its review log like any other persona. There is no\ndedicated creation verb: a curated persona enters the roster by the user keeping\nan invented persona after a review (below), or by the user describing one\ndirectly to add to the roster, proposed as a record under the same approval\ngate as any other write.</li>\n<li><strong>Real-colleague.</strong> Carries the person's real name, and every attribution of its\noutput (its own position, the synthesized verdict, and any hand-back to a\ncalling skill) is labeled as a simulation of that person with its mine date,\nnever presented as their actual words. Its profile is built by <code>mine &lt;person&gt;</code>,\nnot invented. That labeling governs chat and hand-back attribution only;\nfor anything committed to a project repository, containment below wins and the\nname does not appear at all.</li>\n</ul>\n<p><strong>Invent-on-demand.</strong> When no roster persona fits a document's concerns, invent one\nfor this review (state its stance and evidence-gathering approach up front). It\npersists to the roster only if the user says to keep it after the review; otherwise\ndiscard it at review close, and its review-log entry from this review is dropped\nalong with it rather than written to the data repo.</p>\n<h2>Containment: names never leave the session</h2>\n<p>Persona names, the simulation label, mine dates, and any panel narrative exist in\nexactly two places: the chat conversation, and the private persona data repo.</p>\n<p>No file written to a project repository may carry any of it. That covers design\ndocs, ADRs, plan documents, PR bodies, commit messages, review artifacts, ledgers,\nand anything else committed anywhere other than the persona data repo. No persona\nname (real or invented, curated or colleague), and no \"reviewed by\", \"panel\", or\n\"simulated\" framing.</p>\n<p>When panel findings belong in a committed artifact, they go in as plain content:\nconditions, decisions, open questions. Not anonymized attribution (\"a security\nreviewer noted...\"). No attribution at all.</p>\n<p>This binds calling skills too. A verdict handed back to another skill carries\nattribution because it is written for the chat; the caller strips every trace of\nit before anything reaches a repo.</p>\n<h2>Mining a real colleague</h2>\n<p><code>mine &lt;person&gt;</code> builds or refreshes a profile from that person's actual pull request\nhistory using the GitHub CLI (<code>gh</code>). The user must supply the repo or org to search\n(<code>mine &lt;person&gt; &lt;org/repo&gt;</code> or <code>&lt;org&gt;</code>) — never crawl unbounded across the estate.\nWithin that scope, pull: review comments they left, their approval patterns (what\nthey wave through vs. what they block on), and concerns that recur across reviews.\nDistill to stances and short evidence quotes; do not store full comment transcripts.\nWrite the profile as a new, dated record (a refresh supersedes the prior profile\nrecord rather than editing it) and show the proposed record for approval before it\ncommits.</p>\n<p>At <code>review</code> time, check every real-colleague panelist's last mine date. Flag any\nolder than one quarter and suggest a re-mine before or after the review; an unmined\nor stale profile does not block the review, it is just weaker evidence for that\npanelist's positions.</p>\n<h2>Panel composition</h2>\n<p>For <code>review &lt;doc&gt;</code>, pick 2-3 personas whose known concerns match what the document is\nactually about (a data-model change draws a different panel than a UI change). Before\nreview starts, state the panel and, for each pick, the one-line reason it was chosen.\nPrefer roster personas; invent only when no roster persona's concerns cover a topic\nthe document raises.</p>\n<h2>Cold review, per persona</h2>\n<p>Each panelist reviews independently and cold: no visibility into the document under\nany other panelist's read, and no access to the panel's eventual synthesis while\nforming its own position. Where the harness supports it, run each panelist in its own\nsubagent, handing it only:</p>\n<ul>\n<li>The document under review.</li>\n<li>That persona's profile (stances, style, evidence quotes) — the panelist's only\nstance source.</li>\n<li>That persona's review-log entries relevant to this document's topic, to test\nagainst this document (is a settled point reopened, is a prior condition met\nor mooted). A panelist does not mine log entries for new opinions.</li>\n<li>Override rulings relevant to this document's topic (settled points a prior review\nalready closed — do not re-raise them unless the document reopens the grounds for\nthem).</li>\n</ul>\n<p>Where subagents aren't available, review personas serially in the main session,\ndeliberately not looking back at an earlier persona's output while forming the next\none's position.</p>\n<p>Each panelist's output: positions taken, conditions imposed (each marked <strong>blocking</strong>\nor <strong>note</strong>), and an approval or refusal — all in the persona's voice, grounded in its\nprofile's evidence quotes. A persona whose profile has no bearing on some part of the\ndocument says nothing about that part rather than inventing an opinion.</p>\n<h2>Synthesis</h2>\n<p>Combine the panelists' outputs into one verdict:</p>\n<ul>\n<li><strong>Unanimous</strong> or <strong>split</strong>, stated plainly.</li>\n<li>Every <strong>blocking</strong> condition from any panelist, attributed to that panelist.</li>\n<li><strong>Note</strong>-level conditions listed separately; they inform but don't block.</li>\n</ul>\n<h2>Close: memory writes</h2>\n<p>At review close, batch every proposed memory write into one approval pass:</p>\n<ul>\n<li>A review-log entry per panelist (position, conditions, approval/refusal) — append,\nnever edit a prior entry.</li>\n<li>A distill line per blocking condition each panelist imposed: the\ndocument-independent stance it instantiates (\"blocks when </li>\n<li>Any override ruling the user makes during close (accepting a document over a\npanelist's blocking objection, or dismissing a note) — recorded so the same point\nisn't re-raised next time this document's topic comes up.</li>\n<li>Whether any invented persona is kept on the roster.</li>\n</ul>\n<p>Show the full batch of proposed records before committing any of them. Nothing\nbecomes canonical without that approval; a review whose writes are never approved\nstill produced its verdict, it just leaves no trace for next time.</p>\n<p>Running without a direct user channel (for example, inside a cold subagent) never\ncommits: emit the proposed distilled records as output instead, for the top-level\nsession to fold into its own close approval pass.</p>\n<h2>Being invoked by another skill</h2>\n<p>Other skills may convene this panel by name instead of running their own review pass\n(<code>plan-review</code> does, for load-bearing plans). When invoked this way, run <code>review &lt;doc&gt;</code>\nas above and hand back the synthesized verdict, with any real-colleague attribution\nin it still carrying the simulation label and mine date; the calling skill folds\nblocking conditions into its own objection list. That attribution is for the chat.\nThe calling skill must not write any of it (names, labels, mine dates, panel\nframing) into a repo artifact; per containment above, findings land there as plain\ncontent only. Defer the close approval pass: a\npanel invocation inside a calling skill's own review cycle does not run its own\nclose, it hands back the verdict and its proposed memory writes as output and holds\nthem until the calling skill's review terminates, then runs one close approval pass\ncovering that whole review (not one pass per panel invocation within it) — the\ncalling skill is responsible for actually running that pass when it terminates. If\nthis skill isn't installed, the caller degrades to whatever review it would\notherwise run — this skill has no required counterpart and works standalone.</p>\n<p>Memory following the <a href=\"https://github.com/ConnorGriffin/follow-through\">follow-through</a>\npattern (skill owns workflow, data repo owns schema via its own <code>CONTEXT.md</code>) is an\noptional upstream citation, not a dependency; nothing here requires that repository.</p>\n","files":[{"path":"agents/openai.yaml","sizeBytes":245,"isText":true},{"path":"SKILL.md","sizeBytes":13158,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"clean","suspicious":0,"notes":0,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-09-09T11:56:49.242548Z","sha256":"72976BCB9B15AC9762CDB8F9CDA60EB96914E11B33D8F7F51BB3440305611066","sizeBytes":5661},"review":null,"source":{"repositoryUrl":"https://github.com/ConnorGriffin/skills","path":"skills/tools/persona-review","license":null,"commit":"aa454ca3b5c6b9a8822dcb8a9432b4ad0a233f49","subtreeSha":"D97673F957711E15A8B1F73D510C22714537092DD13EA2F61BDFBE67AB3C9911","lastSyncedAt":"2026-09-27T19:30:04.492466Z"},"reviewedAt":"2026-09-09T11:57:23.037117Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/ConnorGriffin/skills/tree/main/skills/tools/persona-review"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install connorgriffin-skills@llmmart"},{"target":"git","command":"git clone https://github.com/ConnorGriffin/skills.git"}]}