Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add skills/g-research/bobbit/prw-previewnpx skills add G-Research/bobbit --skill prw-previewgit clone --depth 1 https://github.com/G-Research/bobbitWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/g-research/bobbit/prw-preview)<a href="https://agentmods.dev/skills/g-research/bobbit/prw-preview"><img src="https://agentmods.dev/badge/skills/g-research/bobbit/prw-preview.svg" alt="Measured on agentmods" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00025 | $0.02313 |
| Opus 5 | $0.00013 | $0.01156 |
| Sonnet 5 | $0.00005 | $0.00463 |
| Haiku 4.5 | $0.00003 | $0.00231 |
Grade A, and why
prw-preview scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 5d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 225 lines — stays where its author put it; the contents beside it link to each section on GitHub.
PR Walkthrough Like-for-Like Preview
Create a live preview of the PR Walkthrough panel that is faithful enough for layout iteration.
Non-negotiables
- Import the exact source:
market-packs/pr-walkthrough/src/panel.js. - Do not copy panel HTML by hand.
- Do not define
--background,--card,--primary, or any other theme variables in the preview HTML. - Use Bobbit
preview_open(file=..., assets=["bundle.js"])so the preview iframe gets the real theme bridge. - If taking screenshots, prefer the in-app preview iframe. Standalone
file://or local HTTP screenshots do not prove theme parity. - The mock
recoverroute must returnfound: trueand a YAML payload, or the real panel will correctly render the missing state.
Steps
- Create a temporary preview directory:
mkdir -p .bobbit/tmp/prw-preview
- Write
.bobbit/tmp/prw-preview/index.htmlwith no custom palette:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>PR Walkthrough Preview</title>
<style>
html, body, #root { height: 100%; margin: 0; }
body {
background: var(--background);
color: var(--foreground);
overflow: hidden;
}
</style>
</head>
<body>
<div id="root"></div>
<script type="module" src="./bundle.js"></script>
</body>
</html>
- Write
.bobbit/tmp/prw-preview/entry.tsthat imports the exact source panel:
import { html, nothing, render } from "lit";
import createPanel from "../../../market-packs/pr-walkthrough/src/panel.js";
const panel = createPanel({ html, nothing, renderHeader: () => nothing });
const root = () => document.getElementById("root");
let currentParams: any = {};
let currentHost: any;
let renderQueued = false;
const hostStoreData = new Map<string, unknown>();
const READY_YAML = `schema_version: 1
pr:
provider: github
owner: SuuBro
repo: bobbit
number: 42
title: Fix terminal reattach
url: https://github.com/SuuBro/bobbit/pull/42
base_sha: 135c5ef1234567890
head_sha: 6fa7ce0123456789
original_description:
body: Preview fixture
source: gh_api
fetched_at: "2026-06-28T12:00:00.000Z"
stats:
files_changed: 16
additions: 828
deletions: 104
walkthrough:
context:
why_created: Fix terminal reattach after refresh.
problem_solved: Reopened sessions reconnect to persisted background processes.
why_worth_merging: Prevents users losing terminal context.
merge_concerns: Verify restart recovery manually.
author_intent: Reuse saved process metadata to restore terminal streams.
reviewer_map: core: src/server/agent/bg-process-manager.ts — reattach lifecycle
merge_assessment:
recommendation: comment
confidence: medium
summary: Core reattach path is covered; manually verify restart recovery.
blocking_concerns: []
non_blocking_concerns: []
design_decisions: []
review_chunks: []
omissions_and_followups: []
audit:
remaining_changed_areas: []
low_signal_or_mechanical_changes: []
generated_or_binary_files: []
reviewer_checklist:
- Browser coverage for terminal refresh and session navigation reattach.
display:
phase_order: [orientation, significant, audit]
chunk_order: []
`;
const READY_BUNDLE = {
found: true,
persistedAt: "2026-06-28T12:00:00.000Z",
changeset: {
provider: "github",
owner: "SuuBro",
repo: "bobbit",
number: 42,
url: "https://github.com/SuuBro/bobbit/pull/42",
prTitle: "Fix terminal reattach",
title: "Fix terminal reattach",
baseSha: "135c5ef1234567890",
headSha: "6fa7ce0123456789",
filesChanged: 16,
additions: 828,
deletions: 104,
},
cards: [
{
id: "orientation-overview",
phaseId: "orientation",
navLabel: "Orientation",
title: "PR context",
summary: "Terminal reattach now restores persisted background processes after refresh or restart.",
rationale: "Focused six-beat reviewer orientation.",
sections: [
{ id: "what-changed-and-why", navLabel: "What/why", eyebrow: "Purpose", heading: "What changed and why", body: "Fixes terminal reattach so reopened sessions reconnect to persisted background processes instead of showing stale or disconnected terminal state.", showStats: true },
{ id: "how-it-works", navLabel: "How it works", eyebrow: "Implementation", heading: "How it works", body: "The runtime resolves saved process metadata, reconnects the terminal stream when the process is still alive, and surfaces clear stopped/stale states when reattach is not possible." },
{ id: "change-map", navLabel: "Change map", eyebrow: "Review map", heading: "Change map", fileRoles: [{ role: "core", file: "src/server/agent/bg-process-manager.ts", note: "reattach lifecycle" }] },
{ id: "risks-and-edge-cases", navLabel: "Risks", eyebrow: "Risk", heading: "Risks and edge cases", concerns: [{ severity: "blocking", text: "A dead process must not be shown as reattached or interactive." }] },
{ id: "validation", navLabel: "Validation", eyebrow: "Evidence", heading: "Validation", items: ["Browser coverage for terminal refresh and session navigation reattach."] },
{ id: "merge-recommendation", navLabel: "Merge", eyebrow: "Decision", heading: "Merge recommendation", body: "Merge if reattach works after refresh and stale process states stay explicit.", verdict: { recommendation: "comment", confidence: "medium", summary: "Verify restart recovery manually before approval." } },
],
checklist: [],
diffBlocks: [],
suggestedComments: [],
},
{ id: "runtime", phaseId: "significant", navLabel: "Runtime", title: "Terminal reattach runtime", summary: "Reconnects reopened sessions to existing background process streams when possible.", rationale: "Primary behavior change.", checklist: [], diffBlocks: [], suggestedComments: [] },
{ id: "audit", phaseId: "audit", navLabel: "Audit", title: "Final review controls", summary: "Confirm completion and export controls.", rationale: "Submit flow smoke card.", checklist: [], diffBlocks: [], suggestedComments: [] },
],
warnings: [],
export: { available: false, reason: "Preview fixture" },
};
function scheduleRender() {
if (renderQueued) return;
renderQueued = true;
queueMicrotask(() => {
renderQueued = false;
if (currentHost) renderPanel(currentParams, currentHost);
});
}
const host = {
store: {
async get(key: string) { return hostStoreData.get(key); },
async put(key: string, value: unknown) { hostStoreData.set(key, value); },
},
async callRoute(route: string) {
if (route === "recover") return { found: true, finalized: true, jobId: "preview-job", yaml: READY_YAML, baseSha: "135c5ef1234567890", headSha: "6fa7ce0123456789", finalizedAt: Date.now() };
if (route === "bundle") return READY_BUNDLE;
if (route === "status") return { phase: "submitted", finalized: true, jobId: "preview-job", yaml: READY_YAML };
return undefined;
},
requestRender: scheduleRender,
};
function renderPanel(params: any, hostArg: any) {
currentParams = params;
currentHost = hostArg;
render(panel.render(currentParams, currentHost), root()!);
}
renderPanel({ __sessionId: "preview-child", jobId: "preview-job" }, host);
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 5d ago First seen · 225 lines · 25 tokens per session scan A 18433b2e8714
prw-preview is a skill published in the GitHub repository G-Research/bobbit (11 stars, last pushed yesterday), licensed MIT. It adds 25 tokens to every session and 2,313 once invoked, about $0.0001 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other skills, from other repositories
systematic-debugging
Use when encountering any bug, test failure, or unexpected behavior, before proposing fixes.
local-ai-agents
Build local-first AI agents that run entirely on a developer workstation with Microsoft Foundry Local and Qwen function-calling models. Covers Small Language Models (SLMs), the OpenAI-compatible local endpoint, sandboxed local tools, local RAG with Chroma, local MCP servers, hybrid cloud/local routing, and the…
next-cache-components-adoption
Turn on Cache Components in a Next.js app and resolve the blocking routes it surfaces. Use when the user wants to enable, adopt, or migrate to Cache Components, flip the cacheComponents flag, work through a flood of blocking-prerender / instant validation errors, run the cache-components-instant-false codemod, or…
next-cache-components-optimizer
Drive a Next.js route to instant navigation by setting up an agentic loop, under Cache Components / PPR, on initial load (hard navigation) and client-side navigation (soft navigation). Encode the goal as a failing @next/playwright instant() e2e and work it to green, one verified route at a time; the shipped test then…
next-partial-prefetching-adoption
Turn on Partial Prefetching in a Next.js app and work through the insights it surfaces. Use when the user wants to enable or adopt Partial Prefetching, flip the partialPrefetching flag, opt routes in with export const prefetch = 'partial', audit Link prefetch={true} behavior, preserve existing prefetched UI with…
chronicle
Analyze Copilot session history for standup reports, usage tips, session search, and session reindexing. Use when the user asks for a standup, daily summary, usage tips, workflow recommendations, wants to search or find past sessions by keyword/file/PR, wants to reindex their session store, or asks about deleting…