Skip to content

feat(intent): NIL Intent — the single model-facing payload (reads + writes)#60

Merged
Basheirkh merged 2 commits into
mainfrom
feat/nil-intent
Jun 26, 2026
Merged

feat(intent): NIL Intent — the single model-facing payload (reads + writes)#60
Basheirkh merged 2 commits into
mainfrom
feat/nil-intent

Conversation

@Basheirkh

Copy link
Copy Markdown
Contributor

The model emits ONE Intent {about, where[Binding], seek | change}; the system resolves+governs+executes deterministically and returns an Outcome. No tool selection, no filter built by the model, no keyword matching — universal at the contract level.

  • Reads: seek=the|all|count over the ReadPlane (IntentResolver, pluggable BindingResolver; IdentityResolver default).
  • Writes: change{op,set} → universal generic-CRUD (resource.*) via OP_TO_RESOURCE; update/remove resolve target by where then propose; governance unchanged (HIGH held, MEDIUM two-step).
  • Single nil_intent MCP tool (byte-cap backstop on reads).

Proven live on real Odoo: find دينا (read), create (executed id 55), remove (held HIGH for approval). 435 tests pass.

🤖 Generated with Claude Code

AI Bot and others added 2 commits June 26, 2026 17:43
The model emits ONE Intent {about, where[Binding], seek}; IntentResolver
deterministically maps it to a governed lean read over the ReadPlane and returns
an Outcome (result | structured refusal). No tool selection, no filter built by
the model, no keyword matching — the correct path is the only obvious one, so even
a weak model (Haiku) reliably handles "find Dina" under a vague prompt.

- dataplane/intent.py: Intent/Binding/Outcome, REL_TO_OP (fixed enum, not keywords),
  pluggable BindingResolver (graph supplies ontology; IdentityResolver default),
  IntentResolver for seek=the|all|count over the ReadPlane.
- MCP: single nil_intent tool (routes through the byte-cap backstop).

Proven live on real Odoo: nil_intent(about=res.partner, where=[name contains دينا],
seek=the) → the contact; vague "ابحث عن دينا" on Haiku now finds her via nil_intent.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… resource.*)

nil_intent now carries reads AND writes. A `change{op:create|update|remove, set}`
resolves deterministically through the UNIVERSAL generic-CRUD spine (resource.*) —
no adapter-specific verb map, no keyword matching: OP_TO_RESOURCE maps op→resource
verb; update/remove first resolve the target record(s) by `where` (a read), then
propose per record. Governance is unchanged — a change returns a PREVIEW the gate/
owner commits (HIGH held for approval, MEDIUM two-step).

So the model emits ONE payload for everything; the system resolves+governs+executes.

Proven live on real Odoo: create (executed, id 55) and remove (held HIGH for owner
approval) both via nil_intent(change=...). 435 tests pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Basheirkh Basheirkh merged commit 4b59555 into main Jun 26, 2026
4 of 5 checks passed
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