Kookr-internal extension to rfc-iterative-review that captures append-only critic traces for later meta-analysis of RFC reviewer subagents.
Scanned 9/2/2026
Install to Claude Code
npx -y skills add kookr-ai/kookr --skill kookr-rfc-critic-meta-analysis --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Kookr Rfc Critic Meta Analysis?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/kookr-ai-kookr-rfc-critic-meta-analysis)More formats (shields.io, HTML) on the badges page.
---
name: kookr-rfc-critic-meta-analysis
description: Kookr-internal extension to rfc-iterative-review that captures append-only critic traces for later meta-analysis of RFC reviewer subagents.
keywords: kookr, rfc, critic, subagent, meta-analysis, reviewer, trace, iterative-review, prompt evolution
related: rfc-iterative-review, kookr-skill-naming-convention
---
# RFC Critic Meta-Analysis
Use this skill after `rfc-iterative-review` when drafting or revising Kookr RFCs that should contribute evidence about reviewer-subagent quality.
This skill does **not** replace `rfc-iterative-review`. It extends that workflow with a lightweight trace so future reports can answer which critics were useful, noisy, missing risks, or worth changing.
## Scope
This is Kookr-internal because it writes Kookr RFC artifacts under `docs/rfc/` and informs Kookr's reviewer-subagent roster. Do not promote it to the toolkit plugin unless the paths and schema ownership are generalized.
For the design rationale, see `docs/rfc/rfc-subagent-feedback-meta-analysis.md`.
## Trace Location
For an RFC at:
```text
docs/rfc/rfc-<slug>.md
```
write the trace at:
```text
docs/rfc/meta/rfc-<slug>.critic-trace.jsonl
```
Each line is one JSON object using `docs/schemas/critic-trace.v1.json`.
## When to Capture
During RFC review:
1. Run the normal `rfc-iterative-review` critic rounds.
2. After each critic returns, append one `invocation` event.
3. After the convergence **consensus attack** returns, append one `invocation` event too. It fires once, on the way out of Phase 2, and is not a panel lens — but its outcome is exactly what this trace measures, so it must not go unrecorded. Set `critic: "general-purpose"`, `extractionNote: "consensus-attack at convergence; not a panel lens"`, and reuse the final round number for `round` (the schema requires an integer ≥ 1, and a convergence-time run has no round of its own). Set `noSubstantiveFindings: true` when the verdict is "consensus survives" — a null verdict is a recorded outcome, not a skipped run.
4. For each substantive finding that survives triage, append one `finding` event.
5. Keep the normal human-readable `Critic Feedback Incorporated` section in the RFC.
6. At the end of the RFC, add a short `Meta-analysis readiness` note in the critic-feedback section.
Do not record every sentence from critic output. Record substantive findings: defects, missing constraints, empirical-check requests, scope changes, user-intent questions, or useful simplifications.
## Minimal Events
### Invocation
Write one invocation event per critic per round, including critics with no substantive findings, plus one for the convergence consensus attack (see "When to Capture" step 3).
```json
{
"schemaVersion": "critic-trace.v1",
"recordType": "invocation",
"rfcPath": "docs/rfc/rfc-example.md",
"round": 1,
"critic": "failure-mode-analyst",
"sourceRef": {
"kind": "manual_excerpt",
"excerptHash": "sha256:<hash>"
},
"substantiveFindingsExtracted": true,
"extractedFindingIds": ["rfc-example-r1-failure-mode-analyst-f1-1a2b3c4d"],
"noSubstantiveFindings": false,
"extractionNote": "Raw subagent transcript unavailable; finding copied from final subagent response."
}
```
If the critic produced no substantive finding, use:
```json
{
"schemaVersion": "critic-trace.v1",
"recordType": "invocation",
"rfcPath": "docs/rfc/rfc-example.md",
"round": 2,
"critic": "design-minimalist",
"sourceRef": { "kind": "unavailable" },
"substantiveFindingsExtracted": true,
"extractedFindingIds": [],
"noSubstantiveFindings": true
}
```
### Finding
Generate `findingId` as:
```text
<rfc-slug>-r<round>-<critic>-f<ordinal>-<8-char-rawFindingHash>
```
Example:
```json
{
"schemaVersion": "critic-trace.v1",
"recordType": "finding",
"rfcPath": "docs/rfc/rfc-example.md",
"round": 1,
"critic": "failure-mode-analyst",
"findingId": "rfc-example-r1-failure-mode-analyst-f1-1a2b3c4d",
"summary": "Outcome updates must be append-only, not mutable fields.",
"rawFinding": "Delayed outcome updates can corrupt historical records if old JSONL lines are rewritten.",
"sourceRef": {
"kind": "manual_excerpt",
"excerptHash": "sha256:1a2b3c4d..."
},
"disposition": "used",
"dispositionReason": "RFC changed to append outcome events separately from finding events.",
"valueNote": "Preserves time-horizon separation and auditability."
}
```
For duplicates, preserve the later critic's record and point at the first matching finding:
```json
{
"schemaVersion": "critic-trace.v1",
"recordType": "finding",
"rfcPath": "docs/rfc/rfc-example.md",
"round": 1,
"critic": "socratic-challenger",
"findingId": "rfc-example-r1-socratic-challenger-f2-9e8d7c6b",
"summary": "Outcome ownership is unclear.",
"rawFinding": "Who is allowed to assign laterOutcome, and under what evidence standard?",
"sourceRef": {
"kind": "manual_excerpt",
"excerptHash": "sha256:9e8d7c6b..."
},
"disposition": "duplicate",
"dispositionReason": "Same issue as failure-mode finding f1, with different framing.",
"duplicateOfFindingId": "rfc-example-r1-failure-mode-analyst-f1-1a2b3c4d",
"duplicateContext": "parallel_independent"
}
```
### Outcome
Append outcomes later. Do not edit the original finding line.
```json
{
"schemaVersion": "critic-trace.v1",
"recordType": "outcome",
"findingId": "rfc-example-r1-failure-mode-analyst-f1-1a2b3c4d",
"assessedAt": "2026-05-13T19:00:00Z",
"assessor": "implementer",
"horizon": "post_pr_open",
"outcome": "validated",
"evidence": "The implementation needed a separate outcome event to avoid rewriting original finding events.",
"evidenceRefs": [
{
"kind": "pr",
"ref": "https://github.com/kookr-ai/kookr/pull/123",
"summary": "PR implemented append-only outcome events."
}
]
}
```
### Missed Risk
Do not force missed-risk bookkeeping during drafting. When producing an aggregate report, either append `missed_risk` events for the horizon being evaluated or mark the report's trace-completeness section as `missed-risk sweep not performed`.
```json
{
"schemaVersion": "critic-trace.v1",
"recordType": "missed_risk",
"rfcPath": "docs/rfc/rfc-example.md",
"discoveredAt": "2026-05-14T10:00:00Z",
"evidence": "PR review found the schema allowed orphaned outcome events.",
"expectedCritics": ["failure-mode-analyst", "boundary-critic"],
"matchedFindingIds": [],
"note": "No round-1 critic identified orphaned outcome validation."
}
```
## Bias Controls
Minimum controls for every trace:
- Preserve raw finding text or a hashed excerpt pointer.
- Preserve one invocation event per critic run, including explicit no-finding runs.
- Preserve rejected, duplicate, and falsified findings.
- Do not use incorporation rate alone.
- Include author-bias context in `dispositionReason` when rejection depends on user intent, scope budget, or subjective taste.
- Require human approval for every prompt or roster diff.
Before broad/default rollout of a critic change:
- Evaluate a holdout set not used to motivate the change.
- Use a blinded finding packet where feasible.
- Compare against false-positive burden and missed-risk examples, not only useful findings.
- Validate across at least two time windows or RFC types before retiring a critic or changing default roster rules.
## Evolution Paths
### Fast Path: Low-Risk Prompt Clarification
Allowed for narrow clarifications that preserve a critic's role.
Required packet:
- One concrete trace example.
- One narrow prompt diff.
- One counterexample check explaining why the diff is not RFC-specific.
- One rollback condition describing what future trace pattern should revert it.
- Human approval.
Do not claim global improvement until later traces confirm it.
### Full Path: Prompt Philosophy or Roster Change
Required for adding, retiring, splitting, merging, or substantially changing a critic.
1. Observe at least five RFCs or two active RFC-writing days, and at least three invocations of the target critic.
2. Diagnose with a manual aggregate report.
3. Propose a promotion packet with target dimensions, diff, examples, holdout plan, expected failure mode, and rollback condition.
4. Trial in shadow mode or on holdout RFCs.
Do not retire high-variance critics solely because their useful findings are infrequent. `design-minimalist` and `ambition-amplifier` are adversarial by design; a critic can be valuable even when the author chooses the other side.
## Manual Aggregate Report
After 3-5 complete traces, write:
```text
docs/reports/rfc-critic-meta-analysis-YYYY-MM-DD.md
```
Include:
- Corpus: RFCs, rounds, critics, total substantive findings.
- Trace completeness: raw finding coverage, missing source refs, invalid events, orphaned outcomes, duplicate IDs, unknown/expired outcomes.
- High-value finding examples.
- False-positive examples.
- Missed-risk examples, or `missed-risk sweep not performed`.
- Adversarial-pair outcomes.
- Cost notes: triage burden, extra rounds, and visible model/runtime cost.
- Proposed changes, or `insufficient evidence`.
- Holdout/trial recommendation if a full-path change is proposed.
## Validation Before Aggregate Use
Before using a trace in an aggregate report:
- Count and exclude invalid JSONL lines.
- Count and exclude duplicate `findingId` values from prompt-change evidence.
- Count and exclude orphaned outcome events.
- Count and exclude events with unknown enum values.
- Treat missing required fields as invalid.
Invalid events are evidence of trace-quality problems, not evidence about critic quality.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!