Repository navigation
Releases: davidteren/expectation-fit
Release list
v0.9.0: Expectation Fit (renamed from Intent Engineering)
Breaking
The plugin is renamed from intent-engineering to expectation-fit (#41). There is no /ie-* shim: after updating, the /ie-* commands are gone. Use the /fit-* names
from this table:
| Before (intent-engineering 0.8.x) | Now (expectation-fit 0.9.0) |
|---|---|
/ie-review |
/fit-review |
/ie-audit |
/fit-audit |
/ie-validate-plan |
/fit-validate-plan |
/ie-plan-assist |
/fit-plan-assist |
/ie-from-pr-learnings |
/fit-from-pr-learnings |
/ie-init |
/fit-setup |
ie-<lens>-reviewer agents |
fit-<lens>-reviewer agents |
intent-engineering@intent-engineering-marketplace |
expectation-fit@expectation-fit-marketplace |
.intense/ config folder |
.expectation-fit/ (legacy .intense/ still read through 0.9.x; removal planned for 1.0) |
INTENSE_CONFIG_DIR |
EXPECTATION_FIT_CONFIG_DIR (legacy variable still read through 0.9.x; removal planned for 1.0) |
| Reports in a tracked folder by default | Reports default to .expectation-fit/reports/ (git-ignored) |
Fixed
fit-reviewdefines empty, plan-only and docs-only diffs (#59). An empty diff
dispatches no lens (even one set toon) and still writes the normal report with a
"Nothing to review" line. Ready is never claimed while untracked files exist: the
verdict is Not ready, andmode:agentrepliesskippedwith the untracked count. With
no untracked files either, the report says "Nothing to review" andmode:agentreplies
skippedwith verdictnull.FILESnow comes from the head the
lenses read, so remote scopes see the right change. A plan-only diff hands off to one
fit-validate-planrun over all changed docs, which now accepts several paths as one
set with one report and one flow per document. A docs-only diff keeps the same lens team and adds a claim-check
line to the intent.- The
fit-reviewfix step applies only gated fixes and checks for copies (#60).
Stage 5 step 7 and the subagent-template apply rules say that observations are never
applied. Thefix(fit-review)commit and the Applied section hold only fixes that
passed the step 7 gate; callers commit other fixes separately. Before a fix that
replaces text, the step searches for other copies and reclassifies the fix to manual
when it cannot fix them all in the touched file. The shared rules tell lenses that a
fix which prints or runs untrusted text must say how it makes that text safe. New
refusal case inevals.json. - The merge stage lists every dropped finding and verifies before apply (#47). Coverage
has a Rejected list (title, file:line, lens, severity, confidence,why) in place of
counts by anchor, and a Re-grades log for every orchestrator change to severity or
confidence. Caller constraints limit whatfit-reviewfixes, never what it reports
(accepted_by_caller). Agreement between lenses no longer raises confidence, in the
skill and the Grok workflow. Dedup merges findings on one defect within 3 lines even
when titles differ, and keepsgated_autoonly when every copy has it. Interactive
fit-reviewre-reads each finding with a read-only sub-agent before it applies, and
evals.jsongains the refusal case. - Reports no longer look cleaner or more complete than the run was (#46). The Lens
status table inreferences/report-template.mdgives each word one meaning and adds
ok(ran, findings shown) next toclean(ran, no finding shown);skippednow means
only "selected but could not analyze", andnot_selectedcovers the rest. Both
runtimes setcleanorokafter the confidence gate. The all-clear line reads "No
findings surfaced in this pass", the Header names every catalog lens with a reason,
Coverage prints a READ line per lens and an optional Cost line, and a partial read
blocks the all-clear line and Ready.fit-reviewhands the diff to lenses as
$RUN/diff.patch.check-contracts.rbchecks that every Grok status word has a row. - Lens runs without subagents or file writes have rules, and reports show how lenses ran (#43).
references/subagent-template.mdnow names the agent to dispatch per lens
(expectation-fit:fit-<lens>-reviewer, or a general agent that reads the agent file),
forbids one agent for two lenses, defines a compact reply, covers hosts that forbid
file writes, and adds a single-agent fallback section that all three orchestrators use.
Convention and architecture lenses open observations withConfig: <source>. The
report Header carriesExecution: subagents | single-agent, and a lens whose returned
lensdiffers from the dispatched one fails. Newlenses:<list>token onfit-review,
fit-validate-planandfit-audit.check-contracts.rbties the template's agent
prefix to the plugin name inplugin.json. - Off-schema findings are repaired, not dropped, and mode:agent has a full example (#53).
The shared merge steps moved fromfit-reviewStage 5 into a new "Merge and gate"
section ofreferences/report-template.md, and all three orchestrators point there.
Step 1 now repairs word severities, off-anchor confidences, unknownfix_classvalues
andfile:linevalues, and Coverage lists each repair and drop. The template and every
lens agent list the allowed values. Themode:agentsection has a complete example,
field rules, and verdict words per context, and the reply stays raw JSON.base:now
works with a PR target. The config docs state that nested maps merge at every depth.
check-contracts.rbchecks the allowed values, the example fields thatfit-review
Stage 6 names, and that no skill cites afit-reviewStage for a shared rule.
Changed
- Renamed to Expectation Fit (#41). The plugin is now
expectation-fit(marketplace
expectation-fit-marketplace). Skills and agents use thefit-prefix:fit-review,
fit-audit,fit-validate-plan,fit-plan-assist,fit-from-pr-learnings, and
fit-setup(wasie-init). Project config moves to.expectation-fit/, and the env var to
EXPECTATION_FIT_CONFIG_DIR. The old.intense/folder andINTENSE_CONFIG_DIRstill
work for at least one release; Coverage names the legacy folder and/fit-setup upgrade
offers the move. The Grok runtime is now.grok/workflows/fit-review.rhai. Published
reports from before the rename stay indocs/intent-engineering/as history. - Run scratch and reports stay out of git by default (#42). The default report folder
is now.expectation-fit/reports/(wasdocs/expectation-fit/). Each run folder and
the default report folder get a one-line*.gitignore, so a run adds nothing to
git status. To keep committing reports, setartifacts.report_dir: docs/expectation-fit.
This repo's dogfood runs can passout:docs/intent-engineering/. Other contract
changes inconfig-resolution.md: relativerun_dir,report_dirandout:resolve
from the project base, and theReport:line prints an absolute path.fit-review
andfit-auditload config before they build their file lists and exclude the run,
report andout:folders by pathspec.mode:agentwrites a report file only with
out:(elseartifact_pathisnull), and cleanup runs after the report step. The
legacy single-bucket mode is gone: a top-levelreport_diris now an alias for
artifacts.report_dir, and/fit-setup upgradecarries it over./fit-setup
question 6 warns that reports under a publisheddocs/site are public. - Reports name the plugin copy and the reviewed commit (#45). Version is now 0.9.0 in
plugin.jsonandmarketplace.json, so installs leave the stale 0.8.0 cache; the
plugin README has an Upgrade section.report-template.mddefines oneProvenance:
line (plugin version and root, repo, branch, commit, dirty flag, run id) that every
review, audit and plan report carries, plus matchingmode:agentJSON keys. A
published report is a point-in-time record: later status goes in a dated addendum,
and Applied names the real fix SHA.completed_atcarries a UTC offset. Lens prompts
get the absolute plugin root through a{plugin_root}slot instead of a literal
variable. Lenses takelinefromgrep -nor a Read, and orchestrators check each
line against its evidence quote before dedup (unverified lines go to Coverage).
fit-reviewpinsREVIEWED_SHAandBASE_SHAin Stage 1, diffs remote scopes
against the pinned commit, treats the current branch aslocal-alignedwhen
origin/<branch>is an ancestor of HEAD, and skips apply when HEAD moved.
fit-auditshows commits ahead of the default branch;fit-validate-planwarns when
the checkout is behind its upstream. The Grok workflow resolves one absolute plugin
root (or pauses), and its report carries the Provenance andRuntime:lines. - Re-runs build on the last report (#52). New shared token
prior:<report-path>
(review, audit, validate-plan): the prior report'sfixedanddeclinedrows reach
every lens through one<prior>slot, and a Shared rule forbids re-raising them
without new evidence. Findings tables gain aStatuscolumn (open,fixed <sha>,
declined: <reason or link>), also as a JSONstatusfield; interactive
fit-reviewsets it at run time and never auto-applies a prior declined item. The
review verdict now follows severity (Not ready with an open P0/P1, Ready with fixes
with an open P2, else Ready; a failed lens still blocks Ready), andfit-reviewstops
re-running at Ready.base:<head_sha of the last report>is documented as the delta
re-review; a SHA that is not an ancestor of HEAD falls back to a full-branch review.
The canonical path block takes the raw scope and applies one slug rule, and each
out:row says to pass a folder.fit-validate-planstampsplan_sha256, shows lens
coverage in the verdict, and withprior:marks each prior gap closed or open...
v0.8.0
intent-engineering v0.8.0
Workspace-aware setup and CI-aligned conventions.
Highlights
/ie-initwizard — fresh | upgrade | calibrate; monolith vs multi-repo placement;auto.roots; capability questions/ie-from-pr-learnings— PR triage / pr: URLs → notes, sources, severity_overridesconventions.auto+ smell-firstseverity_align— discover Copilot / instructions / PR gates; lint rows are Coverage-note-onlypatterns.preferred— directional A-instead-of-B for new work
Checks
141 contract checks (12 sections).
Full notes: CHANGELOG.md
v0.7.0 — walk-up config, evals, UX smells, calibrate
What's new
Hardening + discoverability after 0.6.0 two-layer artifacts.
Fixed
- Config walk-up — nearest
.intense/from cwd (not only./.intense);config:<path>/INTENSE_CONFIG_DIR; Coverage always states Config source - Catalog-only stack selection — no Rails+Python hardcodes; Arch pack ✅ from stack-catalog only
- Apply safety — shared
fix_class/gated_auto; lens failed/skipped/clean honesty
Added
- Skill evals — per-skill
evals.jsonwith refusal cases; contract section 12 - Experience greppable smells —
ux-interaction-smells.md(#23 core; UI dogfood still open) ie-init calibrate— measure distributions; propose p90 thresholds with evidenceconventions.sources+ audit CI/conventions delta checklist- Ruby/Rails comment bar — YARD, succinct, only when valid
Changed
- Single-sourced orchestration paths; score keys on every lens; contract suite 138 checks / 12 sections
- Landing site + STATUS/READMEs updated for v0.7.0
Full notes: CHANGELOG.md
Install
/plugin marketplace add https://github.com/davidteren/intent-engineering
/plugin install intent-engineering
v0.5.0 — all six architecture packs dogfooded + external-tool deferral
A hardening release — no new stacks. Every architecture pack was dogfooded read-only on a real production app and tuned from the findings, and a new external-tool-deferral config lets a team already running a static-analysis tool avoid duplicate findings.
Dogfooded + tuned (each find→fix→fold on a real OSS app)
- Rails (Mastodon) — concern-tree resolution for fat-model;
service_object.max_locaxis fix. - Python (a FastAPI service) — MobX… no: layer-leak grep fix,
document_rendererpattern. - React (a MobX/Next app) — MobX recognition,
react.store.*budget, framework-idiom carve-outs. - Laravel (BookStack) — layout-agnostic path globs,
query_object/notificationpatterns. - Express (NodeBB) — CommonJS export counting,
api/-service recognition, project-local async-wrapper carve-out. - Phoenix (Plausible) —
from(x in Schema)precision, tieredRepo.preloadvs query-building.
The recurring lesson: smell definitions + the "confirm-don't-count" discipline held on every stack; recognition mechanics broke on each codebase's real conventions (MobX/Next, domain layouts, CommonJS/api/, from-as-function-name) — dogfooding caught all of it.
Added
- External-tool preference (
tools.architecture:enrich/prefer/report/off) — defer to reek/eslint/phpstan/credo instead of duplicating it; tool findings mapped to the findings schema. /ie-initopt-in for which lenses run + the tool preference.
Architecture stacks (6)
Rails · Python (FastAPI) · Laravel · Express · Phoenix · React
Full changelog: https://github.com/davidteren/intent-engineering/blob/main/CHANGELOG.md
v0.4.0 — Laravel + Express + Phoenix + React architecture stacks
Four new architecture stacks since v0.3.0 — Laravel, Express/Node, Phoenix/Elixir, and React — each authored research-first and added purely through the v0.3.0 stack registry (data + a catalog row, no lens/skill code changes). The architecture lens (5th lens) now covers six stacks.
Supported architecture stacks
- Rails · Python (FastAPI) · Laravel · Express/Node · Phoenix/Elixir · React
Added this release
- Laravel — 8 smells (fat-controller, fat-model, god-class, misused-service, query-in-view/N+1, logic-in-routes, fat-job, law-of-demeter) + 14-pattern catalog. Sources: Laravel best-practices canon, Laravel docs, laravel-actions, PSR-12.
- Express/Node — 8 smells (fat-route-handler, god-module, god-object, misused-service, layer-leak, fat-middleware, async-error-gap, law-of-demeter) + 12-pattern catalog. Sources: bulletproof-nodejs 3-layer, goldbergyoni nodebestpractices, Express docs, 12-factor.
- Phoenix/Elixir — 8 smells (fat-controller, context-bypass, god-context, fat-liveview, business-logic-in-changeset, god-module, process-misuse, law-of-demeter) + 11-pattern catalog. Sources: Phoenix Contexts guide, Elixir process/design anti-patterns, Ecto docs.
- React — 8 smells (god-component, logic-in-component, fat-hook, prop-drilling, effect-overuse, god-context, god-module, law-of-demeter) + 11-pattern catalog. Sources: React docs (You Might Not Need an Effect / hooks / context), patterns.dev, Martin Fowler.
Changed
- The architecture lens agent description is now stack-neutral (points at the registry) so it can't drift stale.
check-contracts.rb— 75 → 105 checks (cross-references + registry consistency now cover every stack automatically).
Notes
- Each new pack's live dogfood on a real repo is pending (tracked in STATUS).
Full changelog: https://github.com/davidteren/intent-engineering/blob/main/CHANGELOG.md
v0.3.0 — Python architecture stack + stack registry
The architecture lens (5th lens) now audits Python services in addition to Rails — FastAPI-first, but the structural checks apply to any layered Python service. A new stack registry makes every future language/framework a data-only addition.
Added
- Python architecture stack —
python-architecture.md(8 smells: fat-router, god-module, god-object, misused-service, business-logic-in-schema, fat-dependency, layer-leak, law-of-demeter) +python.yaml(13-pattern catalog) + apython.*threshold namespace. Dogfooded read-only on a real FastAPI service (healthy, near-zero false positives). - Stack registry (
references/stack-catalog.md) — one source of truth for stack detection + which packs each loads. The lens, the skills, and a stack-aware/ie-initread it, so adding a stack is two data files + a catalog row, not skill edits. - Stack-aware
/ie-init— scaffolds only the detected stack's threshold namespace + pattern policy.
Changed
check-contracts.rb— §8 cross-references generalized to every stack; new §10 enforces stack-registry consistency. 67 → 75 checks.
Roadmap
Queued architecture stacks (research-first, drop into the registry): PHP/Laravel (next), Express/Node, Elixir/Phoenix, React.
Full changelog: https://github.com/davidteren/intent-engineering/blob/main/CHANGELOG.md
v0.2.0 — first public release
First public release of intent-engineering — a Claude Code plugin that checks whether software behaves the way a reasonable developer or user already expects.
Highlights
- 5 review lenses — predictability, convention, simplicity, experience (universal) + architecture (Rails-only, code/audit). Parallel sub-agents → scored, deduplicated, confidence-gated findings with concrete fixes.
- 5 skills —
/ie-init,/ie-plan-assist,/ie-validate-plan,/ie-review,/ie-auditacross planning, plan validation, code review, and codebase audit. .intenseproject config — lens toggles, pattern policy, architecture thresholds (project overrides plugin defaults).- Rails architecture audit + a 14-pattern catalog (heuristic-first; optional reek/flog/brakeman enrichment).
- Researched knowledge base bundled in the plugin — principles, framework conventions, agnostic topics, each with violation-smell checklists and cited sources.
- Contract-integrity CI —
scripts/check-contracts.rb(67 checks) runs on every PR.
Install
```
/plugin marketplace add https://github.com/davidteren/intent-engineering
/plugin install intent-engineering
```
See CHANGELOG.md for the full list, README.md for the overview, and AGENTS.md for the contributor guide.
MIT licensed.
Announcement
Shipped intent-engineering — a Claude Code plugin that catches surprising code before it ships. Five review lenses (predictability, convention, simplicity, experience, architecture) run across planning, plan validation, code review & audit → scored findings, each naming the broken expectation with a concrete fix. Tunable per repo via .intense, MIT-licensed, with a 67-check contract test in CI.