File harness friction observed in an interactive session — capture only, never implement
Scanned 9/2/2026
Install to Claude Code
npx -y skills add watt-mind/factory --skill factory-friction --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Factory Friction?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/watt-mind-factory-friction)More formats (shields.io, HTML) on the badges page.
---
name: factory-friction
description: File harness friction observed in an interactive session — capture only, never implement
---
# factory-friction
The user's accompanying request is this workflow's argument string. Wherever these instructions refer to `$ARGUMENTS`, interpret it as that request.
Capture harness friction from an interactive session where no orchestrator transcript exists.
Runs dispatched through `runners/run-agent.sh` or `orchestrator/tick.mjs` already write JSONL to `~/.factory/logs/` — `/factory-retro` measures those mechanically via `factory friction`. This command is the **backstop** when you ran `/factory-work`, `/factory-merge`, `/factory-ticket`, `/factory-ship`, or similar **directly** in a harness (Claude, Codex, Pi, Cursor) without `FACTORY_RUN_ID` set.
## 1. When to use
- At the end of an interactive factory command session (also invoked inline from those commands' closing step).
- Ad hoc when a session was painful and you want it recorded before context is lost.
- **Skip** when `FACTORY_RUN_ID` is set — the transcript is the primary sensor; don't duplicate it with memory.
## 2. What qualifies
Same bar as `docs/friction-log.md` — only two things:
**Repeats or likely repeats.** A tool error you hit twice, a retry loop (same command 3+ times), the same floor violation recovered from more than once in the session (`sleep` waits, unquoted zsh globs, wrong Linear label names, missing `FACTORY_ROOT`).
**Per-ticket costs that could be paid once.** The same expensive setup on every ticket in a batch, a harness gap that blocked every subagent (slash command not installed, MCP missing, worktree script absent).
**Do not file:** one-off ticket bugs (those go to product `Triage` via `/factory-capture`), product intent questions, vague annoyances with no actionable harness layer, or anything that is already that ticket's problem rather than the harness's.
## 3. Scan the session
`$ARGUMENTS` names specific friction if given; otherwise scan the conversation for qualifying items. If more than one distinct friction surfaced, file each separately — don't merge unrelated shapes into one issue.
## 4. Search before filing
Search Linear (`factory ticket` or `docs/protocol.md` §13) for:
- Existing `FIP:` issues describing the same shape
- Prior issues whose body contains `## Session friction` with the same **Shape**
- Entries in `docs/friction-log.md` (`F-*`) already tracking it
Comment on the existing issue with new evidence instead of filing a duplicate. Link the originating command session in one line.
## 5. Route
| Finding | Destination |
| :----------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------- |
| Factory-wide harness fix (floor, orchestrator, emit, shared commands) | team `OPS`, `Triage`, title prefixed `FIP:` |
| Repo-specific friction (scripts, AGENTS.md, `.env.example`, CI workflow) | that repo's team from `config/repos.yaml`, `Triage` |
| Already tracked in `docs/friction-log.md` | comment on the matching `F-*` Linear issue if one exists; otherwise file and cross-reference the log entry |
Standing in the factory checkout (`config/repos.yaml` → `factory` → team `OPS`). In a product repo, route repo friction to that repo's team, not OPS.
## 6. Issue body format
Every filed friction issue includes this block (fill every field):
```markdown
## Session friction
- **Harness:** cursor | pi | claude | codex | agy
- **Command:** factory-work | factory-merge | factory-ticket | factory-ship | (other)
- **Shape:** <normalised failure pattern — no paths, ids, or ticket-specific detail>
- **Evidence:** <what happened in this session, 2–4 sentences>
- **Suggested layer:** floor | script | repo AGENTS.md | orchestrator | shared command
- **Repeat:** yes | likely | one-off (one-off usually means don't file — say so in the report instead)
```
Factory-wide items: prefix the title with `FIP:`. Do not write the full §5 agent-ready template — friction starts in `Triage` until `/factory-retro` validates repeat frequency across sessions or transcripts.
## 7. Label and file
- **`source:agent`** — observed while doing factory work (default here)
- **`type:maintenance`**
- **`area:*`** — `area:factory` for OPS/FIP items; match the repo's area labels for product-repo friction
- **State:** `Triage` only — never `Todo` + `ai:agent-ready` from this command
Use `factory ticket file ...` from a worktree.
## 8. Report
List each issue filed (ID + URL) or state **none observed — session below friction bar** with one line on why. If you commented on an existing issue instead of filing, report that too.
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!