Repository navigation
Ships
PROTOCOL_SPECv1.60.0 → v1.64.0. v1.60.0 is editorial (no behaviour change); v1.61.0
closes three ways a governance gate could silently stop gating (D-129–D-131); v1.62.0 corrects
about fifty places where the specification disagreed with three agreeing implementations (D-132); v1.63.0
aligns the three SDKs where they disagreed (D-133–D-152, #123). Reasoning is in
docs/spec/2026-09-divergence-decisions.md.
Added
- Public bare-name canonicalization in Python, TypeScript and Rust (Rust #40, specification 1.65.0).
canonicalize_name/canonicalizeNamereturns a canonical segment or a structured diagnostic with the original name. It repairs ASCII punctuation without changing A02, preserves existing underscores, and never silently removes Unicode, invents a digit-prefix repair, or truncates output. Shared fixturecanonicalize_name.jsoncontains 32 cases.
Security
- An ACL, approval handler or policy given to an executor did not reach a pre-built strategy's gates (D-129) — with a deny-all ACL the call ran while
governance_state()reported the gate as configured and wired. Providers are now bound into the running built-in gate however the strategy was supplied, andgovernance_state()reports what the gate holds. Fixturegate_provider_binding.json. pipeline.configurecould disable a governance gate (D-130) —ignore_errors: trueonacl_checkturned a denial into a warning.ignore_errors: trueandmatch_modulesonacl_check/approval_gate, andpure: trueonapproval_gate, are now rejected withPIPELINE_CONFIGURATION_ERROR. Fixturegate_step_configure.json.- Built-in logging middleware could write
x-sensitivevalues in plain text (D-131) — it now logscontext.redacted_inputs/redacted_output.
Changed — specification
-
The specification follows three agreeing, correct implementations (D-132, v1.62.0) — including MUSTs no SDK met: reserved words are checked on the first segment only and
__is allowed; entry-point failures raiseMODULE_LOAD_ERROR;APCORE_-prefixedenv_prefixvalues are allowed; unknown configuration keys are retained unless_config.strict; duplicate registration raisesDUPLICATE_MODULE_ID;after()output is not re-validated; timeouts wrapexecute()only;validate()must not invokeexecute(). No behaviour change. -
The three SDKs aligned where they disagreed (D-133–D-152, v1.63.0, #123). Breaking for callers relying on the old shapes: a timeout raises
MODULE_TIMEOUTimmediately and cancels the call's own child token (no grace period or forced termination);validate()reports every check; binding files reject unknown keys, one-sided schema pairs, invalidauto_schemaand every inference failure; themcpexport profile carriesrequires_approval/streamingin_meta; schema-validation errordetails.errorsitems are{path, keyword, message}with JSON-Pointer paths; only theapcorenamespace may use the exactAPCOREenv prefix and variables are dispatched to one namespace;id_map.overridesis a path;x-sensitiveis honoured insideanyOf/oneOf/allOf. Removed from the specification: theapcore.module.validatespan and config-file extension registration and chaining. -
A02 identifier conversion is ASCII-scoped and non-repairing (v1.64.0, #122). Existing underscores, including
__, are preserved; ASCII case boundaries are the only added underscores; out-of-alphabet input and a leading underscore are rejected rather than rewritten.snake_case_nameremains the separate repairing conversion for discovery class names.
Changed — documentation
- Cancellation guidance describes the call's own cooperative signal. Timeout signalling does not cancel the caller, undo LLM usage or charges, or choose application retry and compensation policy.
- Documentation describes the current product only. Implementation history, audit narrative and version-tagged notes were removed from the specification body, feature pages and guides; the reasoning stays in this changelog and the decision records, indexed by the new
docs/spec/decision-register.md. The specification's revision history is condensed to one line per version. - One source per topic.
DECLARATIVE_CONFIG_SPEC.mdand the implementedpreview()/ ephemeral-module RFCs are merged intoprotocol-spec.md; the execution-pipeline design document becomes the feature pagefeatures/execution-pipeline.md; the discovery TOCTOU assessment moves intosecurity-considerations.md; the observability page is split into tracing, metrics & usage, error history and redaction; the superseded v0.17 design document,site-map.md, the v0.18 migration guide and completedplanning/entries are removed. - Examples and config shown as working now work. Examples were checked against SDK 0.31.0 (constructors, arity, async); inert, deprecated or nonexistent configuration keys were removed from examples; the pipeline order (
middleware_beforebeforeinput_validation), the ACL file'saudit:block and the approval-gate trigger are stated consistently. - README is a landing page; versions are stated only on the documentation home; the documentation site URL is
https://apcore.aiperceivable.com/.
Fixed
- Schema-validation fixture paths use D-149's JSON Pointer wire shape. Required and additional-property violations point to their containing object, including the empty pointer for the root.
- The preflight-disclosure fixture follows D-134's collect-all contract. A denied caller with invalid inputs gets both ACL and schema failures; module-authored hooks, predicted changes and the disclosure sentinel remain withheld. Passed checks remain present after a schema failure.
Deprecated
middleware.disabledandextensions.auto_discover(D-137, D-150) — read by no implementation; declaring either warns once per load. Removed at v2.0.