checkit · diff
git:20260726.c52289e to git:20260911.011ea36
59 added, 5 removed. Audit A to A.
---
name: checkit
category: research
description: >
Ingest-and-integrate an artifact someone points at with a terse, deliberately
under-articulated directive — "check this out", "lets research this", "look
into this", "wdyt" — followed by a URL, repo, paper, file, image, or pasted
document. Infers the actual request from a fully-contextualized frame (who is
asking + what they're working on + what's already known) WITHOUT bouncing a
clarifying question back, then runs the pipeline: contextualize → deep research
(verify every source) → analyze → connect → document the finding → suggest
ranked next steps. The artifact ends up metabolized into knowledge and action,
not left as a one-paragraph summary. Composes existing research/search/memory
tools; it does not reimplement them. USE WHEN: check this out, checkit,
/checkit, lets research this, research this, look into this, dig into this,
wdyt, what do you think of this, found this, take a look + an artifact; or
whenever an artifact is shared with an underspecified ask. NOT FOR:
retrospective "what have I been doing repeatedly" (a discovery/look-back task);
fully-specified artifact asks ("summarize this PDF in 3 bullets", "fix the bug
in this file" — answer directly). Triggers on those phrases + a shared artifact.
---
# checkit — ingest an artifact, integrate it, act on it
Someone drops a URL / repo / paper / file / image with a terse directive —
"check this out", "lets research this", "wdyt". The intent is real but
*unstated by design*: they're delegating the articulation, not just the work.
`checkit` **infers the real request from a fully-contextualized frame and acts
on it — without asking back** for read/research steps — then runs an
ingest-and-integrate pipeline so the artifact becomes durable knowledge + a
ranked next step, not a throwaway summary.
It is a **composition skill**: it fires existing research, search, and
note-taking tools in sequence; it does **not** reimplement them.
> **Portability.** The pipeline below is self-contained and works in any agent
> environment. It is most powerful inside a **bstack workspace** (broomva/bstack),
> where it composes with the `checkit` role/x **lens** (request-shape routing) and the
> bstack primitives named below (P15 snapshot, P6 proactive docs, P18 format).
> Outside bstack, treat the primitive names as the plain behaviors they describe
> — the full portable contract is bundled in
> [`references/checkit-lens.md`](references/checkit-lens.md).
## The one rule
> **Never ask "what do you want me to do with this?"** for read/research steps.
>
> The user shared the artifact *because* they didn't want to articulate the ask.
> Infer the intent, state it in one line, and execute. **Carve-out:**
> proceeding-on-inference covers *reversible, low-cost* steps; for
> costly/irreversible ones (an expensive multi-agent deep-research fan-out,
> mutating existing saved notes, filing a ticket) do the cheap version first and
> *surface the expensive option as a ranked next step* — you still never ask,
> you defer.
## Pipeline (what `/checkit <artifact>` does)
1. **Infer + declare intent** — one line: *"Reading this as: <inferred ask>
(artifact type: X; relevant to: <active work>)."* Then proceed.
- Use the artifact-type → intent taxonomy in
[`references/checkit-lens.md`](references/checkit-lens.md). Default for a
builder/researcher: *evaluate-against-our-stack*, not a neutral summary.
2. **Contextualize first** (bstack: P15 + knowledge-graph load) — snapshot what's
active (branch, open PRs, recent work) and **search existing notes/knowledge
for the topic before going external**. Surface what's already known.
*Knowledge-first prevents re-researching solved problems.*
3. **Deep research — traverse to the primitives.** Pick the engine by artifact
type (general web research / academic-paper search / single-page fetch), then
**read the primary source verbatim** — a WebFetch/search answer over a landing
page is *discovery* (it routes you to what to read), never the citation
source. Depth floor by type: **repo** → walk the full tree
(`gh api repos/<o>/<r>/git/trees/<ref>?recursive=1` or clone) and read the
canonical files (`SPEC.md` / `README` / key sources) verbatim; **docs site** →
follow the doc tree (many pages), not one; **paper** → read the
mechanism-bearing sections, not the abstract; **long file** → read it, not the
first screen;
**social-network link → use the validated path, do not improvise a pipeline.**
Two shapes, each with a dogfooded route:
- **Video** (YouTube / Shorts / TikTok / IG Reel / hosted mp4) → run the tested
tool, not a hand-rolled ffmpeg loop:
- `python3 scripts/video_ingest.py '<url>' --query '<the question you inferred>'`
+ `python3 scripts/video_ingest.py "$VIDEO_URL" --query "$VIDEO_Q"`
(from the broomva workspace; from any other cwd use the absolute
- `~/broomva/scripts/video_ingest.py`). **Single-quote the URL and the query** —
- both are untrusted external input, so a hostile link's shell metacharacters must
- never reach the shell unescaped (the script itself takes argv, `shell=False`). It
+ `~/broomva/scripts/video_ingest.py`). **Pass both through exported variables,
+ not inline text** — they are untrusted external input, and single-quoting is
+ necessary but NOT sufficient: one literal apostrophe in the URL closes the
+ quote and the rest becomes shell. The scripts take argv (`shell=False`), so
+ the only exposure is the command string you build to reach them. It
is BRO-1979 — self-degrading (scenedetect/imagehash optional → falls back to
ffmpeg + Pillow) and prints a JSON manifest to **stdout** (also written to
`<outdir>/manifest.json` — pass `--outdir DIR` to pin the location, else it's a
temp dir echoed as `manifest.outdir`). Then **Read `manifest.contact_sheet`** (ONE
cheap vision Read of the whole visual arc — title cards, diagrams, on-screen text
the audio skips), **Read `manifest.transcript_path` only when it is non-null**
(it's null for no-speech `frames-mandatory` clips — skip the Read then), and
follow `manifest.recommendation.mode`: `transcript-only` (speech-dense, no signal)
· `escalate-frames` (deixis / high scene-rate / on-screen text → Read the
- per-window frames) · `frames-mandatory` (no speech). For **login-gated** IG/FB,
+ per-window frames) · `frames-mandatory` (no speech).
+ **Escalation is a SECOND PASS, not a re-read of pass 1.** Add `--keep-video` to
+ the first run, then re-inspect the unresolved window by pointing pass 2 at the
+ file pass 1 kept:
+ `python3 scripts/video_ingest.py "$DIR/video.mp4" --outdir "$DIR2" --from 4:12
+ --to 4:20 --fps 8 [--zoom-audio]` → Read `manifest.contact_sheet`
+ (`zoom_sheet.jpg`).
+ A URL is **re-acquired** for pass 2, never adopted from the directory, so
+ re-running the URL costs a second download — and re-running it into the SAME
+ `--outdir` that still holds a kept `video.*` is refused outright, because
+ acquisition cannot tell a pre-existing file from its own download. Pointing at
+ the kept path avoids both: a path names its own bytes, so no provenance
+ question arises. Pass 2 keeps every frame (near-identical frames
+ 1/8s apart are the signal a zoom exists to show), writes to `zoom_frames/`
+ + `zoom_sheet.jpg`, and copies pass 1's manifest to `manifest.pass1.json`
+ (named in `previous_manifest`) since there is only one `manifest.json` per
+ outdir. A window into a subject the outdir does not already describe is
+ **refused** — use a fresh `--outdir`. A window past the end is clamped and
+ says so; failed decodes are counted, never dropped.
+ Use it whenever the question is *what exactly happens here* —
+ counting a fast action, reading a fast cut, watching a gesture — which
+ one-frame-per-visual-state sampling cannot answer by construction.
+ For **login-gated** IG/FB,
add `--cookies-from-browser chrome`, or drive Interceptor on real logged-in Chrome
(`interceptor open '<url>'`) — this reads *your own* local browser session to reach
*your own* gated content; the cookies stay local (video_ingest writes only the
manifest + frames — never logs or uploads them), so use it only on content you're
authorized to access. *If the
script is somehow absent*, the manual recipe it automates: yt-dlp acquire →
transcript-first → sample on *change* not a clock (`ffmpeg select='gt(scene,0.3)'`,
one frame per distinct visual state) → montage contact sheet → escalate only
unresolved windows; never uniform-poll per second (drowns talking heads,
aliases fast screencasts). Spec: `research/entities/pattern/adaptive-video-ingest.md`.
+ **Long video (>~20 min), or a visual claim you are about to tag `[HIGH]`** →
+ offload to Antigravity instead of pulling a large contact sheet into context:
+ `python3 scripts/video_agy.py "$VIDEO_URL" --question "$VIDEO_Q"`, with both
+ values exported by the harness rather than pasted into the command line.
+ **Single-quoting an untrusted URL is necessary but NOT sufficient** — one
+ literal apostrophe in it closes the quote and the rest becomes shell. The
+ scripts themselves take argv (`shell=False`), so the only exposure is the
+ command string you build to reach them; do not build one out of the
+ artifact's text. It drives
+ the local `agy` CLI, which decodes video natively via its `view_file` tool and
+ bills the **Antigravity subscription, not an API key** — the `gemini` CLI's free
+ tier is gone (`IneligibleTierError … migrate to the Antigravity suite`, measured
+ 2026-09-10 — that tier is **Gemini Code Assist for individuals**; enterprise
+ Code Assist licences and API-key auth are unaffected), so for an individual
+ account this is the only non-API route. It runs under `--mode plan`
+ and `--sandbox` by default because the URL is untrusted input — note the two
+ lines below for what those actually constrain; neither makes it read-only —
+ and it reports a
+ `NO_VIDEO_CAPABILITY` sentinel or a non-zero exit as an error, never as prose.
+ **It warns when `agy` has MCP servers enabled** and records them in
+ `result.json` as `mcp_servers`: those are reachable by an agent running with
+ permissions auto-approved on input a hostile page controls, and neither
+ `--mode plan` (which constrains *edits*) nor `--sandbox` (*terminal*
+ restrictions) is documented to gate an MCP tool call. `agy mcp disable <name>`
+ removes the exposure; `--refuse-mcp` blocks instead of warning.
+ Treat the `MECHANISM:` line as an honesty signal from a cooperative model, not
+ as proof it decoded anything — a model reconstructing from the page title can
+ claim `view_file` too.
+ **It is not a second witness on acquisition** — `agy` fetches with yt-dlp exactly
+ as we do, so it cross-checks frame *interpretation* only.
- **Thread / image post** (X/Twitter thread, IG photo post, FB) → text is only
half the artifact; **pull the pixels too** — a markdown extractor silently drops
the images (the modality gap). Browser-screenshot→Read + in-browser image fetch
(WebFetch 402s on x.com; agent-browser/Interceptor loads it, then fetch the
CDN-signed `og:image` in-session). Faster reads when you don't need the full
reply tree: twitterapi.io or FxTwitter (X, no login), Jina Reader
`x-with-generated-alt` (inline VLM image captions). Spec:
`research/entities/pattern/full-fidelity-content-ingest.md`.
**Verify every external URL** — hallucinated links are a
catastrophic failure. **Provenance honesty:** a `[HIGH]` tag names the
artifact *actually read* verbatim; a landing-page/search summary is `[MED]` at
most, labeled as a summary — never tag a claim "spec/repo-verified" against a
source you did not open. **Exhaustion check before filing:** "what canonical
material have I not opened?" (linked spec, referenced files, sub-pages, cited
sources). Scale depth to stakes, but never below reading the source's own
primitives.
4. **Analyze the sources** — extract the mechanism / claim / result. What's
novel? load-bearing? confirms or contradicts what you already knew? Tag every
external claim **HIGH / MED / LOW** confidence.
5. **Connect + enrich** — make ≥1 explicit link to existing knowledge. If the
artifact confirms or contradicts a prior note, say which (mutating an existing
note is gated by the costly/irreversible carve-out above).
6. **Document the finding** (bstack: P6 proactive bookkeeping) — write the note /
entity / summary **without asking permission**, then report what was filed in
one line. Provenance traces back to the artifact.
7. **Suggest next steps** — ranked and tied to active work:
build-vs-reuse decision · a follow-up research thread · a ticket · a doc. The
artifact must end up **metabolized into action**.
8. **Format for the reader** (bstack: P18) — markdown for knowledge substrate; a
richer human-read brief only when the finding is a decision artifact.
## Composition map
| Step | Composes (bstack-native names; generic behavior in parens) |
|---|---|
| Infer intent, no ask-back | the `checkit` role/x lens (P17) + persona context (who is asking) |
| Contextualize | P15 state snapshot + knowledge-graph load (search existing notes) |
| Deep research | a research/search skill (web / academic / fetch), depth-scaled |
| Analyze + tag confidence | source verification + HIGH/MED/LOW tagging |
| Connect + enrich | knowledge-graph edges (link to existing notes) |
| Document the finding | P6 proactive bookkeeping (file first, report after) |
| Next steps | goal-formation (turn gaps into ranked next actions) |
| Format | P18 format-follows-audience |
## Anti-rationalization
| Excuse | Reality |
|---|---|
| "It's vague — I should ask what they want." | The vagueness is intentional delegation. Infer + state + proceed. Asking is the failure this skill exists to kill. |
| "A quick summary is enough." | A summary evaporates. checkit produces durable notes + links + ranked next steps, or it didn't run. |
| "I'll research it but skip writing it down." | Research-without-integration leaves knowledge cold; next session re-solves it. Filing is not optional. |
| "Should I create a note for this?" | Never ask — file proactively, report after. |
| "I'll trust my training data on this repo/paper." | Verify with live research; training data is stale. Verify every URL. |
| "A WebFetch/search summary of the page is enough." | A summary is *discovery*, not the source. Traverse to the primitives — read the spec / README / key files / doc tree / paper sections verbatim before any `[HIGH]` claim. |
| "I confirmed the repo/page exists — that's verification." | Existence ≠ contents. `[HIGH]` requires reading the canonical text; a tag naming a source you didn't open is false provenance. |
| "This artifact isn't obviously about our work." | For a focused builder/researcher it almost always is — find the link to active work before defaulting to a neutral read. |
| "Let me just kick off the deep multi-agent run on this guess." | Costly/irreversible on an inference → surface it as a next step instead (the carve-out). |
## Scope
- **In scope**: any artifact (URL, repo, paper, file, image, pasted doc, or a
bare topic string) shared with an under-specified directive.
- **Out of scope**: fully-specified artifact asks (answer directly);
retrospective "what have I been doing repeatedly" (a discovery/look-back task).
## Validation (skill self-test)
A `/checkit` run is complete iff: an inferred-intent line appears **before** any
research and **no bounce-back question** was asked for read/research steps; any
costly/irreversible step was surfaced as a ranked next step (not run on a guess);
existing knowledge was searched first; **the primary source was traversed to its
primitives and read verbatim (not a landing-page/search summary), with every
`[HIGH]` claim tracing to that verbatim read**; deep research ran with every URL
verified; ≥1 link to existing knowledge was made; ≥1 finding was filed
proactively; and a ranked next-steps list ties the finding to active work. (Full
checklist: [`references/checkit-lens.md`](references/checkit-lens.md).)
## References
- [`references/checkit-lens.md`](references/checkit-lens.md) — the portable
no-ask-back contract, the artifact-type → intent taxonomy, the artifact-gate,
and the full procedure + self-test. Read this for the complete behavior.
- In a **bstack workspace**: the request-shape routing lens is `roles/checkit.md`
(a `status: candidate` lens — reached today via this skill + reasoning; auto-fire
pending the role-x phrase-scorer fix, BRO-1338);
the crystallization record is `research/entities/pattern/bstack-engine.md`
(§2026-06-02). checkit composes there with P15 / P6 / P17 / P18.