@arturleao/pi-intent0.1.4
ICED for pi: one-line intent, a few questions, human sign-off, autonomous build, independent verification
Untested on omp
This is a pi package. No one has reported whether it works on omp yet. If you try it, add your result below.
Reports 0
No reports yet.
Readme
@arturleao/pi-intent: ICED for pi
ICED = Intent, Context, Expectations, Done. You say what you want in one line, answer a few questions, sign off on what "done" means, and the agent builds it on its own. Independent verifiers then try to prove the work is broken before you accept it.
This package is the pi extension. The protocol, contract handling and verification live in
@arturleao/iced-core, which knows nothing about pi.
ICED is derived from IDSD (Intent-Driven Software Development) by Kapil Viren Ahuja; the normative spec is
spec/SPEC.md in iced-core.
/iced add dark mode to settings
-> agent reads code, product memory, standards; drafts intent/004-add-dark-mode/iced.md
-> asks 0-5 high-risk questions
-> you sign off (goal, constraints, failure conditions, expectations, assumptions)
-> agent plans, decides and builds autonomously (logs decisions, escalates only when it must)
-> iced_submit: checks + independent verifiers -> evidence.md
-> you accept (or it auto-accepts at autonomy 2+)
Install
pi install npm:@arturleao/pi-intent
Then, in any repository:
/iced init # optional; the first /iced <request> offers to do it
/iced fix users getting logged out after 15 minutes
Step by step, including what to do when you request changes, reject a result or a unit gets blocked: Quick start.
What init sets up
| File | For |
|---|---|
.iced/config.json |
gate, autonomy, verify commands (auto-detects npm test, cargo test, go test, pytest), verifier models |
.iced/memory/product.md, knowledge.md |
product memory and standards (context sources) |
.iced/templates/*.md |
unit templates per type |
intent/README.md |
where units live |
.gitignore, .gitattributes lines |
keep .iced/active and .iced/tmp/ local; LF for unit files |
Re-running init is safe: it keeps .iced/config.json, memory and everything in intent/, refreshes the
templates, and never deletes anything. The protocol reaches the agent through the extension's tools and
system prompt, so there is nothing else to install per repository. Files written by older versions of this
package for other tools (copies under .iced/ such as bin/, lib/ and the protocol and rubric files, managed
blocks in agent instruction files, verifier agent definitions) are no longer used and can be deleted.
Updating
pi update --extensions
Then /reload in pi.
Commands
| Command | |
|---|---|
/iced <what you want> |
start a unit; bug:, feature:, project:, chore: prefixes optional (fix ... means bug) |
/iced child <parent> <line> |
a unit under a project; parent rules cascade |
/iced list, /iced status [id], /iced use <id | none> |
inspect, switch (none: set the unit aside and work outside ICED) |
/iced approve [id] |
sign off (the agent usually asks for you) |
/iced build [id] |
start or resume a build |
/iced accept [id], /iced reject [id] <reason> |
acceptance |
/iced abandon [id] |
drop a unit |
/iced review <id or what> |
read-only review |
/iced memory |
agent drafts .iced/memory from the repo |
/iced stats [apply] |
metrics and autonomy promotion |
/iced models [show] |
pick the verifier and test writer models and effort from your scoped models |
/iced models effort <level|clear> [test-writer] |
effort for models that don't set their own |
/iced autonomy <0-3> [id], /iced gate <strict|always|warn|off> |
settings |
You can also just ask in plain words: in an ICED repo the agent calls iced_start itself.
Agent tools: iced_start, iced_questions, iced_request_signoff, iced_build, iced_decision,
iced_escalate, iced_submit, iced_status. The extension tells the model to use these whenever it is loaded.
What is enforced
The gate applies while a unit is active: from /iced <request> until you accept, reject or abandon it, or run
/iced use none. With no active unit the agent works normally. Set "gate": "always" in .iced/config.json if
every code change in the repo must go through ICED.
- While a unit is active and not
building, code changes inside the repository are frozen at effective autonomy 0 and 1 (write, edit and shell commands that look like they change files are blocked). At autonomy 2 and 3 they go through with a notice; verification then checks them against the contract. Read-only commands,git add|commit|push|tag, stderr/temp redirects and work in other directories (sibling worktrees, temp dirs, other repos) are always fine. - The unit file's protected fields (status, autonomy, hashes, approvals) are never editable by agents.
- After sign-off, Intent and Expectations are frozen by
contract_hash; changes go throughiced_escalateand your edit. Context, Open questions, title, tier and risk stay editable. - Agents cannot approve or accept, or change the models that verify their work. In
.iced/config.jsonthe integrity keysgate,autonomy,maxAutonomy,autonomyByRisk,verify.model,verify.independent,verify.lenses,verify.maxAttemptsandbuild.testWriterModelare human-only; operational keys (verify.commands,verify.timeoutSec, memory paths, ...) may be edited by the agent when you ask. evidence.md,verify.json,.iced/activeand.iced/metrics.jsonlare written only by the tooling.- Gate mode
warnturns the code freeze into notices; the protections above still block in every mode exceptoff. - Every block names the agent's next step:
- frozen Intent/Expectations:
iced_escalate(change-expectation), or notes indecisions.md; - owned files (
evidence.md,verify.json,.icedstate):iced_submitfor evidence,iced_decisionfor decisions; - protected fields:
iced_request_signofffor sign-off,iced_decisionfor anything else; - config integrity keys: ask you for
/iced autonomy,/iced gateor/iced models; - shell writes to owned files: the edit tool for notes and operational config,
iced_submit,iced_decision; - code while
draft: finish the draft,iced_request_signoff; whileapproved:iced_buildor/iced build <id>; whileverifying/done:/iced accept <id>or/iced reject <id>; whileblocked:/iced build <id>(retry) or/iced reject <id>; review units:review.md; no active unit underalways:iced_start; - autonomy 0 without a UI or declined: notes in
decisions.md, then ask you (/iced autonomy 1 <id>); - verifier agents: read-only tools only (
read,grep,find,ls), then the verdict.
- frozen Intent/Expectations:
- A build that stops without submitting gets up to two nudges to finish or escalate.
- "Done" is decided by
verify.commands(run in parallel) plus independent verifiers: separate pi processes with fresh context and only read tools (read, grep, find, ls; no shell, no write or edit) that try to prove the work fails, using the code and the check results, including parent constraints. M/L/XL or high-risk units get three verifiers in parallel (expectations, breaking it, rules and scope); any failure from any of them fails the unit. Three failed attempts block the unit.
The shell check is a heuristic, not a sandbox; the verifier also reports every file changed since sign-off.
Autonomy
| Level | You do |
|---|---|
| 0 Assist | confirm each change and decision |
| 1 Gated (default) | sign off, accept |
| 2 Trusted | sign off; passing independent verification auto-accepts |
| 3 Autonomous | low-risk units also auto-approve; you are notified |
risk: high caps at 1. /iced stats suggests raising a risk level's default after promotion.window
clean units in a row; /iced stats apply applies it.
Configuration (.iced/config.json)
{
"gate": "strict",
"autonomy": 1,
"maxAutonomy": 3,
"questions": { "max": 5 },
"verify": {
"commands": ["npm run lint", "npm run typecheck", ["npm run build", "npm run test:e2e"]],
"parallel": true, "maxAttempts": 3, "independent": true,
"lenses": "auto", "timeoutSec": 900,
"model": ["anthropic/<model>:high", "openai/gpt-5.6"],
"effort": null
},
"build": { "testWriter": false, "testWriterModel": null, "testWriterEffort": null },
"memory": { "product": ".iced/memory/product.md", "knowledge": [".iced/memory/knowledge.md", "../org-standards/security.md"] },
"promotion": { "mode": "suggest", "window": 10 }
}
verify.commands: run in parallel; a nested list runs in order and stops at the first failure."parallel": falseruns everything in order.verify.lenses:auto(three parallel verifiers for M/L/XL or high risk, one otherwise),single,parallel, or a list ofexpectations,failures,rules.verify.model: pi model for the verifiers (provider/model), or a list rotated across them (for example two different vendors, so they don't share blind spots). A:levelsuffix sets the thinking level. Unset, verifiers use the session's model and thinking level. A comma-separated string is read as a list. Configs from older versions with an object per tool ({"pi": [...], ...}) still work: thepientry is used.verify.effort:off,minimal,low,medium,high,xhighormax, passed to pi as--thinkingwhen a model has no:level.build.testWriter: after sign-off, a separate pi agent that sees only the contract writes the tests first.memory.knowledge: may point outside the repo (shared enterprise standards).
Setting the models: /iced init asks once, offering your scoped models (/scoped-models, with their thinking
levels), a rotation of up to three, the session model, or a typed name. Change it later with /iced models.
Without a UI it pins the session model. "Don't pin" is remembered as an empty list, so init doesn't ask again.
In the terminal picker:
| Key | Does |
|---|---|
←/→ or shift+tab (pi's thinking key) |
cycle the highlighted model's effort: default, off, minimal ... max |
space |
add or remove the model from the rotation (up to three, in order) |
| letters | filter the list; esc clears the filter, then cancels |
enter |
choose the picked models, or the highlighted row |
On a rotation row the effort applies to all its models; on "Don't pin" it sets the effort used with the
session model. "default" means verify.effort, else the session's thinking level. In the VS Code panel
(RPC mode) custom pickers aren't available, so a plain list opens and then asks for the effort.
/iced models effort high sets the effort without opening the picker.
On Windows, checks and verifiers always start from an uppercase drive (D:\), even when pi runs from d:\,
because some tools (Vitest) crash otherwise.
Small to enterprise
Same file, more depth. A bug is one short unit (tier S). A feature adds product memory and a parent
(M). A project holds program-level constraints and failure conditions that every child inherits and the
verifier checks (L). A program spans projects and shared knowledge files (XL). See the worked examples in
iced-core's spec/examples.
More
License
MIT