v0.8.0
Read the model in plain language, and compare against thresholds honestly: any scope of the behavior model now projects to a "what happens here" summary over MCP, and rules gained inclusive >= / <= comparisons.
Added
get_digest: the plain-language digest is now an MCP tool. The "what happens here" summary the dashboard renders at the top of its inspector — the things you can do here with their guards, the guardrails that always hold, and where you can navigate next — was previously dashboard-only.get_digestexposes the same projection to an agent for any scope:projectId(one clickable line per feature),featureId(a whole feature),+surfaceId(one surface), or+surfaceId+actionId(a single action).detailLevelgates depth (glance|standard|full), andformatreturns either the structuredDigestSpec(each line carries the id of the model element it was derived from, so a caller can jump straight to it) or serialized Markdown ready to paste into a pull request or README;hasContentisfalsewhen the scope has no behavior to summarize. The prose is derived deterministically from the model — each action's intent, its block-rule reasons as guards, its effects and emitted events, invariant messages, transition labels — never LLM-generated, so it can never describe behavior that is not in the spec. Thin orchestration over the existing digest projector and Markdown exporter, so the MCP surface and the dashboard always describe behavior identically.- Inclusive comparison operators
>=and<=(greater_or_equal/lower_or_equal). Rules, invariants, and scenario assertions can now say "at least" / "at most" directly instead of forcing a strictgreater_than/lower_thanwith an off-by-one literal likegreater_than 19to mean>= 20— a trick that made specs lie slightly about intent. Wired end to end: the operator union and labels, the condition evaluator (numeric and ISO-date), the scenario assertion enum, scenario test codegen (toBeGreaterThanOrEqual/toBeLessThanOrEqual), the rule and scenario MCP tools, and the operations reference. UI operator dropdowns pick them up automatically.
Changed
get_spec_gapsstops crying wolf, and catches an inert declaration it used to miss. The "no effects" gap no longer fires on an action whose behavior lives entirely in rule-carried effects (every Rule has a required effect) or inonBlockedEffects— correct actions were being flagged as incomplete. In exchange it gains an honest new recommended gap: an action that declaresemittedEventswhich noemit_eventeffect actually fires, so the declaration is inert at runtime (no cascade ortriggeredByEventhandler runs). The operations resource now also documents the evaluation semantics the diagnostics assume (sequential effects, derived recompute after each, surface-rules-before-action-rules, block suppression, post-cascade assertions).