# Factory Droid

Factory Droid and chock: install methods and steps, what it can enforce, and the evidence behind it.

Install methods: plugin, sync. Agentseam tier block, grade best-effort before a tool runs.

> Ask the user before running any command on this page: each one changes how their agent or repository behaves.

## Install methods

- Plugin: `chock install --client factory-droid` (ask the user before running it)
- Repo hooks: `chock sync --repo . --agents factory-droid` writes `.factory/hooks.json` (ask the user before running it)

## Install steps

### Factory Droid (factory-droid)

State: untested.

Evidence wanted for Factory Droid. Chock has not seen Factory Droid run the plugin yet. The command still builds the plugin. If you use Factory Droid, you can help: run it and share what happens in [agentseam issue #184](https://github.com/open-coder-ai/agentseam/issues/184).

The command (ask the user before running it: it builds a plugin of hooks that change how their agent behaves):

    chock install --selection <code> --client factory-droid

Then, in Factory Droid:

Run these from the root of the project the plugin is for: `--scope project` records it in that project's Droid settings. The marketplace is local to this machine; chock publishes nothing.

    droid plugin marketplace add ~/.chock/marketplace/factory-droid/chock-local

    droid plugin install chock-guardrails@chock-local --scope project

Droid names a local marketplace from its source; if `droid plugin marketplace list` shows a name other than chock-local (a --dest folder named otherwise), install chock-guardrails@<that name>. Droid copies the plugin into its cache: after a rebuild run `droid plugin marketplace update` and `droid plugin update chock-guardrails@chock-local --scope project`, then start a new session.

## What it can enforce

- Tier: block
- Grade before a tool runs: best-effort
- Fail mode before a tool runs: open
- Basis: vendor-docs
- Recorded: 2026-10-11

## Events

| Event | Can block | Can rewrite | Fail mode |
| --- | --- | --- | --- |
| pre_tool | yes | no | open |
| prompt_submit | yes | no | open |
| stop | yes | no | open |
| post_tool | no | no | open |
| session_start | no | no | open |
| session_end | no | no | open |
| pre_compact | no | no | open |
| subagent_stop | no | no | open |

## Ask support

Answers an ask with: deny. Honours ask: no. Evidence: tested (tests/test_guard_fail_to_ask.py::test_a_crashed_guard_asks_rather_than_allowing).

## Hook timeout

Default 60 seconds, set by the timeout field in s.

Vendor source: https://docs.factory.ai/reference/hooks-reference

## Test status

- Plugin (factory-droid): untested.
- Repo hooks: untested. A test of the plugin says nothing about repo hooks.
- No row in the engine's list of live tests for this agent.

## Known limits

Adapted (D2a): Droid's hooks speak the Claude Code dialect, and its payload carries the same keys as a Claude Code payload, including transcript_path and permission_mode, the markers agentseam uses to recognise Claude Code. A value separates them: every Droid payload carries permission_mode with one of Droid's own values (off, spec, auto-low, auto-medium, auto-high), which Claude Code never sends, so claude_code declines such a payload and factory_droid claims it (claims.accept_values). If a Droid build ever sent a Claude Code permission_mode value, the payload would read as claude_code again, whose deny Droid also honours. A deny is hookSpecificOutput.permissionDecision: deny at PreToolUse and decision: block at UserPromptSubmit and Stop. Escalate and transform degrade to a block: Droid's documented ask does not force a prompt in 0.238.0 (it falls through to the autonomy level's normal permission flow, which may auto-approve), and updatedInput is merged into the original input rather than replacing it, so a transform cannot remove a field. Shell policies see Execute; write policies see Create, Edit, MultiEdit and ApplyPatch, whose patch text is read as content but whose target path lives inside the patch and is not extracted. Install writes .factory/hooks.json keyed directly by event name, the documented project file; Droid snapshots hooks at startup, so a new hook applies to the next session. Fail mode is documented only for non-2 exits (fail-open); timeout and malformed-output behaviour are not documented. The Notification event is not mapped. Instruction files reach it through AGENTS.md. Evidence wanted (to test or overturn this row): https://github.com/open-coder-ai/agentseam/issues/184


---

Built from engine [5a4b6287a46e](https://github.com/open-coder-ai/chock/commit/5a4b6287a46e07f9f856d9bbe10622bd1ff2e021) and catalog [1e60d211c1bb](https://github.com/open-coder-ai/chock-catalog/commit/1e60d211c1bb767152c6ab0167932da06ab3a10f).
