ai-capability-framework 1.0.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +37 -0
- package/CONTRIBUTING.md +56 -0
- package/LICENSE +21 -0
- package/README.md +198 -0
- package/SECURITY.md +29 -0
- package/conformance/invalid/duplicate/capabilities/conformance.duplicate.one.yaml +55 -0
- package/conformance/invalid/duplicate/capabilities/conformance.duplicate.two.yaml +55 -0
- package/conformance/invalid/eval-results/conformance.results.failing.json +15 -0
- package/conformance/invalid/missing-reference/capabilities/conformance.missing_reference.prepare.yaml +58 -0
- package/conformance/invalid/schema/capabilities/conformance.invalid.missing_required.yaml +3 -0
- package/conformance/valid/capabilities/conformance.note.get.yaml +82 -0
- package/conformance/valid/decisions/conformance.note.get.denied_missing_permission.json +13 -0
- package/conformance/valid/entities/Note.yaml +18 -0
- package/conformance/valid/eval-results/conformance.results.passing.json +19 -0
- package/conformance/valid/evals/conformance.note.get.valid.yaml +33 -0
- package/conformance/valid/openai/context.no_permissions.json +6 -0
- package/dist/adapter-common.d.ts +62 -0
- package/dist/adapter-common.d.ts.map +1 -0
- package/dist/adapter-common.js +453 -0
- package/dist/ai-sdk.d.ts +5 -0
- package/dist/ai-sdk.d.ts.map +1 -0
- package/dist/ai-sdk.js +71 -0
- package/dist/anthropic-claude.d.ts +5 -0
- package/dist/anthropic-claude.d.ts.map +1 -0
- package/dist/anthropic-claude.js +62 -0
- package/dist/cli.d.ts +11 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +360 -0
- package/dist/decision.d.ts +6 -0
- package/dist/decision.d.ts.map +1 -0
- package/dist/decision.js +237 -0
- package/dist/eval-runner.d.ts +6 -0
- package/dist/eval-runner.d.ts.map +1 -0
- package/dist/eval-runner.js +372 -0
- package/dist/gemini.d.ts +5 -0
- package/dist/gemini.d.ts.map +1 -0
- package/dist/gemini.js +64 -0
- package/dist/generated/manifest-types.d.ts +208 -0
- package/dist/generated/manifest-types.d.ts.map +1 -0
- package/dist/generated/manifest-types.js +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/langchain.d.ts +5 -0
- package/dist/langchain.d.ts.map +1 -0
- package/dist/langchain.js +65 -0
- package/dist/loader.d.ts +4 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +94 -0
- package/dist/mcp.d.ts +5 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +82 -0
- package/dist/openai-responses.d.ts +6 -0
- package/dist/openai-responses.d.ts.map +1 -0
- package/dist/openai-responses.js +65 -0
- package/dist/registry.d.ts +6 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +134 -0
- package/dist/semantic-kernel.d.ts +5 -0
- package/dist/semantic-kernel.d.ts.map +1 -0
- package/dist/semantic-kernel.js +79 -0
- package/dist/types.d.ts +400 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +1 -0
- package/dist/validator.d.ts +3 -0
- package/dist/validator.d.ts.map +1 -0
- package/dist/validator.js +105 -0
- package/docs/adapter-roadmap.md +179 -0
- package/docs/adapters.md +112 -0
- package/docs/api.md +115 -0
- package/docs/capability-manifests.md +47 -0
- package/docs/control-plane.md +59 -0
- package/docs/eval-runner.md +80 -0
- package/docs/evals.md +34 -0
- package/docs/getting-started.md +51 -0
- package/docs/host-responsibilities.md +23 -0
- package/docs/interoperability.md +32 -0
- package/docs/migration-0.1-to-1.0.md +22 -0
- package/docs/openai-responses.md +103 -0
- package/docs/release.md +75 -0
- package/docs/spec.md +194 -0
- package/examples/eval-results/public.results.passing.json +128 -0
- package/examples/scheduling/capabilities/scheduling.availability.get.yaml +91 -0
- package/examples/scheduling/capabilities/scheduling.invite.prepare.yaml +114 -0
- package/examples/scheduling/capabilities/scheduling.invite.send.yaml +97 -0
- package/examples/scheduling/decisions/scheduling.availability.get.select.json +14 -0
- package/examples/scheduling/decisions/scheduling.invite.prepare.allowed.json +20 -0
- package/examples/scheduling/decisions/scheduling.invite.send.allowed.json +22 -0
- package/examples/scheduling/decisions/scheduling.invite.send.denied_missing_approval.json +18 -0
- package/examples/scheduling/entities/AvailabilitySlot.yaml +26 -0
- package/examples/scheduling/entities/MeetingInvite.yaml +25 -0
- package/examples/scheduling/eval-results/scheduling.results.passing.json +59 -0
- package/examples/scheduling/evals/scheduling.availability.get.valid.yaml +38 -0
- package/examples/scheduling/evals/scheduling.invite.prepare.valid.yaml +44 -0
- package/examples/scheduling/evals/scheduling.invite.send.requires_approval.yaml +43 -0
- package/examples/scheduling/openai/context.scheduler.json +6 -0
- package/examples/support/capabilities/support.refund.commit_case.yaml +98 -0
- package/examples/support/capabilities/support.refund.prepare_case.yaml +116 -0
- package/examples/support/capabilities/support.ticket.get.yaml +85 -0
- package/examples/support/decisions/support.refund.commit_case.allowed.json +22 -0
- package/examples/support/decisions/support.refund.commit_case.denied_missing_approval.json +18 -0
- package/examples/support/decisions/support.refund.prepare_case.approval_required.json +19 -0
- package/examples/support/decisions/support.ticket.get.select.json +0 -0
- package/examples/support/entities/Order.yaml +23 -0
- package/examples/support/entities/Ticket.yaml +25 -0
- package/examples/support/eval-results/support.results.passing.json +68 -0
- package/examples/support/evals/support.refund.commit_case.requires_approval.yaml +42 -0
- package/examples/support/evals/support.refund.prepare_case.approval_required.yaml +45 -0
- package/examples/support/evals/support.refund.prepare_case.valid.yaml +43 -0
- package/examples/support/openai/context.support_agent.json +9 -0
- package/package.json +74 -0
- package/schemas/capability-manifest.schema.json +250 -0
- package/schemas/entity-manifest.schema.json +97 -0
- package/schemas/eval-case.schema.json +134 -0
- package/schemas/eval-result.schema.json +77 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable public changes to AI Capability Framework are documented here.
|
|
4
|
+
|
|
5
|
+
## 1.0.0-rc.1 - 2026-06-03
|
|
6
|
+
|
|
7
|
+
1.0 spec-complete release candidate.
|
|
8
|
+
|
|
9
|
+
- Promoted public manifests and eval result fixtures to
|
|
10
|
+
`schema_version: "1.0"`.
|
|
11
|
+
- Made the spec normative and explicit about the no-execution boundary.
|
|
12
|
+
- Added migration, host responsibility, and interoperability guidance.
|
|
13
|
+
- Added a second synthetic domain and conformance fixtures for external review.
|
|
14
|
+
- Added no-model-call adapters for Anthropic Claude, Google Gemini, Vercel AI
|
|
15
|
+
SDK, Model Context Protocol, LangChain/LangGraph, and Semantic Kernel.
|
|
16
|
+
- Enabled public npm release-candidate publishing while keeping the no-execution
|
|
17
|
+
framework boundary.
|
|
18
|
+
|
|
19
|
+
## 0.1.0 - 2026-06-03
|
|
20
|
+
|
|
21
|
+
Initial public v0.1 release candidate.
|
|
22
|
+
|
|
23
|
+
- Added JSON Schema contracts for capability, entity, eval case, and eval result
|
|
24
|
+
manifests.
|
|
25
|
+
- Added synthetic support examples for read, prepare-only write, commit, policy,
|
|
26
|
+
approval, refusal, and eval boundaries.
|
|
27
|
+
- Added a TypeScript core library and `aicf` CLI for loading, validating,
|
|
28
|
+
inspecting, deciding, OpenAI tool export, and deterministic eval scoring.
|
|
29
|
+
- Added deterministic policy and lifecycle decision APIs without executing
|
|
30
|
+
capabilities or performing side effects.
|
|
31
|
+
- Added a no-model-call OpenAI Responses adapter for exporting function tool
|
|
32
|
+
definitions and parsing tool calls.
|
|
33
|
+
- Added an API-key-free eval runner for scoring candidate result fixtures.
|
|
34
|
+
- Added release-readiness package checks, public API docs, CI validation, and
|
|
35
|
+
public repository boundary guidance.
|
|
36
|
+
|
|
37
|
+
This release was GitHub-release-ready only and was not published to npm.
|
package/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
Thanks for improving AI Capability Framework. This repository is public, so
|
|
4
|
+
every tracked change must be safe to publish.
|
|
5
|
+
|
|
6
|
+
## Public-Safe Contributions
|
|
7
|
+
|
|
8
|
+
- Use synthetic examples with fake IDs, fake tenants, fake users, and
|
|
9
|
+
`example.com` addresses.
|
|
10
|
+
- Do not commit credentials, account IDs, customer records, raw prompts, raw
|
|
11
|
+
traces, provider payloads, private source documents, generated exports, or
|
|
12
|
+
local experiments.
|
|
13
|
+
- Keep private notes and drafts in `_private/` or another ignored path.
|
|
14
|
+
- Never copy from `_private/` into tracked files verbatim. Distill public
|
|
15
|
+
guidance in new wording.
|
|
16
|
+
|
|
17
|
+
## Development Workflow
|
|
18
|
+
|
|
19
|
+
Install dependencies:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm ci
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Common commands:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npm run generate:types
|
|
29
|
+
npm run check:generated
|
|
30
|
+
npm run build
|
|
31
|
+
npm test
|
|
32
|
+
npm run validate
|
|
33
|
+
npm run check:package
|
|
34
|
+
npm run check
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Run `npm run generate:types` whenever schemas change. Generated public manifest
|
|
38
|
+
types under `src/generated/` must stay current.
|
|
39
|
+
|
|
40
|
+
## Pull Requests
|
|
41
|
+
|
|
42
|
+
Before opening a pull request:
|
|
43
|
+
|
|
44
|
+
- Run `npm run check`.
|
|
45
|
+
- Confirm examples are public-safe and synthetic.
|
|
46
|
+
- Confirm `_private/`, traces, prompts, provider payloads, generated local docs,
|
|
47
|
+
packed tarballs, and local-only files are not tracked.
|
|
48
|
+
- Use `git status --short --ignored` to confirm private material remains
|
|
49
|
+
ignored.
|
|
50
|
+
- Use `git ls-files` to inspect the tracked public surface.
|
|
51
|
+
|
|
52
|
+
## Scope
|
|
53
|
+
|
|
54
|
+
AICF 1.0 is a no-execution framework. Contributions should not add model calls,
|
|
55
|
+
handler registries, action stores, approval runtimes, or side effects unless a
|
|
56
|
+
future roadmap explicitly changes that boundary.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 AI Capability Framework contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
# AI Capability Framework
|
|
2
|
+
|
|
3
|
+
AI Capability Framework (AICF) is a small public framework for describing what an
|
|
4
|
+
AI-enabled application is allowed to know, decide, and do.
|
|
5
|
+
|
|
6
|
+
The repository contains:
|
|
7
|
+
|
|
8
|
+
- JSON Schema contracts for capability, entity, and eval manifests.
|
|
9
|
+
- Synthetic examples that show how to describe a capability without exposing
|
|
10
|
+
private application internals.
|
|
11
|
+
- A TypeScript core library and `aicf` CLI for loading, validating, and
|
|
12
|
+
inspecting manifests.
|
|
13
|
+
- Provider and runtime adapters that export safe tool descriptors without
|
|
14
|
+
calling models or executing capabilities.
|
|
15
|
+
- A deterministic eval runner for scoring public-safe candidate fixtures
|
|
16
|
+
without API keys or live model calls.
|
|
17
|
+
- A normative `1.0` public spec for capability IDs, tiers, lifecycle, and
|
|
18
|
+
public-safe examples.
|
|
19
|
+
|
|
20
|
+
## Why This Exists
|
|
21
|
+
|
|
22
|
+
AI products are easier to govern when model-facing behavior is represented as
|
|
23
|
+
explicit application capabilities instead of broad tool lists or hidden prompts.
|
|
24
|
+
AICF separates semantic interpretation from deterministic application control:
|
|
25
|
+
|
|
26
|
+
- Models interpret the user goal and select from a small set of relevant
|
|
27
|
+
capabilities.
|
|
28
|
+
- Application code validates inputs, checks authorization, enforces policy,
|
|
29
|
+
executes side effects, and records audit evidence.
|
|
30
|
+
- Evals verify that capability selection, tool arguments, approval boundaries,
|
|
31
|
+
and safety behavior remain stable.
|
|
32
|
+
|
|
33
|
+
## Quick Start
|
|
34
|
+
|
|
35
|
+
Install dependencies and validate the public examples:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
npm install
|
|
39
|
+
npm run validate
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Inspect the public example registry:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
npm run inspect
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Evaluate a deterministic capability decision:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
npm run build
|
|
52
|
+
node dist/cli.js decide examples --request examples/support/decisions/support.refund.prepare_case.approval_required.json
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Export OpenAI Responses function tools from a validated registry:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
npm run build
|
|
59
|
+
node dist/cli.js openai-tools examples --context examples/support/openai/context.support_agent.json
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Export another adapter shape:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
npm run build
|
|
66
|
+
node dist/cli.js anthropic-tools examples --context examples/support/openai/context.support_agent.json
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Run deterministic evals against a public-safe candidate fixture:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
npm run build
|
|
73
|
+
node dist/cli.js eval examples --results examples/eval-results/public.results.passing.json
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Start a capability manifest excerpt:
|
|
77
|
+
|
|
78
|
+
```yaml
|
|
79
|
+
schema_version: "1.0"
|
|
80
|
+
id: support.refund.prepare_case
|
|
81
|
+
version: 1.0.0
|
|
82
|
+
status: active
|
|
83
|
+
name: Prepare refund case
|
|
84
|
+
summary: Prepare a refund case for review without issuing money.
|
|
85
|
+
capability_type: write_prepare_only
|
|
86
|
+
autonomy_tier: A2
|
|
87
|
+
risk_tier: medium
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Then add the required input/output schemas, side-effect metadata,
|
|
91
|
+
authorization rules, policy gates, lifecycle flags, observability settings, and
|
|
92
|
+
eval references. Complete copyable examples live under `examples/`.
|
|
93
|
+
|
|
94
|
+
## Repository Layout
|
|
95
|
+
|
|
96
|
+
```text
|
|
97
|
+
schemas/ JSON Schema contracts for AICF manifests
|
|
98
|
+
examples/ Synthetic public example capabilities, entities, and evals
|
|
99
|
+
conformance/ Public valid and invalid fixtures for contract review
|
|
100
|
+
docs/ Public usage guidance
|
|
101
|
+
src/ TypeScript core, CLI, generated types, and tests
|
|
102
|
+
scripts/ Local type-generation utilities
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Start with [the 1.0 spec](docs/spec.md), read the
|
|
106
|
+
[API guide](docs/api.md), the [control-plane guide](docs/control-plane.md), the
|
|
107
|
+
[OpenAI Responses adapter](docs/openai-responses.md), the
|
|
108
|
+
[adapter guide](docs/adapters.md), the
|
|
109
|
+
[eval runner guide](docs/eval-runner.md), the
|
|
110
|
+
[host responsibilities guide](docs/host-responsibilities.md), and the
|
|
111
|
+
[interoperability guide](docs/interoperability.md). For future provider and
|
|
112
|
+
runtime adapters, see the [adapter roadmap](docs/adapter-roadmap.md), then
|
|
113
|
+
inspect the examples.
|
|
114
|
+
|
|
115
|
+
Release and collaboration docs:
|
|
116
|
+
[CHANGELOG](CHANGELOG.md), [CONTRIBUTING](CONTRIBUTING.md),
|
|
117
|
+
[SECURITY](SECURITY.md), the [migration guide](docs/migration-0.1-to-1.0.md),
|
|
118
|
+
and the [release checklist](docs/release.md).
|
|
119
|
+
|
|
120
|
+
Private drafts and source material are intentionally excluded from this public
|
|
121
|
+
repository. See `AGENTS.md` for the tracking boundary used in this workspace.
|
|
122
|
+
|
|
123
|
+
## Core Concepts
|
|
124
|
+
|
|
125
|
+
Capability manifest:
|
|
126
|
+
Describes a model-selectable application capability, including its input/output
|
|
127
|
+
contract, risk tier, side effects, authorization requirements, policy gates, and
|
|
128
|
+
observability expectations.
|
|
129
|
+
|
|
130
|
+
Entity manifest:
|
|
131
|
+
Describes an application entity that capabilities may read or act on. It records
|
|
132
|
+
canonical identifiers, data classification, relationships, and model-facing
|
|
133
|
+
guidance.
|
|
134
|
+
|
|
135
|
+
Eval case:
|
|
136
|
+
Describes a regression case for capability selection, argument extraction,
|
|
137
|
+
approval boundaries, refusals, and safety behavior.
|
|
138
|
+
|
|
139
|
+
Action lifecycle:
|
|
140
|
+
Side-effecting capabilities should generally follow a prepare, preview, approve,
|
|
141
|
+
commit, verify, and audit lifecycle. Low-risk read or compute capabilities can
|
|
142
|
+
use simpler flows when policy allows it.
|
|
143
|
+
|
|
144
|
+
## Validation
|
|
145
|
+
|
|
146
|
+
`npm run validate` parses all schema files, then validates every YAML/JSON
|
|
147
|
+
example under:
|
|
148
|
+
|
|
149
|
+
- `examples/**/capabilities/`
|
|
150
|
+
- `examples/**/entities/`
|
|
151
|
+
- `examples/**/evals/`
|
|
152
|
+
|
|
153
|
+
The script fails on malformed examples or schema violations.
|
|
154
|
+
|
|
155
|
+
GitHub Actions runs type generation, generated-type freshness checks, build,
|
|
156
|
+
tests, and validation on pushes and pull requests.
|
|
157
|
+
|
|
158
|
+
## TypeScript API
|
|
159
|
+
|
|
160
|
+
AICF exposes a small no-execution TypeScript surface:
|
|
161
|
+
|
|
162
|
+
- `loadManifests(options)`
|
|
163
|
+
- `validateManifests(manifests, options)`
|
|
164
|
+
- `buildRegistry(manifests)`
|
|
165
|
+
- `inspectRegistry(registry)`
|
|
166
|
+
- `decideCapability(registry, request)`
|
|
167
|
+
- `evaluatePolicy(capability, request)`
|
|
168
|
+
- `evaluateLifecycle(capability, request)`
|
|
169
|
+
- `buildOpenAIResponsesTools(registry, options)`
|
|
170
|
+
- `parseOpenAIResponsesToolCall(toolset, call)`
|
|
171
|
+
- `toOpenAIResponsesToolName(capabilityId, options)`
|
|
172
|
+
- `buildAnthropicClaudeTools(registry, options)`
|
|
173
|
+
- `parseAnthropicClaudeToolUse(toolset, toolUse)`
|
|
174
|
+
- `buildGeminiFunctionDeclarations(registry, options)`
|
|
175
|
+
- `parseGeminiFunctionCall(functionSet, functionCall)`
|
|
176
|
+
- `buildAiSdkTools(registry, options)`
|
|
177
|
+
- `parseAiSdkToolCall(toolset, toolCall)`
|
|
178
|
+
- `buildMcpToolDescriptors(registry, options)`
|
|
179
|
+
- `parseMcpToolCall(toolset, toolCall)`
|
|
180
|
+
- `buildLangChainToolDescriptors(registry, options)`
|
|
181
|
+
- `parseLangChainToolCall(toolset, toolCall)`
|
|
182
|
+
- `buildSemanticKernelFunctions(registry, options)`
|
|
183
|
+
- `parseSemanticKernelFunctionCall(functionSet, functionCall)`
|
|
184
|
+
- `loadEvalResults(path)`
|
|
185
|
+
- `scoreEvalCase(evalCase, candidate, registry)`
|
|
186
|
+
- `runEvalSuite(registry, candidates, options)`
|
|
187
|
+
|
|
188
|
+
Generated public types include `CapabilityManifest`, `EntityManifest`, and
|
|
189
|
+
`EvalCase`. Decision types include `DecisionRequest`, `DecisionResult`,
|
|
190
|
+
`DecisionReason`, `DecisionOperation`, and `DecisionStatus`. OpenAI adapter
|
|
191
|
+
types include `OpenAIResponsesToolset`, `OpenAIResponsesFunctionTool`, and
|
|
192
|
+
`OpenAIResponsesToolBinding`. Eval runner types include `EvalResultFixture`,
|
|
193
|
+
`EvalCandidateResult`, `EvalSuiteResult`, `EvalCaseResult`, and
|
|
194
|
+
`EvalScorerResult`.
|
|
195
|
+
|
|
196
|
+
## License
|
|
197
|
+
|
|
198
|
+
MIT. See [LICENSE](LICENSE).
|
package/SECURITY.md
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
AI Capability Framework is public. Please do not disclose secrets, customer
|
|
4
|
+
data, raw prompts, raw traces, provider payloads, internal endpoints, or private
|
|
5
|
+
documents in public issues, pull requests, or comments.
|
|
6
|
+
|
|
7
|
+
## Reporting A Vulnerability
|
|
8
|
+
|
|
9
|
+
Use GitHub private vulnerability reporting if it is enabled for this repository.
|
|
10
|
+
If private reporting is unavailable, open a minimal public issue that describes
|
|
11
|
+
the affected area at a high level and asks for a private reporting path. Do not
|
|
12
|
+
include exploit details, credentials, real identifiers, or private data in that
|
|
13
|
+
public issue.
|
|
14
|
+
|
|
15
|
+
## What To Include Privately
|
|
16
|
+
|
|
17
|
+
- Affected schema, API, CLI command, or documentation area.
|
|
18
|
+
- Reproduction steps using synthetic data.
|
|
19
|
+
- Expected and actual behavior.
|
|
20
|
+
- Impact and suggested fix, if known.
|
|
21
|
+
|
|
22
|
+
## Public Safety
|
|
23
|
+
|
|
24
|
+
Security fixes should preserve the repository boundary:
|
|
25
|
+
|
|
26
|
+
- Keep `_private/` ignored and untracked.
|
|
27
|
+
- Redact or omit raw traces, prompts, and provider payloads.
|
|
28
|
+
- Use synthetic examples only.
|
|
29
|
+
- Run `npm run check` before handoff.
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
schema_version: "1.0"
|
|
2
|
+
id: conformance.duplicate.get
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
status: active
|
|
5
|
+
name: Duplicate conformance note one
|
|
6
|
+
summary: First intentionally duplicated capability ID.
|
|
7
|
+
model_description: Read a synthetic note.
|
|
8
|
+
capability_type: read_data
|
|
9
|
+
autonomy_tier: A1
|
|
10
|
+
risk_tier: low
|
|
11
|
+
input_schema:
|
|
12
|
+
type: object
|
|
13
|
+
additionalProperties: false
|
|
14
|
+
required:
|
|
15
|
+
- note_id
|
|
16
|
+
properties:
|
|
17
|
+
note_id:
|
|
18
|
+
type: string
|
|
19
|
+
output_schema:
|
|
20
|
+
type: object
|
|
21
|
+
additionalProperties: false
|
|
22
|
+
required:
|
|
23
|
+
- note_id
|
|
24
|
+
properties:
|
|
25
|
+
note_id:
|
|
26
|
+
type: string
|
|
27
|
+
side_effects:
|
|
28
|
+
reads_data: true
|
|
29
|
+
writes_data: false
|
|
30
|
+
creates_records: false
|
|
31
|
+
updates_records: false
|
|
32
|
+
deletes_records: false
|
|
33
|
+
sends_external_messages: false
|
|
34
|
+
charges_money: false
|
|
35
|
+
refunds_money: false
|
|
36
|
+
changes_permissions: false
|
|
37
|
+
triggers_external_workflow: false
|
|
38
|
+
irreversible: false
|
|
39
|
+
authorization:
|
|
40
|
+
permissions:
|
|
41
|
+
- note.read
|
|
42
|
+
tenant_scoped: true
|
|
43
|
+
requires_user_context: true
|
|
44
|
+
policy:
|
|
45
|
+
approval_required: false
|
|
46
|
+
lifecycle:
|
|
47
|
+
prepare: false
|
|
48
|
+
preview: false
|
|
49
|
+
approve: false
|
|
50
|
+
commit: false
|
|
51
|
+
verify: false
|
|
52
|
+
audit: true
|
|
53
|
+
observability:
|
|
54
|
+
log_inputs: redacted
|
|
55
|
+
log_outputs: summary
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
schema_version: "1.0"
|
|
2
|
+
id: conformance.duplicate.get
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
status: active
|
|
5
|
+
name: Duplicate conformance note two
|
|
6
|
+
summary: Second intentionally duplicated capability ID.
|
|
7
|
+
model_description: Read a synthetic note.
|
|
8
|
+
capability_type: read_data
|
|
9
|
+
autonomy_tier: A1
|
|
10
|
+
risk_tier: low
|
|
11
|
+
input_schema:
|
|
12
|
+
type: object
|
|
13
|
+
additionalProperties: false
|
|
14
|
+
required:
|
|
15
|
+
- note_id
|
|
16
|
+
properties:
|
|
17
|
+
note_id:
|
|
18
|
+
type: string
|
|
19
|
+
output_schema:
|
|
20
|
+
type: object
|
|
21
|
+
additionalProperties: false
|
|
22
|
+
required:
|
|
23
|
+
- note_id
|
|
24
|
+
properties:
|
|
25
|
+
note_id:
|
|
26
|
+
type: string
|
|
27
|
+
side_effects:
|
|
28
|
+
reads_data: true
|
|
29
|
+
writes_data: false
|
|
30
|
+
creates_records: false
|
|
31
|
+
updates_records: false
|
|
32
|
+
deletes_records: false
|
|
33
|
+
sends_external_messages: false
|
|
34
|
+
charges_money: false
|
|
35
|
+
refunds_money: false
|
|
36
|
+
changes_permissions: false
|
|
37
|
+
triggers_external_workflow: false
|
|
38
|
+
irreversible: false
|
|
39
|
+
authorization:
|
|
40
|
+
permissions:
|
|
41
|
+
- note.read
|
|
42
|
+
tenant_scoped: true
|
|
43
|
+
requires_user_context: true
|
|
44
|
+
policy:
|
|
45
|
+
approval_required: false
|
|
46
|
+
lifecycle:
|
|
47
|
+
prepare: false
|
|
48
|
+
preview: false
|
|
49
|
+
approve: false
|
|
50
|
+
commit: false
|
|
51
|
+
verify: false
|
|
52
|
+
audit: true
|
|
53
|
+
observability:
|
|
54
|
+
log_inputs: redacted
|
|
55
|
+
log_outputs: summary
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema_version": "1.0",
|
|
3
|
+
"results": [
|
|
4
|
+
{
|
|
5
|
+
"eval_id": "conformance.note.get.valid",
|
|
6
|
+
"selected_capabilities": ["conformance.note.publish"],
|
|
7
|
+
"tool_calls": [],
|
|
8
|
+
"action_state": "committed",
|
|
9
|
+
"committed_capabilities": ["conformance.note.publish"],
|
|
10
|
+
"response": {
|
|
11
|
+
"text": "Committed an action that the eval forbids."
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
]
|
|
15
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
schema_version: "1.0"
|
|
2
|
+
id: conformance.missing_reference.prepare
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
status: active
|
|
5
|
+
name: Missing reference fixture
|
|
6
|
+
summary: Intentionally references a missing eval file.
|
|
7
|
+
model_description: Prepare a synthetic conformance action.
|
|
8
|
+
capability_type: write_prepare_only
|
|
9
|
+
autonomy_tier: A2
|
|
10
|
+
risk_tier: medium
|
|
11
|
+
input_schema:
|
|
12
|
+
type: object
|
|
13
|
+
additionalProperties: false
|
|
14
|
+
required:
|
|
15
|
+
- note_id
|
|
16
|
+
properties:
|
|
17
|
+
note_id:
|
|
18
|
+
type: string
|
|
19
|
+
output_schema:
|
|
20
|
+
type: object
|
|
21
|
+
additionalProperties: false
|
|
22
|
+
required:
|
|
23
|
+
- prepared_action_id
|
|
24
|
+
properties:
|
|
25
|
+
prepared_action_id:
|
|
26
|
+
type: string
|
|
27
|
+
side_effects:
|
|
28
|
+
reads_data: true
|
|
29
|
+
writes_data: true
|
|
30
|
+
creates_records: true
|
|
31
|
+
updates_records: false
|
|
32
|
+
deletes_records: false
|
|
33
|
+
sends_external_messages: false
|
|
34
|
+
charges_money: false
|
|
35
|
+
refunds_money: false
|
|
36
|
+
changes_permissions: false
|
|
37
|
+
triggers_external_workflow: false
|
|
38
|
+
irreversible: false
|
|
39
|
+
authorization:
|
|
40
|
+
permissions:
|
|
41
|
+
- note.prepare
|
|
42
|
+
tenant_scoped: true
|
|
43
|
+
requires_user_context: true
|
|
44
|
+
policy:
|
|
45
|
+
approval_required: true
|
|
46
|
+
lifecycle:
|
|
47
|
+
prepare: true
|
|
48
|
+
preview: true
|
|
49
|
+
approve: true
|
|
50
|
+
commit: false
|
|
51
|
+
verify: true
|
|
52
|
+
audit: true
|
|
53
|
+
observability:
|
|
54
|
+
log_inputs: redacted
|
|
55
|
+
log_outputs: summary
|
|
56
|
+
evals:
|
|
57
|
+
golden:
|
|
58
|
+
- ../evals/missing.conformance.eval.yaml
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
schema_version: "1.0"
|
|
2
|
+
id: conformance.note.get
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
status: active
|
|
5
|
+
name: Get conformance note
|
|
6
|
+
summary: Read a synthetic note used by public conformance fixtures.
|
|
7
|
+
domain: conformance
|
|
8
|
+
owner:
|
|
9
|
+
team: example-conformance
|
|
10
|
+
contact: conformance@example.com
|
|
11
|
+
capability_type: read_data
|
|
12
|
+
autonomy_tier: A1
|
|
13
|
+
risk_tier: low
|
|
14
|
+
model_description: >
|
|
15
|
+
Use this capability to retrieve a synthetic conformance note by ID.
|
|
16
|
+
when_to_use:
|
|
17
|
+
- The user asks to read a conformance note.
|
|
18
|
+
when_not_to_use:
|
|
19
|
+
- The user asks to change, delete, or publish a note.
|
|
20
|
+
input_schema:
|
|
21
|
+
type: object
|
|
22
|
+
additionalProperties: false
|
|
23
|
+
required:
|
|
24
|
+
- note_id
|
|
25
|
+
properties:
|
|
26
|
+
note_id:
|
|
27
|
+
type: string
|
|
28
|
+
pattern: "^NOTE-[0-9]+$"
|
|
29
|
+
output_schema:
|
|
30
|
+
type: object
|
|
31
|
+
additionalProperties: false
|
|
32
|
+
required:
|
|
33
|
+
- note
|
|
34
|
+
properties:
|
|
35
|
+
note:
|
|
36
|
+
type: object
|
|
37
|
+
additionalProperties: false
|
|
38
|
+
required:
|
|
39
|
+
- note_id
|
|
40
|
+
- title
|
|
41
|
+
properties:
|
|
42
|
+
note_id:
|
|
43
|
+
type: string
|
|
44
|
+
title:
|
|
45
|
+
type: string
|
|
46
|
+
side_effects:
|
|
47
|
+
reads_data: true
|
|
48
|
+
writes_data: false
|
|
49
|
+
creates_records: false
|
|
50
|
+
updates_records: false
|
|
51
|
+
deletes_records: false
|
|
52
|
+
sends_external_messages: false
|
|
53
|
+
charges_money: false
|
|
54
|
+
refunds_money: false
|
|
55
|
+
changes_permissions: false
|
|
56
|
+
triggers_external_workflow: false
|
|
57
|
+
irreversible: false
|
|
58
|
+
authorization:
|
|
59
|
+
permissions:
|
|
60
|
+
- note.read
|
|
61
|
+
tenant_scoped: true
|
|
62
|
+
requires_user_context: true
|
|
63
|
+
data_scope:
|
|
64
|
+
- current_tenant
|
|
65
|
+
policy:
|
|
66
|
+
approval_required: false
|
|
67
|
+
max_autonomy_tier: A1
|
|
68
|
+
lifecycle:
|
|
69
|
+
prepare: false
|
|
70
|
+
preview: false
|
|
71
|
+
approve: false
|
|
72
|
+
commit: false
|
|
73
|
+
verify: false
|
|
74
|
+
audit: true
|
|
75
|
+
observability:
|
|
76
|
+
log_inputs: redacted
|
|
77
|
+
log_outputs: summary
|
|
78
|
+
trace_attributes:
|
|
79
|
+
domain: conformance
|
|
80
|
+
evals:
|
|
81
|
+
golden:
|
|
82
|
+
- ../evals/conformance.note.get.valid.yaml
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
schema_version: "1.0"
|
|
2
|
+
id: Note
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
name: Note
|
|
5
|
+
summary: A synthetic note used by public conformance fixtures.
|
|
6
|
+
canonical_id:
|
|
7
|
+
field: note_id
|
|
8
|
+
pattern: "^NOTE-[0-9]+$"
|
|
9
|
+
data_classification:
|
|
10
|
+
default: tenant_confidential
|
|
11
|
+
fields:
|
|
12
|
+
title: synthetic_note_title
|
|
13
|
+
lookup:
|
|
14
|
+
primary_capability: conformance.note.get
|
|
15
|
+
allowed_actions:
|
|
16
|
+
- conformance.note.get
|
|
17
|
+
model_guidance: >
|
|
18
|
+
Notes in conformance fixtures are synthetic and tenant-scoped.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema_version": "1.0",
|
|
3
|
+
"results": [
|
|
4
|
+
{
|
|
5
|
+
"eval_id": "conformance.note.get.valid",
|
|
6
|
+
"selected_capabilities": ["conformance.note.get"],
|
|
7
|
+
"tool_calls": [
|
|
8
|
+
{
|
|
9
|
+
"capability_id": "conformance.note.get",
|
|
10
|
+
"args": {
|
|
11
|
+
"note_id": "NOTE-1001"
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
"action_state": "none",
|
|
16
|
+
"committed_capabilities": []
|
|
17
|
+
}
|
|
18
|
+
]
|
|
19
|
+
}
|