docs(adr): resolve Agency + Tool-use scope decisions (ADR-0017, ADR-0018)
Pins the two open scope decisions that the capability roadmap
(ADR-0016) tagged "Before Phase 3". Both are resolved with explicit
ADRs and PROGRESS.md is updated to reflect.
ADR-0017 - Agency: responsive-with-axiology
- Turn boundary stays responsive (no autonomous initiative, no
background agent loop, no inter-turn processes).
- IdentityManifold value axes become load-bearing for articulator
candidate selection (within a single turn). Goal-directedness
lives inside the turn, not across turns.
- Replay determinism is the load-bearing constraint that rules
out pure agentic loops.
- Rejects pure-responsive (would relegate identity to read-only)
and pure-agentic (would break trace_hash replay contract).
ADR-0018 - Tool use: typed deterministic operators
- Operators are pure functions over CORE's typed state. No
external IO at this stage (no shells, network, external models).
- Operator registry is curated, small, ADR-gated; no plug-in
surface, no dynamic loading.
- Operators participate in trace_hash so replay stays bit-stable.
- Initial operator set lands in Phase 3 v2: transitive_walk over
proposition graph + path_recall over vault. Closes Gap 1 + Gap 2
from the inference-closure / multi-step-reasoning / compositionality
/ cross-domain-transfer v1 findings.
- Rules out: generic plugin protocols, LLM-as-judge, approximate
retrieval, anything that breaks the exact-CGA / replay
contracts in CLAUDE.md.
Future extensions recorded but explicitly deferred: calculator
(Phase 4+), document retrieval over content-addressed packs,
metaphor / narrative / writing-style operators (downstream of
cross-domain-transfer literal case working).
This unblocks Phase 3 v2 engineering. Next: the transitive_walk +
path_recall bundle as a single bounded PR per ADR-0018, plus the
trace_hash extension to fold operator invocation records.
This commit is contained in:
parent
819c8b81ac
commit
2177492646
3 changed files with 272 additions and 2 deletions
|
|
@ -406,7 +406,7 @@ engineering above.
|
||||||
|
|
||||||
| Decision | Status | Deadline |
|
| Decision | Status | Deadline |
|
||||||
|----------|--------|----------|
|
|----------|--------|----------|
|
||||||
| Agency (responsive vs. goal-directed) | Open | Before Phase 3 |
|
| Agency (responsive vs. goal-directed) | **Resolved 2026-05-16 — ADR-0017** (responsive-with-axiology) | Before Phase 3 ✓ |
|
||||||
| Tool use (typed deterministic operators) | Open | Before Phase 3 |
|
| Tool use (typed deterministic operators) | **Resolved 2026-05-16 — ADR-0018** (typed deterministic operators, no external IO) | Before Phase 3 ✓ |
|
||||||
| Code generation (first-class target) | Open | Before Phase 5 |
|
| Code generation (first-class target) | Open | Before Phase 5 |
|
||||||
| Embodiment (sensorium gates) | Open | Phase 5 |
|
| Embodiment (sensorium gates) | Open | Phase 5 |
|
||||||
|
|
|
||||||
119
docs/decisions/ADR-0017-agency-scope.md
Normal file
119
docs/decisions/ADR-0017-agency-scope.md
Normal file
|
|
@ -0,0 +1,119 @@
|
||||||
|
# ADR-0017 — Agency Scope: Responsive-with-Axiology
|
||||||
|
|
||||||
|
**Status:** Accepted
|
||||||
|
**Date:** 2026-05-16
|
||||||
|
**Authors:** Joshua Shay
|
||||||
|
**Supersedes:** Open Scope Decisions row "Agency (responsive vs. goal-directed)"
|
||||||
|
in `docs/PROGRESS.md`.
|
||||||
|
|
||||||
|
## Context
|
||||||
|
|
||||||
|
The capability roadmap (ADR-0016) flagged *agency* as an open scope
|
||||||
|
decision required before Phase 3 engineering begins. Two extreme
|
||||||
|
positions are available:
|
||||||
|
|
||||||
|
- **Pure responsive.** The system processes one input per turn and
|
||||||
|
produces one output. No internal aims, no autonomous initiative.
|
||||||
|
This is what `CognitiveTurnPipeline.run(text)` is today.
|
||||||
|
- **Pure agentic.** The system maintains internal goals, plans
|
||||||
|
trajectories that pursue those goals across many turns, and may
|
||||||
|
initiate actions outside of user-triggered input. Each goal-step
|
||||||
|
can in principle invoke the system without external prompting.
|
||||||
|
|
||||||
|
A choice between these endpoints shapes how Phase 3 reasoning-depth
|
||||||
|
work is structured. The transitive-walk and path-recall operators
|
||||||
|
the inference-closure lane requires can be implemented either way,
|
||||||
|
but their semantics differ: the agentic reading makes them part of
|
||||||
|
an internal planner that runs across turns; the responsive reading
|
||||||
|
makes them per-turn deterministic functions invoked by the
|
||||||
|
articulator.
|
||||||
|
|
||||||
|
## Decision
|
||||||
|
|
||||||
|
CORE is **responsive-with-axiology**:
|
||||||
|
|
||||||
|
1. **Responsive turn boundary preserved.** Every cognitive turn is
|
||||||
|
triggered by an external input: a user utterance, a CLI invocation,
|
||||||
|
or an explicit replay command. The system never initiates a turn
|
||||||
|
autonomously. No background agent loop runs between turns.
|
||||||
|
|
||||||
|
2. **Axiology is first-class within the turn.** The
|
||||||
|
`IdentityManifold` and its `ValueAxis` set are not decorative
|
||||||
|
identity-decoration; they are the value gradient against which
|
||||||
|
the articulator chooses among candidate articulation surfaces.
|
||||||
|
When the proposition-graph planner produces multiple valid
|
||||||
|
completions, the choice is the one that scores highest against
|
||||||
|
the manifold's value axes. This is goal-directedness *within* a
|
||||||
|
single responsive turn, not across turns.
|
||||||
|
|
||||||
|
3. **No autonomous initiative.** The system has no `loop()` or
|
||||||
|
`pursue(goal)` entry point. Anything that looks like long-horizon
|
||||||
|
pursuit is a sequence of responsive turns chained by the calling
|
||||||
|
layer, not an internal process.
|
||||||
|
|
||||||
|
4. **Replay determinism is the load-bearing constraint.** The
|
||||||
|
responsive-with-axiology shape is preserved partly because pure
|
||||||
|
agentic loops break deterministic replay: the trace_hash contract
|
||||||
|
in `core/cognition/trace.py` assumes a turn is a deterministic
|
||||||
|
function of (input, prior-state). Adding non-input-triggered
|
||||||
|
internal actions would put state changes between turns that
|
||||||
|
replay cannot reconstruct.
|
||||||
|
|
||||||
|
## Consequences
|
||||||
|
|
||||||
|
- **Phase 3 v2 engineering shape.** The transitive-walk and path-
|
||||||
|
recall operators (Gap 1 and Gap 2 in
|
||||||
|
`evals/inference_closure/gaps.md`) are **per-turn deterministic
|
||||||
|
functions**, not background processes. They are invoked
|
||||||
|
synchronously by the articulator during a single turn. No turn-
|
||||||
|
spanning planner is required to close the Phase 3 inference-depth
|
||||||
|
lanes.
|
||||||
|
|
||||||
|
- **IdentityManifold axes become load-bearing.** Today the axes are
|
||||||
|
partially decorative (the empirical investigation in commit
|
||||||
|
`86ef117` showed `identity_score.alignment = 1.0` universally
|
||||||
|
because no candidate-selection step actually consults them).
|
||||||
|
Under this ADR, the next refinement of articulator candidate
|
||||||
|
selection should consult the axes. This is also the
|
||||||
|
load-bearing path to making fix #3 of the adversarial-identity
|
||||||
|
defense work geometrically.
|
||||||
|
|
||||||
|
- **No goal-stack data structure.** CORE will not gain a
|
||||||
|
`Goal`, `Plan`, or `Pursuit` typed object as part of Phase 3.
|
||||||
|
Anything that looks like a multi-step goal is the user explicitly
|
||||||
|
asking for multiple responsive turns.
|
||||||
|
|
||||||
|
- **Self-explanation remains responsive.** The forthcoming
|
||||||
|
`core/cognition/explain.py` module (Gap 3 in
|
||||||
|
`evals/introspection/gaps.md`) is invoked on a turn-id; it does
|
||||||
|
not introspect autonomously.
|
||||||
|
|
||||||
|
- **Persona / character work is axiology-side, not agency-side.**
|
||||||
|
`persona/motor.py` shapes articulation output within the
|
||||||
|
responsive turn. It does not run between turns.
|
||||||
|
|
||||||
|
## Rejected alternatives
|
||||||
|
|
||||||
|
- **Pure responsive (no axiology).** Rejected because the
|
||||||
|
`IdentityManifold` already exists as an architectural commitment
|
||||||
|
(ADR-0010) and the adversarial-identity defense work explicitly
|
||||||
|
depends on axes being able to *shape* behaviour, not just be
|
||||||
|
measured. Pure responsive would relegate identity to read-only
|
||||||
|
evidence, which conflicts with ADR-0010's "identity is
|
||||||
|
inalienable" claim.
|
||||||
|
|
||||||
|
- **Pure agentic.** Rejected because it breaks the deterministic
|
||||||
|
replay contract. CORE's value proposition over frontier models is
|
||||||
|
partly that any turn can be replayed bit-for-bit; an autonomous
|
||||||
|
inter-turn process makes that contract unenforceable. Also
|
||||||
|
rejected on philosophical grounds: agency as autonomous pursuit
|
||||||
|
is not what CORE claims to be. CORE is a deterministic cognitive
|
||||||
|
engine, not an autonomous agent.
|
||||||
|
|
||||||
|
## Verification
|
||||||
|
|
||||||
|
- Phase 3 v2 work on Gaps 1+2 is scoped as per-turn deterministic
|
||||||
|
operators (see ADR-0018).
|
||||||
|
- No new turn-spanning processes are introduced in Phase 3.
|
||||||
|
- Replay determinism contracts in `tests/test_determinism_proofs.py`
|
||||||
|
continue to pass for all multi-turn scenarios.
|
||||||
151
docs/decisions/ADR-0018-tool-use-scope.md
Normal file
151
docs/decisions/ADR-0018-tool-use-scope.md
Normal file
|
|
@ -0,0 +1,151 @@
|
||||||
|
# ADR-0018 — Tool Use Scope: Typed Deterministic Operators
|
||||||
|
|
||||||
|
**Status:** Accepted
|
||||||
|
**Date:** 2026-05-16
|
||||||
|
**Authors:** Joshua Shay
|
||||||
|
**Supersedes:** Open Scope Decisions row "Tool use (typed deterministic
|
||||||
|
operators)" in `docs/PROGRESS.md`.
|
||||||
|
**Depends on:** ADR-0017 (Agency Scope).
|
||||||
|
|
||||||
|
## Context
|
||||||
|
|
||||||
|
ADR-0016 flagged *tool use* as an open scope decision required
|
||||||
|
before Phase 3. The capability roadmap (Phase 3 work items) notes
|
||||||
|
that multi-step reasoning *may* benefit from operator delegation
|
||||||
|
(`docs/capability_roadmap.md`). Phase 3 v1 evidence
|
||||||
|
(`evals/inference_closure/gaps.md` Gap 1 + Gap 2,
|
||||||
|
`evals/multi_step_reasoning/gaps.md`) confirms this: closing the
|
||||||
|
inference-depth gaps requires a `transitive_walk` operator over the
|
||||||
|
proposition graph and a `path_recall` operator over the vault.
|
||||||
|
|
||||||
|
The question is what shape such operators take in CORE. Three
|
||||||
|
positions are available:
|
||||||
|
|
||||||
|
- **No tools.** Reasoning depth is implemented inline in the
|
||||||
|
articulator and field-propagate machinery. No first-class
|
||||||
|
operator surface.
|
||||||
|
- **External tools.** CORE invokes external services (calculator,
|
||||||
|
search, code execution, shell) through a generic tool-use
|
||||||
|
protocol.
|
||||||
|
- **Typed deterministic operators.** CORE exposes a small,
|
||||||
|
curated set of pure-function operators over its own typed state
|
||||||
|
(proposition graph, vault, field state). No external IO. Each
|
||||||
|
operator is invoked synchronously inside a responsive turn (per
|
||||||
|
ADR-0017).
|
||||||
|
|
||||||
|
## Decision
|
||||||
|
|
||||||
|
CORE adopts **typed deterministic operators**:
|
||||||
|
|
||||||
|
1. **Operators are pure functions over CORE's typed state.** Each
|
||||||
|
operator takes typed inputs (proposition-graph nodes, vault
|
||||||
|
entries, field versors, relation predicates) and returns typed
|
||||||
|
outputs. No side effects beyond the per-turn deterministic
|
||||||
|
record.
|
||||||
|
|
||||||
|
2. **No external IO at this stage.** CORE will not invoke shells,
|
||||||
|
network endpoints, file IO outside the existing pack/vault
|
||||||
|
contracts, or other models. External tool integration is
|
||||||
|
deferred to a later phase and would require its own ADR.
|
||||||
|
|
||||||
|
3. **Operator registry is curated and small.** Adding an operator
|
||||||
|
is a deliberate design act with an ADR-level decision. No
|
||||||
|
plug-in surface; no dynamic operator loading; no caller-supplied
|
||||||
|
operators. The deterministic-replay contract requires the
|
||||||
|
operator set to be a fixed, versioned part of the build.
|
||||||
|
|
||||||
|
4. **Operators participate in trace_hash.** When an operator is
|
||||||
|
invoked during a turn, its name, inputs, and outputs are folded
|
||||||
|
into `trace_hash` so replay is bit-for-bit reproducible. This
|
||||||
|
is the mechanical guarantee that makes operators safe to add.
|
||||||
|
|
||||||
|
5. **Operators are invoked by the articulator inside one turn.**
|
||||||
|
Per ADR-0017, no operator runs autonomously between turns. The
|
||||||
|
articulator decides whether to invoke an operator based on the
|
||||||
|
intent classification and proposition-graph shape produced for
|
||||||
|
the current turn.
|
||||||
|
|
||||||
|
## Initial operator set (Phase 3 v2)
|
||||||
|
|
||||||
|
Two operators land together as the bounded Phase 3 v2 engineering
|
||||||
|
work that closes inference-closure Gap 1 + Gap 2:
|
||||||
|
|
||||||
|
- **`transitive_walk(graph, head, relation, max_hops) ->
|
||||||
|
list[Node]`**
|
||||||
|
Deterministic traversal of the proposition graph from `head`
|
||||||
|
following only edges labeled `relation`. Returns the path of
|
||||||
|
visited nodes. Bounded by `max_hops` (initial cap: 5; see
|
||||||
|
`evals/multi_step_reasoning/contract.md`). No approximate
|
||||||
|
search. Empty path is a valid result.
|
||||||
|
|
||||||
|
- **`path_recall(vault, entity, relation_chain) ->
|
||||||
|
list[VaultEntry]`**
|
||||||
|
Returns vault entries that participate in the named relation
|
||||||
|
chain starting from `entity`. Uses the existing exact-CGA
|
||||||
|
inner product for entity matching; no approximate / HNSW /
|
||||||
|
ANN substitution permitted (per CLAUDE.md).
|
||||||
|
|
||||||
|
Both operators are pure functions with no global state. Both
|
||||||
|
produce outputs that are themselves addressable in the proposition
|
||||||
|
graph and vault, so their results round-trip through the existing
|
||||||
|
pipeline.
|
||||||
|
|
||||||
|
## What this rules out
|
||||||
|
|
||||||
|
- **Generic plugin protocols (MCP-style).** CORE does not become a
|
||||||
|
host for external tools. The strict typing and replay-determinism
|
||||||
|
contracts forbid arbitrary capability surfaces.
|
||||||
|
- **LLM-as-judge / LLM-as-tool patterns.** No operator may call out
|
||||||
|
to a stochastic model.
|
||||||
|
- **Approximate retrieval / search operators.** Per CLAUDE.md
|
||||||
|
("Vault recall is exact and deterministic. Do not add cosine
|
||||||
|
similarity, HNSW, ANN indexes, or approximate recall to the
|
||||||
|
runtime path."), search-shaped operators must remain exact.
|
||||||
|
|
||||||
|
## Consequences
|
||||||
|
|
||||||
|
- **Phase 3 v2 has a well-defined shape.** The two-operator bundle
|
||||||
|
above is the unit of engineering work. It is small, testable,
|
||||||
|
and replay-safe by design.
|
||||||
|
- **Operator-aware trace hashing.** `core/cognition/trace.py` will
|
||||||
|
need a small extension to fold operator invocation records into
|
||||||
|
the hash. This is one of the bounded design tasks inside the
|
||||||
|
Phase 3 v2 work.
|
||||||
|
- **Articulator gains an operator-call site.** `generate/realizer.py`
|
||||||
|
and/or `generate/graph_planner.py` learn to decide *whether* to
|
||||||
|
invoke an operator based on intent + graph shape. This decision
|
||||||
|
itself is deterministic — no learned policy.
|
||||||
|
- **No operator-registry hot path.** Operator lookup is at the
|
||||||
|
import-time level, not the per-turn level. The operator set is
|
||||||
|
effectively part of the build.
|
||||||
|
|
||||||
|
## Future extensions (recorded so they're not forgotten)
|
||||||
|
|
||||||
|
When (and if) external IO becomes scoped:
|
||||||
|
|
||||||
|
- **Calculator** (pure-function over typed numerics) is the
|
||||||
|
cleanest first external operator candidate. Still typed,
|
||||||
|
still deterministic, no network. Probably Phase 4 or later.
|
||||||
|
- **Document retrieval** over curated packs (not the open web)
|
||||||
|
could become typed if the corpus is content-addressed and the
|
||||||
|
result is bit-stable.
|
||||||
|
- **Search / code execution / shell** are out of scope for the
|
||||||
|
foreseeable future. They break replay determinism and the
|
||||||
|
trust-boundary discipline in CLAUDE.md.
|
||||||
|
|
||||||
|
Metaphor, narrative, and writing-style work (raised in 2026-05-16
|
||||||
|
session, recorded in `evals/compositionality/gaps.md` and
|
||||||
|
`evals/cross_domain_transfer/gaps.md`) live under this ADR's
|
||||||
|
operator umbrella if they ever land: a metaphor operator is a
|
||||||
|
typed deterministic function over the proposition graph plus a
|
||||||
|
selectivity filter, not an external capability.
|
||||||
|
|
||||||
|
## Verification
|
||||||
|
|
||||||
|
- The two Phase 3 v2 operators land with unit tests showing
|
||||||
|
replay-bit-stability.
|
||||||
|
- `trace_hash` extension passes determinism tests in
|
||||||
|
`tests/test_determinism_proofs.py`.
|
||||||
|
- All inference-closure / multi-step-reasoning / compositionality /
|
||||||
|
cross-domain-transfer lanes are re-scored after the operator
|
||||||
|
bundle lands.
|
||||||
Loading…
Reference in a new issue