@intentic/sandbox-contract 1.176.2 → 1.209.0
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/README.md +65 -0
- package/dist/agent-catalog.d.ts +15 -2
- package/dist/agent-catalog.d.ts.map +1 -1
- package/dist/agent-catalog.js +50 -1
- package/dist/agent-catalog.js.map +1 -1
- package/dist/agent-run-model.d.ts +3 -0
- package/dist/agent-run-model.d.ts.map +1 -0
- package/dist/agent-run-model.js +10 -0
- package/dist/agent-run-model.js.map +1 -0
- package/dist/capability-env.d.ts +2 -0
- package/dist/capability-env.d.ts.map +1 -0
- package/dist/capability-env.js +2 -0
- package/dist/capability-env.js.map +1 -0
- package/dist/chores/chores.d.ts +9 -0
- package/dist/chores/chores.d.ts.map +1 -1
- package/dist/chores/chores.js +257 -18
- package/dist/chores/chores.js.map +1 -1
- package/dist/chores/digest.js +0 -0
- package/dist/chores/digest.js.map +1 -1
- package/dist/chores/extension-update.d.ts +9 -0
- package/dist/chores/extension-update.d.ts.map +1 -0
- package/dist/chores/extension-update.js +15 -0
- package/dist/chores/extension-update.js.map +1 -0
- package/dist/chores/fix-deps.d.ts +10 -0
- package/dist/chores/fix-deps.d.ts.map +1 -0
- package/dist/chores/fix-deps.js +18 -0
- package/dist/chores/fix-deps.js.map +1 -0
- package/dist/chores/index.d.ts +7 -2
- package/dist/chores/index.d.ts.map +1 -1
- package/dist/chores/index.js +4 -1
- package/dist/chores/index.js.map +1 -1
- package/dist/chores/probes.d.ts +1 -0
- package/dist/chores/probes.d.ts.map +1 -1
- package/dist/chores/probes.js +131 -3
- package/dist/chores/probes.js.map +1 -1
- package/dist/chores/stack.d.ts +27 -0
- package/dist/chores/stack.d.ts.map +1 -0
- package/dist/chores/stack.js +121 -0
- package/dist/chores/stack.js.map +1 -0
- package/dist/chores/verdict.d.ts +2 -1
- package/dist/chores/verdict.d.ts.map +1 -1
- package/dist/chores/verdict.js +57 -7
- package/dist/chores/verdict.js.map +1 -1
- package/dist/contract-lock.d.ts +3 -0
- package/dist/contract-lock.d.ts.map +1 -0
- package/dist/contract-lock.js +35 -0
- package/dist/contract-lock.js.map +1 -0
- package/dist/contracts/activity.contract.d.ts +10 -0
- package/dist/contracts/activity.contract.d.ts.map +1 -1
- package/dist/contracts/agent.contract.d.ts +230 -20
- package/dist/contracts/agent.contract.d.ts.map +1 -1
- package/dist/contracts/agent.contract.js +2 -1
- package/dist/contracts/agent.contract.js.map +1 -1
- package/dist/contracts/agents.contract.d.ts +847 -1
- package/dist/contracts/agents.contract.d.ts.map +1 -1
- package/dist/contracts/agents.contract.js +3 -1
- package/dist/contracts/agents.contract.js.map +1 -1
- package/dist/contracts/automations.contract.d.ts +89 -0
- package/dist/contracts/automations.contract.d.ts.map +1 -1
- package/dist/contracts/automations.contract.js +3 -1
- package/dist/contracts/automations.contract.js.map +1 -1
- package/dist/contracts/capabilities.contract.d.ts +108 -32
- package/dist/contracts/capabilities.contract.d.ts.map +1 -1
- package/dist/contracts/capabilities.contract.js +5 -1
- package/dist/contracts/capabilities.contract.js.map +1 -1
- package/dist/contracts/chores.contract.d.ts +43 -0
- package/dist/contracts/chores.contract.d.ts.map +1 -1
- package/dist/contracts/ci.contract.d.ts +5 -0
- package/dist/contracts/ci.contract.d.ts.map +1 -1
- package/dist/contracts/ci.contract.js +2 -2
- package/dist/contracts/ci.contract.js.map +1 -1
- package/dist/contracts/claude.contract.d.ts +3 -14
- package/dist/contracts/claude.contract.d.ts.map +1 -1
- package/dist/contracts/claude.contract.js +2 -3
- package/dist/contracts/claude.contract.js.map +1 -1
- package/dist/contracts/drafts.contract.d.ts +4 -0
- package/dist/contracts/drafts.contract.d.ts.map +1 -1
- package/dist/contracts/endpoints.contract.d.ts +28 -12
- package/dist/contracts/endpoints.contract.d.ts.map +1 -1
- package/dist/contracts/endpoints.contract.js +9 -0
- package/dist/contracts/endpoints.contract.js.map +1 -1
- package/dist/contracts/extensions.contract.d.ts +399 -69
- package/dist/contracts/extensions.contract.d.ts.map +1 -1
- package/dist/contracts/extensions.contract.js +15 -1
- package/dist/contracts/extensions.contract.js.map +1 -1
- package/dist/contracts/git.contract.d.ts +209 -11
- package/dist/contracts/git.contract.d.ts.map +1 -1
- package/dist/contracts/git.contract.js +12 -2
- package/dist/contracts/git.contract.js.map +1 -1
- package/dist/contracts/grok.contract.d.ts +0 -13
- package/dist/contracts/grok.contract.d.ts.map +1 -1
- package/dist/contracts/grok.contract.js +1 -2
- package/dist/contracts/grok.contract.js.map +1 -1
- package/dist/contracts/host.contract.d.ts +39 -0
- package/dist/contracts/host.contract.d.ts.map +1 -1
- package/dist/contracts/host.contract.js +3 -2
- package/dist/contracts/host.contract.js.map +1 -1
- package/dist/contracts/loops.contract.d.ts +343 -0
- package/dist/contracts/loops.contract.d.ts.map +1 -0
- package/dist/contracts/loops.contract.js +11 -0
- package/dist/contracts/loops.contract.js.map +1 -0
- package/dist/contracts/panels.contract.d.ts +6 -0
- package/dist/contracts/panels.contract.d.ts.map +1 -1
- package/dist/contracts/personas.contract.d.ts +112 -0
- package/dist/contracts/personas.contract.d.ts.map +1 -0
- package/dist/contracts/personas.contract.js +13 -0
- package/dist/contracts/personas.contract.js.map +1 -0
- package/dist/contracts/ports.contract.d.ts +1 -0
- package/dist/contracts/ports.contract.d.ts.map +1 -1
- package/dist/contracts/prepush.contract.d.ts +1 -0
- package/dist/contracts/prepush.contract.d.ts.map +1 -1
- package/dist/contracts/prepush.contract.js.map +1 -1
- package/dist/contracts/{codex.contract.d.ts → providers.contract.d.ts} +11 -3
- package/dist/contracts/providers.contract.d.ts.map +1 -0
- package/dist/contracts/providers.contract.js +6 -0
- package/dist/contracts/providers.contract.js.map +1 -0
- package/dist/contracts/public.contract.d.ts +24 -0
- package/dist/contracts/public.contract.d.ts.map +1 -0
- package/dist/contracts/public.contract.js +8 -0
- package/dist/contracts/public.contract.js.map +1 -0
- package/dist/contracts/push.contract.d.ts +3 -3
- package/dist/contracts/secrets.contract.d.ts +9 -0
- package/dist/contracts/secrets.contract.d.ts.map +1 -1
- package/dist/contracts/sessions.contract.d.ts +16 -1
- package/dist/contracts/sessions.contract.d.ts.map +1 -1
- package/dist/contracts/sessions.contract.js +1 -1
- package/dist/contracts/sessions.contract.js.map +1 -1
- package/dist/contracts/settings.contract.d.ts +352 -58
- package/dist/contracts/settings.contract.d.ts.map +1 -1
- package/dist/contracts/settings.contract.js +2 -1
- package/dist/contracts/settings.contract.js.map +1 -1
- package/dist/contracts/share.contract.d.ts +55 -0
- package/dist/contracts/share.contract.d.ts.map +1 -0
- package/dist/contracts/share.contract.js +9 -0
- package/dist/contracts/share.contract.js.map +1 -0
- package/dist/contracts/skills.contract.d.ts +41 -0
- package/dist/contracts/skills.contract.d.ts.map +1 -0
- package/dist/contracts/skills.contract.js +9 -0
- package/dist/contracts/skills.contract.js.map +1 -0
- package/dist/contracts/system.contract.d.ts +218 -22
- package/dist/contracts/system.contract.d.ts.map +1 -1
- package/dist/contracts/system.contract.js +10 -2
- package/dist/contracts/system.contract.js.map +1 -1
- package/dist/contracts/workflows.contract.d.ts +575 -0
- package/dist/contracts/workflows.contract.d.ts.map +1 -0
- package/dist/contracts/workflows.contract.js +13 -0
- package/dist/contracts/workflows.contract.js.map +1 -0
- package/dist/contracts/workspace.contract.d.ts +18 -4
- package/dist/contracts/workspace.contract.d.ts.map +1 -1
- package/dist/contracts/workspace.contract.js +6 -3
- package/dist/contracts/workspace.contract.js.map +1 -1
- package/dist/conversation-ids.d.ts +2 -0
- package/dist/conversation-ids.d.ts.map +1 -0
- package/dist/conversation-ids.js +113 -0
- package/dist/conversation-ids.js.map +1 -0
- package/dist/events.d.ts +523 -17
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +106 -13
- package/dist/events.js.map +1 -1
- package/dist/history-state.d.ts +3 -0
- package/dist/history-state.d.ts.map +1 -0
- package/dist/history-state.js +53 -0
- package/dist/history-state.js.map +1 -0
- package/dist/hostnames.d.ts +4 -0
- package/dist/hostnames.d.ts.map +1 -1
- package/dist/hostnames.js +7 -2
- package/dist/hostnames.js.map +1 -1
- package/dist/index.d.ts +3793 -478
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +41 -17
- package/dist/index.js.map +1 -1
- package/dist/listener-protocol.d.ts +77 -0
- package/dist/listener-protocol.d.ts.map +1 -0
- package/dist/listener-protocol.js +33 -0
- package/dist/listener-protocol.js.map +1 -0
- package/dist/model-order.d.ts +1 -0
- package/dist/model-order.d.ts.map +1 -1
- package/dist/model-order.js +16 -0
- package/dist/model-order.js.map +1 -1
- package/dist/output-fields.d.ts +30 -0
- package/dist/output-fields.d.ts.map +1 -0
- package/dist/output-fields.js +57 -0
- package/dist/output-fields.js.map +1 -0
- package/dist/path-refs.d.ts.map +1 -1
- package/dist/path-refs.js.map +1 -1
- package/dist/publish-drafts.d.ts +7 -0
- package/dist/publish-drafts.d.ts.map +1 -0
- package/dist/publish-drafts.js +20 -0
- package/dist/publish-drafts.js.map +1 -0
- package/dist/quick-model.d.ts +2 -1
- package/dist/quick-model.d.ts.map +1 -1
- package/dist/quick-model.js +18 -14
- package/dist/quick-model.js.map +1 -1
- package/dist/routes.d.ts +3 -0
- package/dist/routes.d.ts.map +1 -1
- package/dist/routes.js +63 -0
- package/dist/routes.js.map +1 -1
- package/dist/runtime-state.d.ts +33 -0
- package/dist/runtime-state.d.ts.map +1 -0
- package/dist/runtime-state.js +14 -0
- package/dist/runtime-state.js.map +1 -0
- package/dist/schemas.d.ts +4938 -866
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +1011 -192
- package/dist/schemas.js.map +1 -1
- package/dist/search-globs.d.ts +6 -0
- package/dist/search-globs.d.ts.map +1 -0
- package/dist/search-globs.js +39 -0
- package/dist/search-globs.js.map +1 -0
- package/dist/share-paths.d.ts +8 -0
- package/dist/share-paths.d.ts.map +1 -0
- package/dist/share-paths.js +21 -0
- package/dist/share-paths.js.map +1 -0
- package/dist/state-portability.d.ts +8 -0
- package/dist/state-portability.d.ts.map +1 -0
- package/dist/state-portability.js +4 -0
- package/dist/state-portability.js.map +1 -0
- package/dist/title.d.ts.map +1 -1
- package/dist/title.js +1 -1
- package/dist/title.js.map +1 -1
- package/dist/tunnel-ids.d.ts +1 -0
- package/dist/tunnel-ids.d.ts.map +1 -1
- package/dist/tunnel-ids.js +1 -0
- package/dist/tunnel-ids.js.map +1 -1
- package/dist/versions.d.ts +4 -0
- package/dist/versions.d.ts.map +1 -0
- package/dist/versions.js +15 -0
- package/dist/versions.js.map +1 -0
- package/dist/workflow-faults.d.ts +4 -0
- package/dist/workflow-faults.d.ts.map +1 -0
- package/dist/workflow-faults.js +115 -0
- package/dist/workflow-faults.js.map +1 -0
- package/dist/workspace-state.d.ts +282 -3
- package/dist/workspace-state.d.ts.map +1 -1
- package/dist/workspace-state.js +198 -12
- package/dist/workspace-state.js.map +1 -1
- package/package.json +30 -6
- package/src/agent-catalog.test.ts +147 -7
- package/src/agent-catalog.ts +233 -21
- package/src/agent-run-model.test.ts +60 -0
- package/src/agent-run-model.ts +51 -0
- package/src/capability-env.ts +10 -0
- package/src/capability-ledger.test.ts +110 -0
- package/src/chores/chores.test.ts +32 -0
- package/src/chores/chores.ts +456 -32
- package/src/chores/digest.ts +0 -0
- package/src/chores/extension-update.ts +37 -0
- package/src/chores/fix-deps.ts +40 -0
- package/src/chores/index.ts +7 -2
- package/src/chores/probes.test.ts +155 -3
- package/src/chores/probes.ts +209 -4
- package/src/chores/stack.test.ts +126 -0
- package/src/chores/stack.ts +244 -0
- package/src/chores/verdict.test.ts +357 -19
- package/src/chores/verdict.ts +102 -22
- package/src/contract-lock.test.ts +17 -0
- package/src/contract-lock.ts +66 -0
- package/src/contracts/agent.contract.ts +6 -0
- package/src/contracts/agents.contract.ts +12 -0
- package/src/contracts/automations.contract.ts +17 -1
- package/src/contracts/capabilities.contract.ts +22 -0
- package/src/contracts/ci.contract.ts +10 -2
- package/src/contracts/claude.contract.ts +8 -4
- package/src/contracts/endpoints.contract.ts +21 -0
- package/src/contracts/extensions.contract.ts +42 -0
- package/src/contracts/git.contract.ts +33 -6
- package/src/contracts/grok.contract.ts +4 -3
- package/src/contracts/host.contract.ts +13 -2
- package/src/contracts/loops.contract.ts +62 -0
- package/src/contracts/personas.contract.ts +56 -0
- package/src/contracts/prepush.contract.ts +4 -3
- package/src/contracts/providers.contract.ts +23 -0
- package/src/contracts/public.contract.ts +14 -0
- package/src/contracts/sessions.contract.ts +5 -1
- package/src/contracts/settings.contract.ts +5 -0
- package/src/contracts/share.contract.ts +20 -0
- package/src/contracts/skills.contract.ts +24 -0
- package/src/contracts/system.contract.ts +27 -3
- package/src/contracts/workflows.contract.ts +78 -0
- package/src/contracts/workspace.contract.ts +10 -2
- package/src/conversation-ids.test.ts +25 -0
- package/src/conversation-ids.ts +160 -0
- package/src/events.test.ts +20 -1
- package/src/events.ts +404 -43
- package/src/history-state.ts +129 -0
- package/src/hostnames.ts +20 -6
- package/src/index.ts +60 -17
- package/src/listener-protocol.ts +96 -0
- package/src/model-order.test.ts +32 -1
- package/src/model-order.ts +56 -3
- package/src/output-fields.ts +111 -0
- package/src/path-refs.test.ts +4 -4
- package/src/path-refs.ts +5 -5
- package/src/publish-drafts.ts +59 -0
- package/src/quick-model.test.ts +70 -27
- package/src/quick-model.ts +76 -40
- package/src/routes.test.ts +91 -3
- package/src/routes.ts +135 -0
- package/src/runtime-state.test.ts +45 -0
- package/src/runtime-state.ts +124 -0
- package/src/schemas.test.ts +16 -29
- package/src/schemas.ts +3526 -553
- package/src/search-globs.test.ts +46 -0
- package/src/search-globs.ts +76 -0
- package/src/share-paths.test.ts +48 -0
- package/src/share-paths.ts +68 -0
- package/src/state-portability.ts +56 -0
- package/src/title.test.ts +20 -1
- package/src/title.ts +12 -3
- package/src/tunnel-ids.ts +15 -1
- package/src/versions.test.ts +39 -0
- package/src/versions.ts +48 -0
- package/src/workflow-faults.test.ts +127 -0
- package/src/workflow-faults.ts +188 -0
- package/src/workspace-state.test.ts +189 -17
- package/src/workspace-state.ts +500 -30
- package/dist/contracts/codex.contract.d.ts.map +0 -1
- package/dist/contracts/codex.contract.js +0 -6
- package/dist/contracts/codex.contract.js.map +0 -1
- package/dist/contracts/gemini.contract.d.ts +0 -16
- package/dist/contracts/gemini.contract.d.ts.map +0 -1
- package/dist/contracts/gemini.contract.js +0 -6
- package/dist/contracts/gemini.contract.js.map +0 -1
- package/dist/contracts/kimi.contract.d.ts +0 -16
- package/dist/contracts/kimi.contract.d.ts.map +0 -1
- package/dist/contracts/kimi.contract.js +0 -6
- package/dist/contracts/kimi.contract.js.map +0 -1
- package/dist/contracts/komodo.contract.d.ts +0 -125
- package/dist/contracts/komodo.contract.d.ts.map +0 -1
- package/dist/contracts/komodo.contract.js +0 -14
- package/dist/contracts/komodo.contract.js.map +0 -1
- package/dist/contracts/memory.contract.d.ts +0 -34
- package/dist/contracts/memory.contract.d.ts.map +0 -1
- package/dist/contracts/memory.contract.js +0 -9
- package/dist/contracts/memory.contract.js.map +0 -1
- package/src/contracts/codex.contract.ts +0 -10
- package/src/contracts/gemini.contract.ts +0 -11
- package/src/contracts/kimi.contract.ts +0 -9
- package/src/contracts/komodo.contract.ts +0 -36
- package/src/contracts/memory.contract.ts +0 -13
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { type AgentCapabilities, capabilitiesOf, limitationsOf } from "./agent-catalog.js";
|
|
3
|
+
|
|
4
|
+
/* THE CAPABILITY LEDGER — which claims in the record are backed by machinery, and which by prose.
|
|
5
|
+
*
|
|
6
|
+
* agent-catalog.test.ts asks two other questions: does every provider/harness pair HAVE a row, and does every
|
|
7
|
+
* axis a record can lack have words for it. A row can pass both and still be a lie. The ability is declared,
|
|
8
|
+
* the sentence renders in the picker's footer, and nothing anywhere behaves differently — so the day the
|
|
9
|
+
* runtime gains the ability (or loses it), the declaration keeps its old value and the footer keeps telling the
|
|
10
|
+
* user something that stopped being true. Over-promising is the direction that hurts: told a runtime can be
|
|
11
|
+
* steered, someone types a mid-turn correction into a queue that does not exist.
|
|
12
|
+
*
|
|
13
|
+
* The record's header already states the rule — "a capability is listed here only if something READS it". This
|
|
14
|
+
* is the rule with teeth. Every field is ENFORCED (a seam opens or closes on it, and the entry cites where) or
|
|
15
|
+
* DESCRIPTIVE (it gates nothing; its whole job is that one sentence). `Record<keyof AgentCapabilities, …>`
|
|
16
|
+
* makes the split exhaustive at COMPILE time: a field added to the interface without an entry here does not
|
|
17
|
+
* typecheck, and neither does an entry for a field that no longer exists. There is no way to add an ability and
|
|
18
|
+
* leave the question of what backs it unanswered.
|
|
19
|
+
*
|
|
20
|
+
* WHAT THIS DOES NOT DO, deliberately: prove an ENFORCED gate exists. Those gates live in the daemon and the
|
|
21
|
+
* web, which sit ABOVE this package and must not be imported back into it. So an enforced entry's citation is a
|
|
22
|
+
* comment a reader checks, and the honest reading is "someone verified this once" — not "CI verifies it". The
|
|
23
|
+
* descriptive half IS machine-checked below, because it can be: those claims reach the user through
|
|
24
|
+
* `limitationsOf`, which is right here.
|
|
25
|
+
*
|
|
26
|
+
* Moving a field between the two sets belongs in the same change that adds or removes its gate. */
|
|
27
|
+
|
|
28
|
+
type Backing = "enforced" | "descriptive";
|
|
29
|
+
|
|
30
|
+
const LEDGER: Record<keyof AgentCapabilities, Backing> = {
|
|
31
|
+
// adapter-registry.ts maps runtime → the adapter that serves the turn; getting it wrong runs the turn on
|
|
32
|
+
// the wrong loop entirely. Also keys the daemon's per-runtime health probes (useSandboxVersion.ts).
|
|
33
|
+
runtime: "enforced",
|
|
34
|
+
// conversation.ts's `steerable` — the composer offers mid-turn injection only where there is a queue.
|
|
35
|
+
steering: "enforced",
|
|
36
|
+
// turn-plan.ts forwards `permissionMode` only under "modes" (bar plan); modesFor/clampMode build the
|
|
37
|
+
// composer's mode list from it, so a plan-only runtime is offered two postures rather than four names.
|
|
38
|
+
permissions: "enforced",
|
|
39
|
+
// turn-plan.ts opens the tool seam on "full" and attaches the setup notice when it is anything less.
|
|
40
|
+
mcp: "enforced",
|
|
41
|
+
// turn-plan.ts drops `effort` unless the runtime takes it; ComposerEffort.vue renders no scale without it.
|
|
42
|
+
effort: "enforced",
|
|
43
|
+
// turn-plan.ts drops `fast` unless the loop can ask for it. The one axis with no sentence of its own: a
|
|
44
|
+
// record alone cannot tell the truth about it (a translator-routed turn reads true and still cannot go
|
|
45
|
+
// fast), so the user-facing answer comes from fastAllowed instead.
|
|
46
|
+
fastMode: "enforced",
|
|
47
|
+
// turn-plan.ts tells a "cwd" turn where its worktree is, because an absolute /work path still reaches the
|
|
48
|
+
// shared checkout there. Under "namespace" the mount does it and the note would be noise.
|
|
49
|
+
isolation: "enforced",
|
|
50
|
+
/* system-prompt.ts composes a turn's standing instructions AGAINST this value — a replacement where one may
|
|
51
|
+
* be sent, an addition where only that is possible, and the user-message door for the persona note where
|
|
52
|
+
* there is no system seam at all — and each adapter reads the field the composition set (codex-agent.ts's
|
|
53
|
+
* two config keys, grok-agent.ts's per-message `system`). It is also the one axis whose absence was the bug
|
|
54
|
+
* that produced it: before the field existed, every runtime was composed for as though it were the Claude
|
|
55
|
+
* Code loop, and five of the six silently dropped the owner's prompt. */
|
|
56
|
+
instructions: "enforced",
|
|
57
|
+
// turn-plan.ts (honoured) plans the JS backend only where "js" is declared, so a runtime without it is
|
|
58
|
+
// handed no `jsExecution` and mounts no Code tool — the same drop-what-you-can't-honour rule as `effort`.
|
|
59
|
+
execution: "enforced",
|
|
60
|
+
|
|
61
|
+
/* DESCRIPTIVE — true of the runtime, and nothing consults them. Each describes behaviour that is emergent
|
|
62
|
+
* rather than gated: an agent that never emits `question` frames simply never asks, one that publishes no
|
|
63
|
+
* commands leaves the `/` popover empty. Nothing has to switch off, which is why nothing does. That also
|
|
64
|
+
* means the declaration and the behaviour are two independent facts, and only the reader below keeps them
|
|
65
|
+
* from disagreeing in the one place a user can see. Wiring one up (hiding the terminal tab, skipping
|
|
66
|
+
* auto-resume) moves it to ENFORCED — in the change that wires it. */
|
|
67
|
+
questions: "descriptive",
|
|
68
|
+
commands: "descriptive",
|
|
69
|
+
terminals: "descriptive",
|
|
70
|
+
recovery: "descriptive",
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
// The full ceiling: every ability real, so `limitationsOf` has nothing to say about it. Read from the catalog
|
|
74
|
+
// rather than written out, so this is the record the product actually ships.
|
|
75
|
+
const CEILING = capabilitiesOf("claude", "native");
|
|
76
|
+
|
|
77
|
+
const fieldsWhere = (backing: Backing): (keyof AgentCapabilities)[] =>
|
|
78
|
+
(Object.keys(LEDGER) as (keyof AgentCapabilities)[]).filter((field) => LEDGER[field] === backing);
|
|
79
|
+
|
|
80
|
+
/* The compiler pins the ledger against the INTERFACE. This pins it against a live record, which is not the same
|
|
81
|
+
* claim: an optional field, or one a record leaves off, typechecks and then is not there to gate anything. */
|
|
82
|
+
it("classifies exactly the fields a live record carries", () => {
|
|
83
|
+
expect(Object.keys(LEDGER).toSorted()).toEqual(Object.keys(CEILING).toSorted());
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
/* A DESCRIPTIVE field earns its place by reaching the user, since by definition it does nothing else. Checked
|
|
87
|
+
* per field rather than by counting sentences: an aggregate is satisfied by one axis contributing two lines
|
|
88
|
+
* while another contributes none, which is exactly the case worth catching. Anything that survives here without
|
|
89
|
+
* a sentence is decoration, and the fix is to delete the field or wire it up — not to add an exemption. */
|
|
90
|
+
describe("a descriptive claim reaches the user", () => {
|
|
91
|
+
it("has something to disclose against: the ceiling discloses nothing", () => {
|
|
92
|
+
expect(limitationsOf(CEILING)).toEqual([]);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it.each(fieldsWhere("descriptive"))("%s puts its own sentence in the picker when the runtime lacks it", (field) => {
|
|
96
|
+
expect(typeof CEILING[field], `${field} is descriptive but not a boolean — teach the flip below how to diminish it`).toBe("boolean");
|
|
97
|
+
|
|
98
|
+
const lacking: AgentCapabilities = { ...CEILING, [field]: false };
|
|
99
|
+
|
|
100
|
+
expect(limitationsOf(lacking)).toHaveLength(1);
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
/* The ledger is a split, not a label: a set that swallowed everything would typecheck and prove nothing. Both
|
|
105
|
+
* sides being occupied is what makes reading an entry informative — and if the descriptive side ever empties
|
|
106
|
+
* because every axis got wired up, that is a real event, and deleting this file is the right response to it. */
|
|
107
|
+
it("is a real split — neither side is empty", () => {
|
|
108
|
+
expect(fieldsWhere("enforced").length).toBeGreaterThan(0);
|
|
109
|
+
expect(fieldsWhere("descriptive").length).toBeGreaterThan(0);
|
|
110
|
+
});
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { CHORE_KINDS, CHORES } from "./chores.js";
|
|
3
|
+
|
|
4
|
+
/* THE BOOK'S ORDER, checked. The reading order used to be a paragraph of prose above a hand-sorted array, which
|
|
5
|
+
* is the one kind of claim this file cannot make: English cannot be compiled, and the array it described was
|
|
6
|
+
* maintained by whoever added the last chore. Now the order is derived from `kind`, and these are the three
|
|
7
|
+
* things that derivation is only worth anything if they hold. */
|
|
8
|
+
|
|
9
|
+
describe(`the chore book's order`, () => {
|
|
10
|
+
it(`groups the book by kind, in CHORE_KINDS order`, () => {
|
|
11
|
+
const ranks = CHORES.map((chore) => CHORE_KINDS.findIndex((spec) => spec.kind === chore.kind));
|
|
12
|
+
// Every chore's kind is one CHORE_KINDS names (-1 would sort it to the front and silently outrank
|
|
13
|
+
// security), and no kind is interleaved with another.
|
|
14
|
+
expect(ranks).not.toContain(-1);
|
|
15
|
+
expect(ranks).toEqual(ranks.toSorted((left, right) => left - right));
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it(`keeps every chore in the book`, () => {
|
|
19
|
+
// The sort cannot drop an entry — but a future refactor to a filter-into-groups could, so the count is
|
|
20
|
+
// pinned to the ids rather than to a number, which says which one went missing.
|
|
21
|
+
expect(new Set(CHORES.map((chore) => chore.id)).size).toBe(CHORES.length);
|
|
22
|
+
expect(CHORES.length).toBe(17);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it(`says "surveying" exactly when a chore is a survey`, () => {
|
|
26
|
+
// The two are the same claim: a survey has no measurement, so "due because it has been that long" IS the
|
|
27
|
+
// surveying kind. Checked in both directions, because either half drifting makes the grouping a lie.
|
|
28
|
+
for (const chore of CHORES) {
|
|
29
|
+
expect(chore.survey === true).toBe(chore.kind === `surveying`);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
});
|