Skip to content

Releases: davidteren/expectation-fit

v0.9.0: Expectation Fit (renamed from Intent Engineering)

Choose a tag to compare

@davidteren davidteren released this 13 Oct 14:30
3dd80d5

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-review defines empty, plan-only and docs-only diffs (#59). An empty diff
    dispatches no lens (even one set to on) 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, and mode:agent replies skipped with the untracked count. With
    no untracked files either, the report says "Nothing to review" and mode:agent replies
    skipped with verdict null. FILES now comes from the head the
    lenses read, so remote scopes see the right change. A plan-only diff hands off to one
    fit-validate-plan run 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-review fix 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. The fix(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 in evals.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 what fit-review fixes, 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 keeps gated_auto only when every copy has it. Interactive
    fit-review re-reads each finding with a read-only sub-agent before it applies, and
    evals.json gains the refusal case.
  • Reports no longer look cleaner or more complete than the run was (#46). The Lens
    status table in references/report-template.md gives each word one meaning and adds
    ok (ran, findings shown) next to clean (ran, no finding shown); skipped now means
    only "selected but could not analyze", and not_selected covers the rest. Both
    runtimes set clean or ok after 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-review hands the diff to lenses as
    $RUN/diff.patch. check-contracts.rb checks 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.md now 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 with Config: <source>. The
    report Header carries Execution: subagents | single-agent, and a lens whose returned
    lens differs from the dispatched one fails. New lenses:<list> token on fit-review,
    fit-validate-plan and fit-audit. check-contracts.rb ties the template's agent
    prefix to the plugin name in plugin.json.
  • Off-schema findings are repaired, not dropped, and mode:agent has a full example (#53).
    The shared merge steps moved from fit-review Stage 5 into a new "Merge and gate"
    section of references/report-template.md, and all three orchestrators point there.
    Step 1 now repairs word severities, off-anchor confidences, unknown fix_class values
    and file:line values, and Coverage lists each repair and drop. The template and every
    lens agent list the allowed values. The mode:agent section 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.rb checks the allowed values, the example fields that fit-review
    Stage 6 names, and that no skill cites a fit-review Stage for a shared rule.

Changed

  • Renamed to Expectation Fit (#41). The plugin is now expectation-fit (marketplace
    expectation-fit-marketplace). Skills and agents use the fit- prefix: fit-review,
    fit-audit, fit-validate-plan, fit-plan-assist, fit-from-pr-learnings, and
    fit-setup (was ie-init). Project config moves to .expectation-fit/, and the env var to
    EXPECTATION_FIT_CONFIG_DIR. The old .intense/ folder and INTENSE_CONFIG_DIR still
    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 in docs/intent-engineering/ as history.
  • Run scratch and reports stay out of git by default (#42). The default report folder
    is now .expectation-fit/reports/ (was docs/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, set artifacts.report_dir: docs/expectation-fit.
    This repo's dogfood runs can pass out:docs/intent-engineering/. Other contract
    changes in config-resolution.md: relative run_dir, report_dir and out: resolve
    from the project base, and the Report: line prints an absolute path. fit-review
    and fit-audit load config before they build their file lists and exclude the run,
    report and out: folders by pathspec. mode:agent writes a report file only with
    out: (else artifact_path is null), and cleanup runs after the report step. The
    legacy single-bucket mode is gone: a top-level report_dir is now an alias for
    artifacts.report_dir, and /fit-setup upgrade carries it over. /fit-setup
    question 6 warns that reports under a published docs/ site are public.
  • Reports name the plugin copy and the reviewed commit (#45). Version is now 0.9.0 in
    plugin.json and marketplace.json, so installs leave the stale 0.8.0 cache; the
    plugin README has an Upgrade section. report-template.md defines one Provenance:
    line (plugin version and root, repo, branch, commit, dirty flag, run id) that every
    review, audit and plan report carries, plus matching mode:agent JSON 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_at carries a UTC offset. Lens prompts
    get the absolute plugin root through a {plugin_root} slot instead of a literal
    variable. Lenses take line from grep -n or a Read, and orchestrators check each
    line against its evidence quote before dedup (unverified lines go to Coverage).
    fit-review pins REVIEWED_SHA and BASE_SHA in Stage 1, diffs remote scopes
    against the pinned commit, treats the current branch as local-aligned when
    origin/<branch> is an ancestor of HEAD, and skips apply when HEAD moved.
    fit-audit shows commits ahead of the default branch; fit-validate-plan warns when
    the checkout is behind its upstream. The Grok workflow resolves one absolute plugin
    root (or pauses), and its report carries the Provenance and Runtime: lines.
  • Re-runs build on the last report (#52). New shared token prior:<report-path>
    (review, audit, validate-plan): the prior report's fixed and declined rows reach
    every lens through one <prior> slot, and a Shared rule forbids re-raising them
    without new evidence. Findings tables gain a Status column (open, fixed <sha>,
    declined: <reason or link>), also as a JSON status field; interactive
    fit-review sets 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), and fit-review stops
    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-plan stamps plan_sha256, shows lens
    coverage in the verdict, and with prior: marks each prior gap closed or open...
Read more

v0.8.0

Choose a tag to compare

@davidteren davidteren released this 13 Oct 14:30
23767f4

intent-engineering v0.8.0

Workspace-aware setup and CI-aligned conventions.

Highlights

  • /ie-init wizard — fresh | upgrade | calibrate; monolith vs multi-repo placement; auto.roots; capability questions
  • /ie-from-pr-learnings — PR triage / pr: URLs → notes, sources, severity_overrides
  • conventions.auto + smell-first severity_align — discover Copilot / instructions / PR gates; lint rows are Coverage-note-only
  • patterns.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

Choose a tag to compare

@davidteren davidteren released this 13 Oct 14:30
b1a84ce

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.json with 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 evidence
  • conventions.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

Site: https://davidteren.github.io/intent-engineering/

v0.5.0 — all six architecture packs dogfooded + external-tool deferral

Choose a tag to compare

@davidteren davidteren released this 13 Oct 14:30
33579bb

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_loc axis fix.
  • Python (a FastAPI service) — MobX… no: layer-leak grep fix, document_renderer pattern.
  • React (a MobX/Next app) — MobX recognition, react.store.* budget, framework-idiom carve-outs.
  • Laravel (BookStack) — layout-agnostic path globs, query_object/notification patterns.
  • Express (NodeBB) — CommonJS export counting, api/-service recognition, project-local async-wrapper carve-out.
  • Phoenix (Plausible) — from(x in Schema) precision, tiered Repo.preload vs 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-init opt-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

Choose a tag to compare

@davidteren davidteren released this 13 Oct 14:30
259fa2e

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

Choose a tag to compare

@davidteren davidteren released this 13 Oct 14:29
34ae7fa

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) + a python.* 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-init read 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

Choose a tag to compare

@davidteren davidteren released this 13 Oct 14:29

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-audit across planning, plan validation, code review, and codebase audit.
  • .intense project 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.

→ https://github.com/davidteren/intent-engineering