Skip to content

Model the two layers this project shipped and did not model - #52

Merged
junixlabs merged 2 commits into
mainfrom
model-its-own-new-behaviour
Sep 11, 2026
Merged

junixlabs merged 2 commits into
mainfrom
model-its-own-new-behaviour

Conversation

@junixlabs

Copy link
Copy Markdown
Owner

v0.2 added Intent provenance and Outcome verification to the engine, the specification,
the reference digest, both skills and the explorer — and to no Flow. A project that
documents a capability everywhere except in the model it keeps of itself has demonstrated
the failure it sells a cure for.

Why nothing caught it

INV-023 requires a changed file to map to a Node. traceos/engine.py was already mapped,
by assertions about impact, coverage and observe. Adding validate_intents and
validate_outcome_verification to that file satisfied the ratchet completely while the
behaviour existed nowhere in the graph.

Decay did not cover it either, and for a reason worth writing down: now that decay is
symbol-granular, a symbol nobody cites cannot go stale. The precision that removed
93% of spurious decay also removed the accidental coverage a whole-file hash used to give
— the same trade as #44's, one level up. Filed as #51, and §13.0 now says outright that
INV-023 answers file membership, not behavioural coverage, so a reader stops mistaking
one for the other.

The correction

flow.account — cite the record, check that it still resolves, run the check an outcome
declares, record a refutation. Three assertions, nine evidence references, all observed:

assert.account.intent-is-provenance an Intent is checked by whether its record resolves, never by whether its sentence is true
assert.account.outcome-declares-its-check an outcome with no check reads differently from a checked one, everywhere it is reported
assert.account.refuted-is-an-error a refuted outcome takes integrity to INVALID, because the model is wrong rather than stale

It is a separate flow rather than nodes bolted onto flow.reconcile, because
reconciliation compares the model against the code and this compares a behaviour against
the decision that asked for it and against what happened. Folding them together would
have buried the one step where evidence can say the model is wrong.

The flow's own Intent section records why it was nearly not modelled at all — the model
of the project carries the account of its own lapse rather than a tidy version.

State of the self-model

before after
flows 5 6
assertions 13 16
confirmed 12 15
evidence locators resolving 38/38 47/47
engine or test files unmapped 0 0

The one remaining uncertain assertion is assert.implement.not-ours, and it should be:
implementation is explicitly not this project's, so the flow modelling it is a declared
stub. flow.implement is also the one flow with no Intent, reported at info — which is
the correct reading rather than a gap to paper over.

39/39 groups, 185/185 assertions, check_docs 28/28, ratchet exit 0.

@junixlabs
junixlabs merged commit bcccc5e into main Sep 11, 2026
9 checks passed
@junixlabs
junixlabs deleted the model-its-own-new-behaviour branch September 11, 2026 18:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant