intel
Report session provenance, work completed, and where agent sessions needed correction.
Skill by bllshttng
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/bllshttng-intel
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: documents, agent-building
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/intel
What's inside
- Skill name
intel- Description
- Report session provenance, work completed, and where agent sessions needed correction.
- License
- Apache-2.0
- Instructions
- 102 lines in SKILL.md · view on GitHub
Files (3)
- LIMITATIONS.md
- SKILL.md
- report-shape.md · references/
SKILL.md (first lines)
# intel
The fold counts. You judge. `fno-agents intel` classifies every user-shaped turn in this machine's transcripts by provenance (the fold's `operator` class, relay, harness, keepalive, unknown). It joins sessions to nodes, PRs, and mail. It counts tokens, lines, tool errors, languages, response time, hours, and overlapping sessions. Under `--scorecard` it also emits the per-model and per-lead block. Per model: issue rates with kind buckets. Per lead: restated asks, and returned complaints, which are nodes named before their closure and named again after. The block carries a coverage line and the unmeasured columns. It samples idle substantive sessions and computes per-category metrics from the facets. No model runs there. This skill is the judgment layer: you read the fold's sampled rows, judge each sampled session, cluster the summaries into categories, and write the narrative.
The one rule the whole report stands on: **user turns only**. Relay, harness, keepalive, and unknown turns are other agents and machinery talking, or turns no witness can name. They never inform satisfaction, friction, or corrections. The fold's counters tell you exactly what to ignore. The order of evidence is **events before transcripts**. Judge friction from the fold's `events` block first: its types are the journal's own (agent_spawn_refused, blocked, loop_check, operator_submit). Read `tool_errors` classes (command_failed, hook_blocked, user_rejected) beside them. Then read the witnessed turns to fill the gaps the events leave.
The fold names its populations, and the report keeps them apart. Every number says whether it rests on `scanned` sessions or on `judged` ones. No line blends the two.
## Steps
1. Run the fold once and save its JSON. Every report number and the categories post-process read this one file. Call shape:
```bash
/fno:intel [--scope <project>[,<project>...]|all] [--harness claude,codex,opencode|all] [--period 2w|1m|2m|3m|all] [--sample N|all] [question]
# or one node's story:
fno-agents intel --json --node <id>
```
(`fno doctor intel` is the same fold. The binary's full flag set, including `--session`, sits on `fno-agents intel`.) The period words map to `--days`. `1m` is the default and maps to 30 days. `2w` maps to 14 days, `2m` to 60, `3m` to 90. `all` removes the window (`--days 0`). Pass any other word nowhere: refuse it with the allowed list. The binary takes `--scope`'s meaning in two flags: `--scope all`, or no `--scope`, maps to `--all-projects` (the skill's default). Each comma entry of `--scope <project>` maps to one `--project <name>`. `--harness` passes through as `-H`. Every word after the flags is the user question. With no question, use `What were the user's sessions about, and where did they stall?`. The question key is the first 8 hex of sha256 over the question lowercased with runs of whitespace collapsed (`printf %s "$Q" | shasum -a 256 | cut -c1-8`). Default `--sample 50`. Run the fold once, under a 10-minute Bash timeout, and save its JSON beside the report. That file is the raw sidecar. Later steps read it, and any re-run of categories reads it:
```bash
fno-agents intel --json --period 1m --project fno --sample 50 > <vault>/fno/intel/<date>-<question key>.fold.json
```
The report's header quotes the fold's `scope` object, so the reader sees which harnesses and roots the fold read. Exit 3 means no sessions in the window. Report that and stop.
2. Judge the sampled sessions and write one facet file each: `~/.fno/intel/facets/<session>.json`, mode 0600. Judge only rows with `sampled: true`. They are idle and substantive by construction. Witnessed-turn sessions sample first, so the judged set reaches the conversations the user typed into. Judge only the turns a session row lists in `operator_turns`. Those are the witnessed turns. The fold's `sample.held_out_live` names live sessions with witnessed user turns the idle rule held out. The report carries that list as one line under the Sample heading. The `witness` receipt names the submits, the binds, and the sessions no submit row covers. Key the facet by session id + mtime + size (all three are on the fold's session row). A session whose key matches an existing facet is not re-judged. Skip it, so a resumed session re-enters the report instead of stranding on a stale cache. A matching facet that lacks the current question key gains only that one summary line:
```json
{
"key": {"session": "...", "mtime": 0, "size": 0},
"node": "x-...",
"goal": "one line: what the operator was driving at",
"outcome": "shipped | blocked | abandoned | research",
"satisfaction": "satisfied | mixed | frustrated",
"friction": "<category>",
"corrections": ["verbatim operator correction", "..."],
"summaries": {"<question key>": "one line, at most 30 words, that answers the question for this session"}
}
```
Friction categories (keep to this set so downstream scorers can key on it): `misunderstood_instruction`, `repeated_correction`, `wrong_assumption`, `missing_context`, `workflow_friction`, `tool_failure`.
3. Cluster the sampled sessions' summary lines into 3 to 8 categories that answer the question. Each category carries a name, a one-line description, and at most 5 optional subcategories. Every judged session goes into exactly one category. Use `Other` for a session that fit none. Write `~/.fno/intel/runs/<date>-<question key>.json`, mode 0600, in this schema:
```json
{"schema": 1, "question": "<text>", "question_key": "<8 hex>",
"categories": [{"name": "...", "description": "...", "sessions": ["<id>", "..."],
"subcategories": [{"name": "...", "description": "...", "sessions": ["<id>"]}]}],
"suggestions": [{"friction": "<category>", "cause": "one line naming the mechanism",
"example_sessions": ["<judged session id>", "..."],
"evidence": "one line citing the number",
"events": ["<event type proven by the fold's events block>", "..."],
"fix": {"kind": "law|hook|config|node", "target": "one line naming where",
"text": "the copy-ready artifact"},
"node": "x-...", "metric": "friction:<word>|tool_errors|interruptions|unanswered|undelivered|unjudged"}]}
```
After clustering, write one suggestion per material friction. The suggestion is the self-improvement loop. Name the cause in one line. Name every judged session that exhibited it clearly. The example sessions' facet friction must equal the suggestion's `friction`. Cite the evidence number. List the event types that prove it. Each must exist in the fold's `events` block, and the post-process stamps their counts with their `events_scope`. Counts are machine-global even on a project-scoped fold. Cite them only for machine-global claims. Name the fix as one of four kinds. The kinds: a law (`fno law` text), a hook row (the multi-CLI hook config), a config key, or a node. Write the fix `text` copy-ready, so a reader pastes it and it works. Before filing, check each suggestion against the active laws (`fno backlog decisions --lane law --state live`). A suggestion whose fix text or cause contradicts an active law is dropped. The report names the law id in its Suggestions section. For example, the 2026-10-02 /insights report suggested a preflight full-suite gate and rebase-before-review. Both contradict active laws. If filed, both ship as regressions. Every surviving suggestion carries an open backlog node. File one with `fno backlog idea "<fix>" --details "<cause + evidence>"` before writing the run file. Or match an open node that already carries the fix. The scored metric is one of the closed set above. Every metric is a count where lower is better. Pick the friction count (`friction:<word>`) unless a fold-wide count is the truer measure. Fold-wide counts: tool errors, interruptions, unanswered, undelivered, unjudged. If that run file exists and its question key and session set match this sample, reuse it.
4. Metrics: the post-process reads the run file and the saved fold JSON. It reads no transcript. It prints the judgment summary: every aggregate plus the categories block. The per-session rows are dropped, so the file stays small, and the raw rows already live in the sidecar. The run file's suggestions are validated and baseline-stamped into a `suggestions` block:
```bash
fno-agents intel --categories <run file> --fold <vault>/fno/intel/<date>-<question key>.fold.json > <vault>/fno/intel/<date>-<question key>.json
```
On exit 2, fix the run file from the named reason and run it once more. If it fails again, keep the raw sidecar as the report's `fold:` file and write the Categories and Suggestions sections as `not written: <stderr line>`. On the next run over the same question, find the prior report's saved JSON. It is the newest file matching `<question key>` before this run's date. Pass it as `--score-prior <prior json>`. The post-process reads the prior report's stamped suggestions. It adds a `scorecard` block printing `moved`, `unchanged`, `worse`, or `unmeasured` per metric. Quote it in the report's Scorecard section. A first run writes the section as `not written: first run, no prior report`.
5. Write the report: `<vault>/fno/intel/<date>-<question key>.md`, where `<vault>/fno/` is the directory `fno do plan path` resolves beside `plans/`. Sections: [references/report-shape.md](references/report-shape.md). Every number comes from the JSON named in the frontmatter `fold:` field. When step 4 failed, `fold:` names the raw sidecar. Otherwise it names the judgment summary. A run that passed `--scorecard` carries the By model and by lead section. Compare models only within a kind bucket, and print the block's `unmeasured` columns verbatim.
6. Corrections section: quote user corrections verbatim, dedupe across sessions, rank by repeat count. Each correction sits on its own line ending with ` #agent-correction` and carrying `signal=<friction category>`. When the correction is about how one fno command behaves, the line also carries `skill=<name>`, that command's skills/ directory. Each one is a candidate AGENTS.md line, a law, or a SKILL.md diff. Say which in the report.
7. Feed the S2 writer so the rows land in `~/.fno/logs/corrections.log`:
```bash
bash scripts/corrections-insights-tag.sh --insights-file <report>
```
The script is watermark-idempotent: a second run adds no rows.
8. Relay section: computed from the raw sidecar's `relay` facets and the summary's `nodes` rows. The judgment summary drops session rows, so per-session relay facets read from the sidecar. No model judgment: delivery, answers, contract breaches, and silences are facts.
9. Render the shareable HTML copy. Run:
```bash
fno-agents intel --render <report.md>
```
Its stdout line is the HTML path. The renderer reads the report and the fold JSON named in the frontmatter `fold:` field. It scrubs secrets, home paths, quoted blocks, and quotes outside `Operator corrections`, and draws the fold counters as inline SVG. End the run by telling the user both paths, one line each: `Report: <md path>` and `Shareable copy: <html path> (open in a browser; print to PDF; latest.html beside it is always the newest)`. A nonzero exit is relayed with its stderr line. The markdown report stands either way: it stays the file every later step reads.
Judgment runs on this session's own model. No profile, no spawned reviewer, no Python shim. The fold is Rust (`fno-agents intel`), the narrative is you, and the S2 writer is the script that already existed.
## Known Limitations and Deferred Work
- Mail turns classify as relay, never as the `operator` class (the delivered-header fix, PR 2989). `operator`-turn counts are witnessed turns only. Judge them against the events block and the relay facets.
- User is witnessed, not inferred. When a person presses Enter in a pane or portal, the mux writes an `operator_submit` row. The fold binds turns to those rows. A turn outside the witness reads `unknown`, never `operator`. Uncovered paths: a bare terminal, the desktop apps, and claude.ai jobs. That typing never passes the mux. A hand-started harness in a shell pane writes `resolution: unresolved`, and nothing joins it. A submit queued past the 30s bind window also reads unknown. The `witness.unwitnessed_sessions` receipt counts sessions typed outside the witness.
- The relay delivered-check is a substring read: a bus body that appears verbatim in the transcript through some other channel reads as delivered even if the mail never landed in this session's turn flow.
- Opencode sessions are folded now. Their `operator` class is the same witness join as claude's (the fold binds opencode turns to `operator_submit` rows by `harness_session`). Subagent child sessions carry a `parent_id` and are excluded. When no store is readable, `skipped.opencode` names the reason.
- Full list: [LIMITATIONS.md](LIMITATIONS.md).From bllshttng/fno, Apache-2.0.
More from bllshttng/fno
- 0.597score
setup
bllshttng
Set up a machine for Footnote by launching the interactive setup wizard and reading its report.
SkillAFreshness: A★ 2Claude Code +9 - 0.597score
execute
bllshttng
Execute an approved plan in a flat run or coordinated waves.
SkillAFreshness: A★ 2Claude Code +9 - 0.597score
fix
bllshttng
Fix build failures and red tests, or investigate an error with an evidence-based loop.
SkillAFreshness: A★ 2Claude Code +9 - 0.597score
lead
bllshttng
Lead a backlog territory over time or run one governed planning wave.
SkillAFreshness: A★ 2Claude Code +9 - 0.597score
mail
bllshttng
Read, send, reply to, and manage Footnote agent mail from any session.
SkillAFreshness: A★ 2Claude Code +9 - 0.597score
review
bllshttng
Review recent code changes, check if they are ready to ship, or assess a research brief.
SkillAFreshness: A★ 2Claude Code +9 - 0.593score
autocorrect
bllshttng
Review corrections, triage proposed patches, and audit the agent self-improvement loop.
SkillAFreshness: A★ 2Claude Code +9 - 0.592score
dnd
bllshttng
Hold incoming agent mail during a quiet window, then deliver one digest.
SkillAFreshness: A★ 2Claude Code +9 - 0.592score
cache-keepalive
bllshttng
Keep the prompt cache warm during idle sessions when the project opts in.
SkillAFreshness: A★ 2Claude Code +9 - 0.592score
groom
bllshttng
Apply the daily allowlisted grooming levers to the backlog and report changes.
SkillAFreshness: A★ 2Claude Code +9 - 0.592score
harness-commands
bllshttng
Show the safe native command roster before using harness-specific commands.
SkillAFreshness: A★ 2Claude Code +9 - 0.592score
growth-launch
bllshttng
Draft and evaluate a growth campaign bundle, then stop at founder approval.
SkillAFreshness: A★ 2Claude Code +9
Signals
- Stars
- 2
- Forks
- 0
- Open issues
- 1
- Last commit (this folder)
- Oct 21, 2026 (8 days ago)
- Last release
- Oct 23, 2026 (6 days ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- Apache-2.0
- Repository
- github.com/bllshttng/fno
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from bllshttng
- 0.597score
execute
bllshttng
Execute an approved plan in a flat run or coordinated waves.
SkillAFreshness: A★ 2Claude Code +9 - 0.597score
fix
bllshttng
Fix build failures and red tests, or investigate an error with an evidence-based loop.
SkillAFreshness: A★ 2Claude Code +9 - 0.597score
lead
bllshttng
Lead a backlog territory over time or run one governed planning wave.
SkillAFreshness: A★ 2Claude Code +9 - 0.597score
mail
bllshttng
Read, send, reply to, and manage Footnote agent mail from any session.
SkillAFreshness: A★ 2Claude Code +9 - 0.597score
review
bllshttng
Review recent code changes, check if they are ready to ship, or assess a research brief.
SkillAFreshness: A★ 2Claude Code +9 - 0.597score
setup
bllshttng
Set up a machine for Footnote by launching the interactive setup wizard and reading its report.
SkillAFreshness: A★ 2Claude Code +9
Cite this page
intel skill. Agent Mart. https://agentmart.dev/skills/bllshttng-intel (last updated 2026-10-24)