@awebai/oats 0.29.4 → 0.30.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/README.md +12 -6
- package/bin/oats.mjs +194 -50
- package/docs/capabilities.md +160 -171
- package/docs/capability-manifest.schema.json +6 -11
- package/docs/configuration.md +213 -64
- package/docs/design/2026-09-16-knowledge-capability-contract.md +36 -50
- package/docs/design/2026-09-23-workspace-module-contracts.md +377 -544
- package/docs/design/2026-09-26-okf-knowledge-operations.md +132 -357
- package/docs/design/2026-09-27-team-model-v2.md +97 -117
- package/docs/design/2026-09-28-automations-trust.md +38 -0
- package/docs/design/2026-09-28-soul-launch-preference.md +63 -0
- package/docs/design/HISTORY.md +65 -0
- package/docs/design/README.md +23 -54
- package/docs/desktop-cli-api.md +1787 -1777
- package/docs/desktop.md +30 -91
- package/docs/execution-targets.md +146 -292
- package/docs/first-team.md +31 -17
- package/docs/implementation.md +77 -288
- package/docs/integrations.md +118 -320
- package/docs/knowledge-capability-authoring.md +25 -52
- package/docs/knowledge-reference/acceptance.md +3 -3
- package/docs/knowledge-reference/adoption.md +1 -1
- package/docs/knowledge-reference/harvester.md +2 -2
- package/docs/knowledge-reference/package-craft.md +3 -3
- package/docs/knowledge-reference/provider-mapping.md +3 -6
- package/docs/knowledge-reference/reader-capture.md +3 -3
- package/docs/knowledge-theory.md +62 -166
- package/docs/knowledge.md +225 -404
- package/docs/layers.md +42 -97
- package/docs/oats-local.schema.json +58 -5
- package/docs/oats-membership.schema.json +1 -8
- package/docs/oats-package.schema.json +5 -5
- package/docs/oats-workspace.schema.json +8 -22
- package/docs/official-catalog.md +25 -28
- package/docs/packages.md +45 -63
- package/docs/plans/0.30-close-out.md +83 -0
- package/docs/release-lane.md +82 -0
- package/docs/release-notes/oats-framework-v1.1.3.md +10 -8
- package/docs/release-notes/v0.19.0.md +48 -147
- package/docs/release-notes/v0.19.1.md +2 -3
- package/docs/release-notes/v0.19.3.md +2 -15
- package/docs/release-notes/v0.20.0.md +0 -15
- package/docs/release-notes/v0.22.0.md +71 -138
- package/docs/release-notes/v0.22.1.md +42 -90
- package/docs/release-notes/v0.22.10.md +1 -1
- package/docs/release-notes/v0.22.11.md +1 -47
- package/docs/release-notes/v0.22.12.md +4 -13
- package/docs/release-notes/v0.22.13.md +1 -42
- package/docs/release-notes/v0.22.14.md +3 -11
- package/docs/release-notes/v0.22.15.md +1 -46
- package/docs/release-notes/v0.22.16.md +6 -8
- package/docs/release-notes/v0.22.18.md +1 -99
- package/docs/release-notes/v0.22.19.md +3 -14
- package/docs/release-notes/v0.22.2.md +6 -15
- package/docs/release-notes/v0.22.3.md +0 -1
- package/docs/release-notes/v0.22.4.md +1 -14
- package/docs/release-notes/v0.22.5.md +2 -12
- package/docs/release-notes/v0.22.6.md +0 -3
- package/docs/release-notes/v0.23.0.md +9 -25
- package/docs/release-notes/v0.23.1.md +9 -25
- package/docs/release-notes/v0.23.2.md +2 -4
- package/docs/release-notes/v0.24.0.md +56 -97
- package/docs/release-notes/v0.24.1.md +7 -11
- package/docs/release-notes/v0.24.10.md +34 -45
- package/docs/release-notes/v0.24.11.md +12 -20
- package/docs/release-notes/v0.24.12.md +35 -48
- package/docs/release-notes/v0.24.13.md +34 -41
- package/docs/release-notes/v0.24.2.md +9 -13
- package/docs/release-notes/v0.24.3.md +7 -11
- package/docs/release-notes/v0.24.4.md +6 -6
- package/docs/release-notes/v0.24.5.md +6 -10
- package/docs/release-notes/v0.24.6.md +2 -5
- package/docs/release-notes/v0.24.7.md +46 -75
- package/docs/release-notes/v0.24.8.md +58 -96
- package/docs/release-notes/v0.24.9.md +38 -54
- package/docs/release-notes/v0.25.0.md +59 -76
- package/docs/release-notes/v0.25.1.md +57 -81
- package/docs/release-notes/v0.25.2.md +51 -70
- package/docs/release-notes/v0.25.3.md +11 -13
- package/docs/release-notes/v0.25.4.md +9 -13
- package/docs/release-notes/v0.25.5.md +3 -5
- package/docs/release-notes/v0.25.6.md +20 -29
- package/docs/release-notes/v0.25.7.md +5 -7
- package/docs/release-notes/v0.25.8.md +26 -39
- package/docs/release-notes/v0.26.0.md +175 -646
- package/docs/release-notes/v0.27.0.md +4 -5
- package/docs/release-notes/v0.27.1.md +4 -6
- package/docs/release-notes/v0.27.2.md +1 -1
- package/docs/release-notes/v0.28.0.md +57 -124
- package/docs/release-notes/v0.29.0.md +89 -208
- package/docs/release-notes/v0.29.1.md +1 -1
- package/docs/release-notes/v0.29.2.md +3 -4
- package/docs/release-notes/v0.30.0.md +205 -0
- package/docs/release-notes/v0.30.1.md +123 -0
- package/docs/schedules.md +280 -363
- package/docs/servers.md +99 -117
- package/docs/soul.schema.json +2 -9
- package/docs/souls-and-instances.md +145 -158
- package/docs/workspaces.md +137 -215
- package/lib/automations.mjs +21 -6
- package/lib/core.mjs +226 -74
- package/lib/instance-events.mjs +1 -1
- package/lib/instance-inspect.mjs +109 -34
- package/lib/instance-lifecycle.mjs +14 -1
- package/lib/instance-resolution.mjs +26 -27
- package/lib/launch-preference.mjs +87 -0
- package/lib/materialize.mjs +3 -3
- package/lib/packages.mjs +1 -1
- package/lib/resolve.mjs +30 -88
- package/lib/schedule.mjs +1 -1
- package/lib/teams-verbs.mjs +195 -0
- package/lib/teams.mjs +190 -0
- package/lib/triggers.mjs +2 -2
- package/lib/workspace.mjs +54 -147
- package/package-catalog.json +10 -16
- package/package.json +1 -3
- package/skills/oats-getting-started/SKILL.md +25 -13
- package/capabilities/oats-authoring/LICENSE +0 -21
- package/capabilities/oats-authoring/oats-package.json +0 -11
- package/capabilities/oats-authoring/oats.json +0 -12
- package/capabilities/oats-authoring/skills/integration-authoring/SKILL.md +0 -84
- package/capabilities/oats-authoring/skills/skill-craft/SKILL.md +0 -109
- package/capabilities/oats-authoring/skills/soul-craft/SKILL.md +0 -116
- package/capabilities/oats-aweb/bin/oats-aweb-binding.mjs +0 -11
- package/capabilities/oats-aweb/bin/oats-aweb.mjs +0 -1338
- package/capabilities/oats-aweb/injects/aweb.md +0 -47
- package/capabilities/oats-aweb/lib/binding-wire.mjs +0 -356
- package/capabilities/oats-aweb/lib/captured-execution.mjs +0 -91
- package/capabilities/oats-aweb/lib/captured-native.mjs +0 -91
- package/capabilities/oats-aweb/lib/grant-custody.mjs +0 -38
- package/capabilities/oats-aweb/lib/invocation-shape.mjs +0 -135
- package/capabilities/oats-aweb/lib/portable-binding.mjs +0 -146
- package/capabilities/oats-aweb/lib/session-readiness.mjs +0 -56
- package/capabilities/oats-aweb/lib/wake-receive.mjs +0 -56
- package/capabilities/oats-aweb/oats.json +0 -208
- package/capabilities/oats-aweb/skills/LICENSE +0 -21
- package/capabilities/oats-aweb/skills/VENDORED.md +0 -31
- package/capabilities/oats-aweb/skills/aweb-identity/SKILL.md +0 -201
- package/capabilities/oats-aweb/skills/aweb-messaging/SKILL.md +0 -161
- package/capabilities/oats-aweb/skills/aweb-messaging/references/messaging-scenarios.md +0 -61
- package/capabilities/oats-aweb/skills/aweb-team-membership/SKILL.md +0 -116
- package/capabilities/oats-aweb/skills/aweb-team-membership/references/team-membership-reference.md +0 -74
- package/capabilities/oats-aweb/skills/oats-aweb/SKILL.md +0 -216
- package/capabilities/oats-jira/bin/oats-jira.mjs +0 -40
- package/capabilities/oats-jira/injects/jira.md +0 -10
- package/capabilities/oats-jira/oats.json +0 -22
- package/capabilities/oats-jira/skills/jira-tasks/SKILL.md +0 -179
- package/capabilities/oats-linear/bin/oats-linear-hook.mjs +0 -34
- package/capabilities/oats-linear/bin/oats-linear.mjs +0 -344
- package/capabilities/oats-linear/injects/linear.md +0 -8
- package/capabilities/oats-linear/oats.json +0 -24
- package/capabilities/oats-linear/skills/linear-tasks/SKILL.md +0 -223
- package/capabilities/oats-okf/bin/oats-okf-binding.mjs +0 -14
- package/capabilities/oats-okf/bin/oats-okf.mjs +0 -209
- package/capabilities/oats-okf/injects/okf.md +0 -42
- package/capabilities/oats-okf/lib/binding-wire.mjs +0 -348
- package/capabilities/oats-okf/lib/captured-worker.mjs +0 -109
- package/capabilities/oats-okf/lib/config.mjs +0 -124
- package/capabilities/oats-okf/lib/consult.mjs +0 -518
- package/capabilities/oats-okf/lib/harvest-status.mjs +0 -88
- package/capabilities/oats-okf/lib/harvest-switch.mjs +0 -94
- package/capabilities/oats-okf/lib/inspection.mjs +0 -119
- package/capabilities/oats-okf/lib/invocation-context.mjs +0 -111
- package/capabilities/oats-okf/lib/invocation-shape.mjs +0 -135
- package/capabilities/oats-okf/lib/io.mjs +0 -118
- package/capabilities/oats-okf/lib/migration.mjs +0 -137
- package/capabilities/oats-okf/lib/okf-validate.mjs +0 -123
- package/capabilities/oats-okf/lib/portable-binding.mjs +0 -199
- package/capabilities/oats-okf/lib/source-contract.mjs +0 -46
- package/capabilities/oats-okf/lib/sources.mjs +0 -424
- package/capabilities/oats-okf/lib/stores.mjs +0 -473
- package/capabilities/oats-okf/lib/worker.mjs +0 -497
- package/capabilities/oats-okf/oats.json +0 -148
- package/capabilities/oats-okf/schemas/okf-base.schema.json +0 -46
- package/capabilities/oats-okf/schemas/okf-bindings.schema.json +0 -112
- package/capabilities/oats-okf/schemas/okf-portable-declaration.schema.json +0 -87
- package/capabilities/oats-okf/schemas/okf-portable-payload.schema.json +0 -113
- package/capabilities/oats-okf/schemas/okf-soul.schema.json +0 -37
- package/capabilities/oats-okf/skills/okf-consultation/SKILL.md +0 -144
- package/capabilities/oats-okf/skills/okf-consultation/references/consult.md +0 -86
- package/capabilities/oats-okf/skills/okf-instance-knowledge/SKILL.md +0 -104
- package/capabilities/oats-okf-harvest/bin/okf-harvest.mjs +0 -140
- package/capabilities/oats-okf-harvest/injects/harvester.md +0 -12
- package/capabilities/oats-okf-harvest/oats.json +0 -26
- package/capabilities/oats-okf-harvest/skills/knowledge-harvest/SKILL.md +0 -168
- package/capabilities/oats-okf-harvest/skills/knowledge-theory/SKILL.md +0 -192
- package/capabilities/oats-okf-harvest/skills/okf-authoring/SKILL.md +0 -151
- package/capabilities/oats-okf-harvest/skills/okf-authoring/scripts/okf-validate.mjs +0 -123
- package/capabilities/oats-okf-maintenance/bin/okf-maintenance.mjs +0 -170
- package/capabilities/oats-okf-maintenance/injects/maintainer.md +0 -12
- package/capabilities/oats-okf-maintenance/lib/provenance.mjs +0 -50
- package/capabilities/oats-okf-maintenance/oats.json +0 -21
- package/capabilities/oats-okf-maintenance/skills/knowledge-review/SKILL.md +0 -159
- package/capabilities/oats-okf-maintenance/skills/knowledge-theory/SKILL.md +0 -192
- package/capabilities/oats-okf-maintenance/skills/okf-authoring/SKILL.md +0 -151
- package/capabilities/oats-okf-maintenance/skills/okf-authoring/scripts/okf-validate.mjs +0 -123
- package/capabilities/oats-okf-maintenance/skills/okf-trigger-setup/SKILL.md +0 -146
- package/capabilities/oats-review/injects/review.md +0 -69
- package/capabilities/oats-review/oats.json +0 -10
- package/capabilities/oats-review/skills/code-review/SKILL.md +0 -44
- package/capabilities/oats-review/skills/security-review/SKILL.md +0 -59
- package/docs/conventions.md +0 -90
- package/docs/design/2026-09-07-architecture-reassessment.md +0 -131
- package/docs/design/2026-09-07-desktop-souls-capabilities.md +0 -50
- package/docs/design/2026-09-07-mobile-agent-management-proposal.md +0 -228
- package/docs/design/2026-09-08-expert-assisted-deployment-proposal.md +0 -558
- package/docs/design/2026-09-13-knowledge-and-memory-direction.md +0 -744
- package/docs/design/2026-09-13-knowledge-implementation.md +0 -127
- package/docs/design/2026-09-13-knowledge-location-contract.md +0 -340
- package/docs/design/2026-09-14-artifact-retention-contract.md +0 -190
- package/docs/design/2026-09-14-portable-souls-and-git-workspaces.md +0 -708
- package/docs/design/2026-09-14-portable-souls-contract-amendments.md +0 -85
- package/docs/design/2026-09-14-portable-souls-explainer.md +0 -750
- package/docs/design/2026-09-15-captured-dispatch.md +0 -127
- package/docs/design/2026-09-15-captured-resolution-records.md +0 -143
- package/docs/design/2026-09-15-package-preparation.md +0 -100
- package/docs/design/2026-09-15-portable-data-contract.md +0 -121
- package/docs/design/2026-09-15-portable-declarations.md +0 -189
- package/docs/design/2026-09-15-portable-souls-handoff.md +0 -150
- package/docs/design/2026-09-15-portable-souls-implementation.md +0 -417
- package/docs/design/2026-09-15-selection-lock-and-approval.md +0 -122
- package/docs/design/2026-09-15-source-observation.md +0 -119
- package/docs/design/2026-09-16-captured-admission.md +0 -77
- package/docs/design/2026-09-16-captured-helper-dispatch.md +0 -105
- package/docs/design/2026-09-16-captured-launch-inputs.md +0 -42
- package/docs/design/2026-09-16-command-profile-preparation.md +0 -86
- package/docs/design/2026-09-16-fresh-install-first-rollout.md +0 -47
- package/docs/design/2026-09-16-fresh-operator-walkthrough.md +0 -282
- package/docs/design/2026-09-16-messaging-capability-contract.md +0 -59
- package/docs/design/2026-09-16-portable-migration-evidence.md +0 -158
- package/docs/design/2026-09-16-portable-onboarding.md +0 -179
- package/docs/design/2026-09-16-prepare-request-transport.md +0 -26
- package/docs/design/2026-09-16-provider-binding-codecs.md +0 -98
- package/docs/design/2026-09-16-provider-binding-wire.md +0 -274
- package/docs/design/2026-09-17-capability-helper-input-contract.md +0 -95
- package/docs/design/2026-09-17-captured-backend-parity.md +0 -53
- package/docs/design/2026-09-17-captured-native-start.md +0 -58
- package/docs/design/2026-09-17-portable-boundary-hookup.md +0 -19
- package/docs/design/2026-09-17-portable-boundary-resources.md +0 -52
- package/docs/design/2026-09-17-public-captured-start.md +0 -108
- package/docs/design/2026-09-17-public-prepare-request.md +0 -90
- package/docs/design/2026-09-18-captured-pi-host.md +0 -205
- package/docs/design/2026-09-18-first-cut-release-checklist.md +0 -131
- package/docs/design/2026-09-18-herdr-protocol-compatibility.md +0 -60
- package/docs/design/2026-09-20-redesign-program-board.md +0 -142
- package/docs/design/2026-09-20-workspace-and-portable-adoption-plan.md +0 -289
- package/docs/design/2026-09-20-workspace-onboarding-public.md +0 -207
- package/docs/design/2026-09-22-desktop-parity-seams.md +0 -58
- package/docs/design/2026-09-23-simplified-workspace-model.md +0 -711
- package/docs/design/2026-09-23-workspace-v2-implementation-plan.md +0 -65
- package/docs/design/2026-09-24-desktop-phase-f-boundary.md +0 -242
- package/docs/design/2026-09-24-phase-d-plan.md +0 -305
- package/docs/design/2026-09-25-teams-contract.md +0 -258
- package/docs/design/2026-09-26-desktop-design-brief-architecture.md +0 -241
- package/docs/design/desktop-ux-plan.md +0 -362
- package/docs/design/launch-configurations.md +0 -168
- package/docs/design/okf-mirror-provenance.md +0 -105
- package/docs/design/operations-contract.md +0 -141
- package/docs/oats-member.schema.json +0 -38
- package/skills/integration-authoring/SKILL.md +0 -84
- package/skills/oats-support/SKILL.md +0 -79
- package/skills/skill-craft/SKILL.md +0 -109
- package/skills/soul-craft/SKILL.md +0 -116
|
@@ -1,417 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: Playbook
|
|
3
|
-
status: accepted-for-implementation
|
|
4
|
-
title: Portable Souls infrastructure delivery and acceptance ledger
|
|
5
|
-
description: Fifteen binding decisions mapped clause by clause to dependency-ordered delivery and evidence gates; baseline retention is storage-only.
|
|
6
|
-
timestamp: 2026-09-15
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# Portable Souls infrastructure implementation
|
|
10
|
-
|
|
11
|
-
## Authority, scope and evidence rules
|
|
12
|
-
|
|
13
|
-
Direct human authorization on 2026-09-15 permits infrastructure implementation
|
|
14
|
-
and eventual deployment under the accepted constraints. It supersedes historical
|
|
15
|
-
“not implementation authorized” language, not design boundaries. **Desktop feature
|
|
16
|
-
work is later.** This documentation lane owns only `docs/design/`; it performs no
|
|
17
|
-
commits/pushes, branch switches, live installation/activation, credential operations,
|
|
18
|
-
schedulers, model/GUI launches or session control. Never integrate held capture
|
|
19
|
-
patch `54b07ee`. Primary checkout, earlier roster/KB drafts and `soul/knowledge/`
|
|
20
|
-
are not edit surfaces for this delivery.
|
|
21
|
-
|
|
22
|
-
Binding inputs, all portable repository paths:
|
|
23
|
-
|
|
24
|
-
- [Handoff: 15 decisions](2026-09-15-portable-souls-handoff.md#2-the-decisions-binding).
|
|
25
|
-
- [Reconciled proposal](2026-09-14-portable-souls-and-git-workspaces.md), incorporating
|
|
26
|
-
the [complete substantive amendment](2026-09-14-portable-souls-contract-amendments.md).
|
|
27
|
-
- [Landed retention contract](2026-09-14-artifact-retention-contract.md), especially
|
|
28
|
-
“Resolution and lock integration proposed next” and “Consumer migration”. Its
|
|
29
|
-
integration requirements are binding despite the historical heading.
|
|
30
|
-
- [Reconciled explainer](2026-09-14-portable-souls-explainer.md); LFX examples are
|
|
31
|
-
hypothetical illustrations, not actual repositories, team setups or credentials.
|
|
32
|
-
- Package engine (`package-engine-contract.md`, removed in 0.26), runtime API (`package-runtime-api.md`, removed in 0.26)
|
|
33
|
-
and [current knowledge runtime](../knowledge.md) for preserved contracts.
|
|
34
|
-
The [older knowledge brief](2026-09-13-knowledge-and-memory-direction.md) provides
|
|
35
|
-
doctrine, not a competing source/default schema or permission to auto-edit skills.
|
|
36
|
-
|
|
37
|
-
**Baseline:** `428cd9af615652c4a93d754c1106674abd18545b`, branch
|
|
38
|
-
`feat/portable-souls-infrastructure`. Retention source and storage tests are landed.
|
|
39
|
-
Installer, lock, runtime and queued-work consumers are not migrated by that patch.
|
|
40
|
-
Concurrent uncommitted foundation work is not counted here as landed or qualified.
|
|
41
|
-
|
|
42
|
-
**Ledger discipline:** “documented” means the accepted clause is reconciled, not
|
|
43
|
-
implemented or tested. Every unchecked box below is an acceptance obligation; none
|
|
44
|
-
is checked merely because this document exists. Add exact commands, revision/tree
|
|
45
|
-
identity, pass/fail/skip counts and evidence paths when a gate actually runs. A
|
|
46
|
-
fixture proves only what it executes. Scaffolds are not model learning, storage
|
|
47
|
-
A/B execution is not lifecycle A/B dispatch, a PR is not accepted knowledge, and
|
|
48
|
-
recording team choices is not enrollment or privacy qualification.
|
|
49
|
-
|
|
50
|
-
## Fifteen-decision checklist
|
|
51
|
-
|
|
52
|
-
### D01 — Three responsibilities
|
|
53
|
-
|
|
54
|
-
Contract: handoff decision 1; proposal §3, §10. Documentation reconciled.
|
|
55
|
-
|
|
56
|
-
- [ ] Soul declares needs and sources; workspace declares admission/defaults,
|
|
57
|
-
knowledge stores, team references and catalogs; deployment resolves, installs,
|
|
58
|
-
binds credentials and keeps state. Verify each field has the right owner.
|
|
59
|
-
- [ ] Source, install location, work target and team membership remain independent;
|
|
60
|
-
changing each cannot silently infer or change another.
|
|
61
|
-
|
|
62
|
-
### D02 — Source-complete soul declarations
|
|
63
|
-
|
|
64
|
-
Contract: decision 2; proposal §4. Documentation reconciled; nesting needs parser review.
|
|
65
|
-
|
|
66
|
-
- [ ] Every intrinsic capability resolves from `git:<repo>@<selector>#<package-path>`
|
|
67
|
-
or a contained `repo:` source; selected package really exports the capability ID.
|
|
68
|
-
- [ ] `repo:packages/self-serve-dev` uses the retained source **repository root**;
|
|
69
|
-
nested soul directories, cwd, installation root and work target cannot change it.
|
|
70
|
-
- [ ] Reject snapshot escape and broken/escaping symlinks; retain the required
|
|
71
|
-
snapshot resources after the original source disappears.
|
|
72
|
-
- [ ] `path:` is explicitly nonportable; no ambiguous `./` source spelling in
|
|
73
|
-
portable declarations or hidden upstream catalog-nickname dependency.
|
|
74
|
-
|
|
75
|
-
### D03 — Requirements versus defaults
|
|
76
|
-
|
|
77
|
-
Contract: decision 3; proposal §4, §12. Documentation reconciled.
|
|
78
|
-
|
|
79
|
-
- [ ] `requires` constrains every successful composition; `defaults` selects fallback
|
|
80
|
-
values within those constraints, not another configuration hierarchy.
|
|
81
|
-
- [ ] Abstract requirements can use adopter providers; intrinsic implementation
|
|
82
|
-
requirements cannot be erased by operator/import/workspace defaults.
|
|
83
|
-
- [ ] Conflicting sources/requirements fail with **both origins/paths** reported.
|
|
84
|
-
`messaging: any` alone supplies no software, credentials or private team.
|
|
85
|
-
|
|
86
|
-
### D04 — Two authorities, no repository tier or agent-types
|
|
87
|
-
|
|
88
|
-
Contract: decision 4; proposal §12. Documentation reconciled.
|
|
89
|
-
|
|
90
|
-
- [ ] Resolve workspace defaults and soul declarations through **one resolver**;
|
|
91
|
-
no repository capability-default tier and no agent-types/family entity.
|
|
92
|
-
- [ ] Import adoption is workspace-side, keyed by qualified source identity, not
|
|
93
|
-
short alias; spawn choice can override it only within hard constraints.
|
|
94
|
-
- [ ] Exactly one workspace context is selected; publisher workspace policy cannot
|
|
95
|
-
leak into imported composition. Standalone unresolved bindings report missing.
|
|
96
|
-
- [ ] Repository briefing (`agents-md-injection`) and worktree setup follow the
|
|
97
|
-
repository actually worked on, not the soul source; executable trust still applies.
|
|
98
|
-
A no-Git directory target remains valid without invented membership.
|
|
99
|
-
|
|
100
|
-
### D05 — Reciprocal membership for every member kind
|
|
101
|
-
|
|
102
|
-
Contract: decision 5; proposal §5–§7. Documentation reconciled.
|
|
103
|
-
|
|
104
|
-
- [ ] At recorded revisions and qualified identities, operator can read workspace
|
|
105
|
-
and member, workspace admits member, and member names workspace.
|
|
106
|
-
- [ ] Apply the same rule to project, experts, capabilities and knowledge repositories.
|
|
107
|
-
A fork with a copied backlink or an adjacent folder is not admitted.
|
|
108
|
-
- [ ] Consuming a package, public soul or public knowledge store never implies
|
|
109
|
-
membership or needs a publisher backlink.
|
|
110
|
-
- [ ] Index discovery is bounded and data-only, respects authorization context and
|
|
111
|
-
reports stale/unavailable honestly; it executes no repository script and does
|
|
112
|
-
not expose protected descriptions via broad caches/aggregate indexes.
|
|
113
|
-
- [ ] Equivalent remotes can be qualified; rename/transfer/source-move cases require
|
|
114
|
-
explicit provenance, not same-filename identity substitution. Exact syntax reviewed.
|
|
115
|
-
|
|
116
|
-
### D06 — External-soul import by reference
|
|
117
|
-
|
|
118
|
-
Contract: decision 6; proposal §4 import section and §10. Documentation reconciled.
|
|
119
|
-
|
|
120
|
-
- [ ] Accept canonical source repository, exported soul path, revision selector and
|
|
121
|
-
adopter-local alias; never copy into an adopter-maintained soul definition.
|
|
122
|
-
- [ ] Retain exact source revision and full required source resources. Upstream
|
|
123
|
-
identity, exact revision and local alias are distinct; alias changes do not create
|
|
124
|
-
souls, selector changes do not themselves create new global running identities.
|
|
125
|
-
- [ ] Workspace advertisement does not admit publisher; standalone prepare accepts
|
|
126
|
-
the same reference. Private sources still use existing Git access.
|
|
127
|
-
- [ ] Adoption defaults map team aliases, default knowledge destinations and providers
|
|
128
|
-
within requirements. Mapping advertises, never enrolls; explicit spawn choices
|
|
129
|
-
have the same bounds. No fork/config-copy workaround is needed.
|
|
130
|
-
- [ ] Persistent imported/member souls produce the same resolution shape; retain
|
|
131
|
-
their sources separately, never disguise them as ephemeral capability helpers.
|
|
132
|
-
|
|
133
|
-
### D07 — Project-first expertise
|
|
134
|
-
|
|
135
|
-
Contract: decision 7; proposal §9. Documentation reconciled.
|
|
136
|
-
|
|
137
|
-
- [ ] Project souls live conventionally at `agents/<name>/`, several per repository
|
|
138
|
-
as needed; experts repositories serve cross-repository subjects, not compulsory
|
|
139
|
-
centralization. Role examples are named for expertise, not job assignments.
|
|
140
|
-
- [ ] Canonical AGENTS.md and CLAUDE.md alias plus complete curriculum/reference
|
|
141
|
-
closure survive retention; no silent conversion to an ephemeral helper.
|
|
142
|
-
|
|
143
|
-
### D08 — Knowledge at both levels, provider-neutral kernel
|
|
144
|
-
|
|
145
|
-
Contract: decision 8; proposal §3 and §10. Documentation reconciled.
|
|
146
|
-
|
|
147
|
-
- [ ] Workspace advertises stores/default provider; soul carries source-complete
|
|
148
|
-
locators or **explicitly inherited** bindings. Later reads/harvests need no
|
|
149
|
-
workspace fetch. Fixed sources and rebindable defaults are distinguishable.
|
|
150
|
-
- [ ] Default OKF `reads` includes store+node; `owns` includes node+optional
|
|
151
|
-
destination. Absent destination inherits an explicitly selected write binding
|
|
152
|
-
or reports `needs configuration`, never silently creates a substitute.
|
|
153
|
-
- [ ] Resolved addresses are store-qualified; equal leaf names in different stores
|
|
154
|
-
do not collide. Multiple owned stores work: no one-store-per-soul invariant or
|
|
155
|
-
unapproved single-write-store product limit.
|
|
156
|
-
- [ ] Each node has one explicit steward and each promoted concept an explicit
|
|
157
|
-
destination. Steward, proposing harvester and accepting maintainer remain distinct;
|
|
158
|
-
multiple proposers are not conflicting ownership. Git delivery is PR-only,
|
|
159
|
-
public or private, and acceptance requires merge-visible evidence.
|
|
160
|
-
- [ ] A public read never publishes adopter notes/captures. Write destination and
|
|
161
|
-
publication intent are explicit; do not invent a disclosure/ACL engine here.
|
|
162
|
-
- [ ] Kernel envelope retains effective **non-secret**, provider-owned configuration
|
|
163
|
-
and binding provenance with separate credential references. An alternate provider
|
|
164
|
-
reports its own configuration/readiness without implementing OKF nodes or harvest.
|
|
165
|
-
|
|
166
|
-
### D09 — Private-first choices, provider qualification required
|
|
167
|
-
|
|
168
|
-
Contract: decision 9; proposal §12. Documentation reconciled; provider gate unqualified.
|
|
169
|
-
|
|
170
|
-
- [ ] Messaging-enabled private key uses provider-resolvable **human identity plus
|
|
171
|
-
qualified workspace identity**, reused across the human's machines. OS username,
|
|
172
|
-
checkout path or agent alias is insufficient. Standalone has an explicit context key.
|
|
173
|
-
- [ ] Child and scheduled instances inherit responsible human; messaging-disabled
|
|
174
|
-
workers create no team. Required missing provider/bindings block readiness.
|
|
175
|
-
- [ ] Wider memberships are opt-in per instance; an explicit wider set replaces
|
|
176
|
-
wider defaults and preserves private floor. Alias map alone never enrolls.
|
|
177
|
-
- [ ] One global instance identity supports multiple membership credentials and
|
|
178
|
-
survives widening/narrowing; local process/session/deployment-record IDs and
|
|
179
|
-
team-qualified addresses are not replacement global identity keys.
|
|
180
|
-
- [ ] A **named messaging owner** qualifies catalog visibility, live-instance
|
|
181
|
-
visibility, inbound contact and conversation-history access **separately**.
|
|
182
|
-
Wider membership exposes neither earlier private history nor other private
|
|
183
|
-
instances; ordinary members versus host/service administrators are distinguished.
|
|
184
|
-
- [ ] Before that qualification, record choices only and explicitly claim **no
|
|
185
|
-
provider privacy guarantee**. No blanket readiness based on fields being present.
|
|
186
|
-
|
|
187
|
-
### D10 — One default provider per slot, v1 simplification
|
|
188
|
-
|
|
189
|
-
Contract: decision 10; proposal §12. Documentation reconciled; simultaneous test open.
|
|
190
|
-
|
|
191
|
-
- [ ] Knowledge/messaging/tasks have zero or one default provider per slot in v1;
|
|
192
|
-
document this as a product simplification, not a universal capability limitation.
|
|
193
|
-
- [ ] Examine simultaneous Jira + GitHub: default interface plus service integration
|
|
194
|
-
versus named bindings. Record review outcome before choosing either; do not
|
|
195
|
-
claim solved or build a generalized multi-provider solver by assumption.
|
|
196
|
-
|
|
197
|
-
### D11 — Captured managed composition and retention
|
|
198
|
-
|
|
199
|
-
Contract: decision 11; proposal §10–§11; retention contract. Documentation reconciled.
|
|
200
|
-
|
|
201
|
-
- [ ] Resolve channel/pin once per transaction, consistently across all references;
|
|
202
|
-
captured resolution includes soul snapshot, capability closure, helpers, commands,
|
|
203
|
-
hooks and managed runtime resources, non-secret configuration and provenance.
|
|
204
|
-
- [ ] Several artifacts per capability coexist, one artifact per capability ID per
|
|
205
|
-
instance; incompatible closure paths fail with both origins, no newest-wins rule.
|
|
206
|
-
- [ ] Publish every required artifact then commit a **complete** resolution before
|
|
207
|
-
launch; failure may leave unreferenced valid trees, never a selectable partial record.
|
|
208
|
-
- [ ] Instance and independent queued work retain exact references outside homes;
|
|
209
|
-
launch/restart/retire/recovery/generated commands/runtime packages/helpers use
|
|
210
|
-
those roots after source/home deletion, never today's ambient config/lock.
|
|
211
|
-
- [ ] Retain conservatively while instances, pending jobs or supported recovery
|
|
212
|
-
paths reference source trees, artifacts and records; no elaborate GC initially.
|
|
213
|
-
- [ ] Immutability is OATS-managed software only, not knowledge contents, credentials,
|
|
214
|
-
membership, work repo, services or host tools. Credential rotation and authorized
|
|
215
|
-
membership change do not silently upgrade software; rollback does not undo external
|
|
216
|
-
writes and shared external-state compatibility belongs to providers.
|
|
217
|
-
- [ ] Recurring schedules state capture versus explicit later reprepare policy;
|
|
218
|
-
capture remains proposed pending review. Already queued executions never advance.
|
|
219
|
-
|
|
220
|
-
### D12 — Trust and explicit freshness
|
|
221
|
-
|
|
222
|
-
Contract: decision 12; proposal §11. Documentation reconciled.
|
|
223
|
-
|
|
224
|
-
- [ ] Commands, hooks **or environment (`env`)** make a capability executable;
|
|
225
|
-
changed executable artifact integrity/revision needs fresh approval. Retention,
|
|
226
|
-
catalog identity, publisher continuity and a local download confer none.
|
|
227
|
-
- [ ] Declarative skills receive bounded visible change notices without adding an
|
|
228
|
-
execution-approval gate; unchanged artifacts need not lose approval merely for
|
|
229
|
-
unrelated source-repository changes.
|
|
230
|
-
- [ ] Explicit prepare/update refreshes once per transaction; show available-unapproved
|
|
231
|
-
beside last-approved usable, never “latest” for the latter. Offline/stale/failure
|
|
232
|
-
states remain visible; failed required updates do not claim successful refresh.
|
|
233
|
-
- [ ] No daemon, unattended trust or unattended approval in v1. Any future bounded
|
|
234
|
-
policy is a separate product decision, not a shortcut around an approval prompt.
|
|
235
|
-
|
|
236
|
-
### D13 — Versioned mode-aware digest at migration
|
|
237
|
-
|
|
238
|
-
Contract: decision 13; retention “Storage API implemented in this patch”. Documentation reconciled.
|
|
239
|
-
|
|
240
|
-
- [ ] New digest covers file bytes, symlink targets and regular-file executable flag
|
|
241
|
-
normalized from owner execute, `(mode & 0o100) !== 0`, identically for Git and `path:`.
|
|
242
|
-
- [ ] Versioning unambiguously distinguishes formats; old bytes/symlink digests remain
|
|
243
|
-
verifiable and are never reinterpreted as covering modes or silently reapproved.
|
|
244
|
-
- [ ] Group/other execute and all other mode bits are outside identity. Retention
|
|
245
|
-
preserves modes, never rewrites them or infers entrypoints by parsing free-form
|
|
246
|
-
command/hook strings. This models execution by the owning deployment operator,
|
|
247
|
-
not arbitrary OS principals. New wire spelling requires schema review.
|
|
248
|
-
|
|
249
|
-
### D14 — Explicit, honest migration
|
|
250
|
-
|
|
251
|
-
Contract: decision 14; retention “Consumer migration”. Documentation reconciled.
|
|
252
|
-
|
|
253
|
-
- [ ] One explicit store/lock migration verifies existing flat artifacts and preserves
|
|
254
|
-
those exact inputs, not refetched moving-source substitutes for overwritten history.
|
|
255
|
-
- [ ] Existing instances/jobs report `reconstructed`, `partial` or `unknown`, with
|
|
256
|
-
evidence and unresolved inputs. Partial/unknown cannot pass complete readiness
|
|
257
|
-
in CLI or later Desktop; running sessions remain intact, restart boundary chosen
|
|
258
|
-
by their owners.
|
|
259
|
-
- [ ] Follow all five consumer steps: (1) schema/store migration, (2) acquisition and
|
|
260
|
-
preparation retention, (3) new instance/job captured references, (4) evidence-based
|
|
261
|
-
old-record migration, (5) remove mutable lookups and update diagnostics/removal.
|
|
262
|
-
No permanent dual resolver/store model.
|
|
263
|
-
- [ ] Check acquisition, restoration, trust, discovery, spawn, launch, retirement,
|
|
264
|
-
package/CLI diagnostics and scheduler/operation callers. A path in metadata is
|
|
265
|
-
not proof of retained implementation. Preserve typed absence/invalid/drift refusals
|
|
266
|
-
and never silently repair damaged retained trees or records.
|
|
267
|
-
|
|
268
|
-
### D15 — No new infrastructure
|
|
269
|
-
|
|
270
|
-
Contract: decision 15; proposal §6–§8. Documentation reconciled.
|
|
271
|
-
|
|
272
|
-
- [ ] Git hosting, selected messaging provider and existing machines are sufficient;
|
|
273
|
-
no registry, discovery daemon or OATS user/permission database is introduced.
|
|
274
|
-
- [ ] Standalone/no-Git deployment uses the same explicit-scope APIs, not a fake
|
|
275
|
-
workspace or parent-directory authority scan. Only required source closure is
|
|
276
|
-
acquired; optional caches are optimizations, not authority or activation.
|
|
277
|
-
|
|
278
|
-
## Dependency-ordered delivery plan
|
|
279
|
-
|
|
280
|
-
Owners here are **responsibilities**, not assignments to a deployment/person.
|
|
281
|
-
Parallel code work may proceed only at settled interfaces; synthesis and adversarial
|
|
282
|
-
review bind the exact combined tree. Documentation status does not approve syntax.
|
|
283
|
-
|
|
284
|
-
| Stage | Prerequisites | Deliverable / boundary | Acceptance evidence needed | Ledger at baseline |
|
|
285
|
-
|---|---|---|---|---|
|
|
286
|
-
| P0 — Documentation reconciliation | Full handoff, amendment and landed contract | Maintainer: reconcile proposal/explainer/handoff, preserve public amendment, this ledger | Link/fence/checklist/provenance checks; independent clause review | Documentation checks and final read-only review passed; receipt below |
|
|
287
|
-
| P1 — Acyclic artifact mechanics | Retention contract; P0 constraints | Foundation: shared copy/digest/publication leaf; core and retention consume it without a cycle; no policy/lifecycle in leaf | Dependency graph/import tests and original retention tests; behavior-preserving baseline digest | Pending acceptance; concurrent code edits not certified here |
|
|
288
|
-
| P2 — Versioned records and source custody | P1; schema review | Resolution/storage: explicit-scope records outside homes; separate source retention; exact identity/revision/alias; per-choice provenance and constraints; provider-neutral payload; typed refusals | Invalid/partial/prototype-safe record tests, source resource closure and deletion, atomic publication and damaged-tree refusal | Pending; wire versions/paths require review |
|
|
289
|
-
| P3 — Soul declarations | P0; source/parser review coordinated with P2 | Parser: git/repo/path, requires/defaults, fixed versus rebindable knowledge, aliases; no type/repository tier | Nested-source base/containment, conflict origins, missing bindings, source completeness | Pending; examples are not schemas |
|
|
290
|
-
| P4 — Workspace and discovery | P3 identities; canonical-remote review | Discovery: reciprocal members of every kind, bounded data-only exports, stores/defaults/catalogs/import advertisements | Two layouts, uncloned/inaccessible/forked/renamed sources, authorization-context cache tests | Pending |
|
|
291
|
-
| P5 — Import and bounded composition | P2–P4 | Resolver: by-reference import, qualified adoption defaults, same standalone reference, one workspace, work-target briefing | Same public soul unchanged in org and no-Git standalone; source identity/revision/alias; no copy or false membership | Pending |
|
|
292
|
-
| P6 — Explicit preparation transaction | P1–P5 | Acquisition/resolution: select once, publish artifacts, commit complete record before launch; preserve trust/host requirements; no implicit provider default | Failure injection before publication/commit/launch, available-unapproved vs last-approved, env-only gate, visible declarative changes, separate readiness | Pending |
|
|
293
|
-
| P7 — Coordinated consumer/migration boundary | P2/P6; reviewed lock/digest migration | Lifecycle: implement retention contract steps 1–5 as one migration; wire acquisition/restore/trust/CLI and all dispatch consumers; no ambient substitutions | A/B end-to-end lifecycle/queued job after source deletion, legacy status evidence, old/new digest tests, referenced-removal protection | Pending; no scheduler activation |
|
|
294
|
-
| P8 — CLI/provider readiness | P5–P7 | CLI and provider owners: show provenance/choices/missing configuration, reconstructed/partial/unknown; alternate knowledge payload | JSON/text diagnostic contract checks; alternate provider is not forced into OKF; explicit store-qualified default payload | Pending |
|
|
295
|
-
| P9 — Messaging qualification | Named owner; P5–P8; approved provider test plan | Messaging owner: human/context identity, private reuse, wider choices, global identity continuity and four grants | Two humans on two hosts each; child inheritance; widen/narrow; discovery/contact/history/admin limits; messaging-disabled and standalone cases | **Unqualified**; choices only until evidence |
|
|
296
|
-
| P10 — Operational rollout | Exact-tree infrastructure review and applicable P1–P9 gates | Deployment owner: deliberate release/install/migration with preserved running sessions and separate operational evidence | Required scaffold-only probes/retirement when authorized for that lane, installed-consumer tests, honest missing/unqualified status; no capture-patch integration | Not performed by this documentation lane |
|
|
297
|
-
| Later — Desktop features | Infrastructure APIs/readiness and separate feature delivery | Desktop owner consumes same records and diagnostics, never promotes partial/unknown to complete | Later GUI acceptance; cannot substitute for infrastructure or messaging proof | **Later**, not this phase |
|
|
298
|
-
|
|
299
|
-
P2 and P3 can refine syntax together; neither silently standardizes examples before
|
|
300
|
-
parser review. P7 can be built incrementally, but consumers must not be declared
|
|
301
|
-
migrated until the coordinated boundary is complete. P9 does not block recording
|
|
302
|
-
choices or honest incomplete CLI diagnostics; it blocks enrollment/privacy claims.
|
|
303
|
-
P10 is not permission for this documentation lane to perform any live operation.
|
|
304
|
-
Simultaneous Jira/GitHub must be investigated before any related solver/binding
|
|
305
|
-
extension; no stage chooses its answer here.
|
|
306
|
-
|
|
307
|
-
## Acceptance ledger
|
|
308
|
-
|
|
309
|
-
| Gate | Falsification / required observation | Evidence state |
|
|
310
|
-
|---|---|---|
|
|
311
|
-
| A0 — Retention prerequisite | A/B trees execute their own storage-test payload after removing original source, flat store and lock; damaged entries not repaired | Landed source/tests at baseline, per retention contract; not rerun or widened into runtime proof by this document |
|
|
312
|
-
| A1 — Portable adoption | Same public soul unchanged in organization and no-Git standalone; no publisher workspace; public read and explicit adopter write destination; source/revision/alias independently verified | Pending executable acceptance |
|
|
313
|
-
| A2 — Private-first | Two humans, two hosts each; inherited child, same private key across hosts, wider set replace/narrow, stable global identity; four grants separately qualified; no silent knowledge-binding change | Unqualified; named messaging owner required, no privacy guarantee |
|
|
314
|
-
| A3 — A/B runtime | Old instance AND independent queued work run A's lifecycle/recovery after source removal while new work uses approved B; no ambient latest lookup | Pending; storage A0 is insufficient |
|
|
315
|
-
| A4 — Resolution/trust failure | Conflict provenance, missing bindings, env-only approval, no selectable partial record; explicit refresh notices and no unattended trust | Pending |
|
|
316
|
-
| A5 — Knowledge neutrality | Store-qualified nodes/destinations, multi-store stewardship, PR versus acceptance, public reads not publication; alternate provider configuration without OKF semantics | Pending |
|
|
317
|
-
| A6 — Migration/digest | Old evidence graded, overwritten artifact honestly unrecoverable, running sessions preserved; versioned owner-execute digest with old-format verification | Pending |
|
|
318
|
-
| A7 — Discovery/access | Reciprocal admission every kind; forks/unadmitted excluded; bounded data-only indexes and protected descriptions/authorization caches; no new registry | Pending |
|
|
319
|
-
| A8 — Documentation consistency | Full amendment coverage; 15 decisions; portable links; no stale operational/privacy claims; illustrative YAML not presented as final schema | **Passed for documentation only**; validation and final review receipt below |
|
|
320
|
-
|
|
321
|
-
No live acceptance, deployment, model learning or GUI evidence is manufactured by
|
|
322
|
-
this ledger. Consumer/API paths must be inspected at the actual tested revision;
|
|
323
|
-
this plan is not an instruction to bypass protected current sessions or trust.
|
|
324
|
-
|
|
325
|
-
## Documentation validation receipt
|
|
326
|
-
|
|
327
|
-
Validation on 2026-09-15, documentation only:
|
|
328
|
-
|
|
329
|
-
- Inline Python static validator: **5 files**, **48 local links/anchors**, **15
|
|
330
|
-
balanced fenced blocks** before adding the reproducible command below; handoff
|
|
331
|
-
decisions **1–15** and checklist sections **D01–D15** present; trailing-whitespace
|
|
332
|
-
and private-path/credential-marker scans passed. This is not a general secret scan.
|
|
333
|
-
- The appendix's substantive text was compared byte-for-byte with the complete
|
|
334
|
-
supplied amendment from its “Section 3” heading onward: **identical**. Its SHA-256
|
|
335
|
-
is `053118e61807a4d4d57a0de12a96833c7de76f0fc7d29df0ff49ade646b83e50`.
|
|
336
|
-
The checksum permits future verification without an ignored source file.
|
|
337
|
-
- The final reproducible public-only command below ran via `bash -e -c` and
|
|
338
|
-
**passed: 5 files, 48 links/anchors, 16 fenced blocks, 15 decisions/checklists**,
|
|
339
|
-
plus the substantive amendment checksum. No parser/runtime behavior was tested.
|
|
340
|
-
- `git diff --check -- docs/design` and
|
|
341
|
-
`git diff --exit-code -- docs/design/2026-09-14-artifact-retention-contract.md`
|
|
342
|
-
**passed** for tracked whitespace and preservation of the landed contract.
|
|
343
|
-
The separate new-file whitespace loop below also passed for all five documents.
|
|
344
|
-
- Read-only workflow `binding_design_review`: full clause/amendment/retention review
|
|
345
|
-
passed; explainer review returned three concrete inconsistencies (unconditional
|
|
346
|
-
B selection, approval per source revision rather than changed artifact, and
|
|
347
|
-
publication equated with launch). All three were corrected.
|
|
348
|
-
- Read-only workflow `binding_design_final_review`: **passed with no findings**.
|
|
349
|
-
The reviewer read all five documents, rechecked the full explainer and all three
|
|
350
|
-
fixes, and independently confirmed the appendix checksum, trailing whitespace
|
|
351
|
-
and unchanged retention contract. Documentation acceptance only; runtime work,
|
|
352
|
-
parser/schema approval and provider qualification are still separate gates.
|
|
353
|
-
|
|
354
|
-
No parser acceptance, lifecycle test, model learning, deployment or provider privacy
|
|
355
|
-
claim follows from these checks. The landed retention contract remains unchanged.
|
|
356
|
-
Runtime/full repository tests belong to the foundation/consumer lanes and are not
|
|
357
|
-
claimed run by this documentation task.
|
|
358
|
-
|
|
359
|
-
Reproducible **public-only documentation check**, from the implementation worktree
|
|
360
|
-
root (checks these five files, not implementation behavior):
|
|
361
|
-
|
|
362
|
-
```bash
|
|
363
|
-
python3 - <<'PY'
|
|
364
|
-
from pathlib import Path
|
|
365
|
-
import hashlib, re
|
|
366
|
-
root = Path('docs/design')
|
|
367
|
-
files = sorted(root.glob('*portable-souls*.md'))
|
|
368
|
-
assert len(files) == 5
|
|
369
|
-
links = blocks = 0
|
|
370
|
-
for path in files:
|
|
371
|
-
text = path.read_text()
|
|
372
|
-
assert text.endswith('\n') and not text.endswith('\n\n'), path
|
|
373
|
-
assert all(line == line.rstrip() for line in text.splitlines()), path
|
|
374
|
-
# Track Markdown fences, not inline backticks in the displayed checker.
|
|
375
|
-
fence = None
|
|
376
|
-
for line in text.splitlines():
|
|
377
|
-
match = re.match(r'^(`{3,})(.*)$', line)
|
|
378
|
-
if match and fence is None:
|
|
379
|
-
fence = match[1]
|
|
380
|
-
blocks += 1
|
|
381
|
-
elif match and match[1] == fence and not match[2]:
|
|
382
|
-
fence = None
|
|
383
|
-
assert fence is None, path
|
|
384
|
-
for target in re.findall(r'\[[^\]\n]+\]\(([^\s)]+)\)', text):
|
|
385
|
-
if re.match(r'^[a-z]+://', target):
|
|
386
|
-
continue
|
|
387
|
-
name, _, anchor = target.partition('#')
|
|
388
|
-
destination = path.parent / name if name else path
|
|
389
|
-
assert destination.exists(), (path, target)
|
|
390
|
-
if anchor:
|
|
391
|
-
headings = re.findall(r'^#{1,6} (.+)$', destination.read_text(), re.M)
|
|
392
|
-
slugs = [re.sub(r'[^\w\- ]', '', h.lower()).replace(' ', '-') for h in headings]
|
|
393
|
-
assert anchor in slugs, (path, target)
|
|
394
|
-
links += 1
|
|
395
|
-
# This is a narrow marker check, not a credential-discovery operation.
|
|
396
|
-
forbidden = ['/' + 'Users/', 'instances/' + 'oats-expert', 'juan.' + 'aweb.ai']
|
|
397
|
-
assert all(marker not in text for marker in forbidden), path
|
|
398
|
-
handoff = (root / '2026-09-15-portable-souls-handoff.md').read_text()
|
|
399
|
-
body = handoff.split('## 2. The decisions (binding)\n')[1].split('## 3.')[0]
|
|
400
|
-
assert re.findall(r'^(\d+)\. ', body, re.M) == [str(i) for i in range(1, 16)]
|
|
401
|
-
ledger = (root / '2026-09-15-portable-souls-implementation.md').read_text()
|
|
402
|
-
assert re.findall(r'^### D(\d\d) ', ledger, re.M) == [f'{i:02}' for i in range(1, 16)]
|
|
403
|
-
appendix = (root / '2026-09-14-portable-souls-contract-amendments.md').read_text()
|
|
404
|
-
marker = '## Section 3: responsibilities and knowledge'
|
|
405
|
-
body = marker + appendix.split(marker, 1)[1]
|
|
406
|
-
assert hashlib.sha256(body.encode()).hexdigest() == '053118e61807a4d4d57a0de12a96833c7de76f0fc7d29df0ff49ade646b83e50'
|
|
407
|
-
print(f'PASS: {len(files)} files, {links} links/anchors, {blocks} fenced blocks; 15 decisions, 15 checklists; amendment checksum')
|
|
408
|
-
PY
|
|
409
|
-
for file in docs/design/*portable-souls*.md; do
|
|
410
|
-
status=0
|
|
411
|
-
output=$(git diff --no-index --check /dev/null "$file" 2>&1) || status=$?
|
|
412
|
-
# --no-index may return 1 for differences even without whitespace errors.
|
|
413
|
-
test -z "$output" && test "$status" -le 1 || { printf '%s\n' "$output"; exit 1; }
|
|
414
|
-
done
|
|
415
|
-
git diff --check -- docs/design
|
|
416
|
-
git diff --exit-code -- docs/design/2026-09-14-artifact-retention-contract.md
|
|
417
|
-
```
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
# Selection lock and approval — implementation boundary
|
|
2
|
-
|
|
3
|
-
The new private API in `lib/portable-lock.mjs` implements selection lock v3.
|
|
4
|
-
It is not yet connected to the public package CLI or migration. Old v1/v2
|
|
5
|
-
readers and `docs/oats-lock.schema.json` retain their existing interpretation.
|
|
6
|
-
The new structural schema is `docs/oats-lock-v3.schema.json`; changing the old
|
|
7
|
-
public CLI/schema to admit it remains an explicit consumer-cutover gate.
|
|
8
|
-
|
|
9
|
-
## Future selections, not historical authority
|
|
10
|
-
|
|
11
|
-
A lock has `lockfileVersion: 3`, `artifactSets` and `selections`. Artifact sets
|
|
12
|
-
reuse `validateArtifactSet`; their keys hash the canonical complete set.
|
|
13
|
-
Selection keys hash the normalized `{source,path}` request through the same
|
|
14
|
-
source and canonical-JSON codecs used by captured records. Each non-null
|
|
15
|
-
`current` or `available` reference must name an existing set with one matching
|
|
16
|
-
root package and its complete dependency closure. Direct local-capability
|
|
17
|
-
captures belong in resolutions, not fabricated package selections.
|
|
18
|
-
|
|
19
|
-
Multiple sets can contain different versions of the same capability. This is
|
|
20
|
-
not a multi-version composition within one instance. A captured resolution
|
|
21
|
-
embeds its own selected set; reading it never consults this mutable lock.
|
|
22
|
-
|
|
23
|
-
`current` and `available` are distinct. A failed/offline refresh can preserve
|
|
24
|
-
both A and B while recording failure, without claiming either is latest.
|
|
25
|
-
`observedAt` is the last successful observation's canonical UTC ISO timestamp,
|
|
26
|
-
not an automatically generated timestamp for a failed refresh. No lock field
|
|
27
|
-
can grant trust. Preparation must verify actual resources and exact approval
|
|
28
|
-
before selecting executable B; writing a syntactically valid lock is neither
|
|
29
|
-
that verification nor consent. A pin to B cannot silently fall back to A.
|
|
30
|
-
|
|
31
|
-
## Explicit scope and compare-and-swap
|
|
32
|
-
|
|
33
|
-
`readLock3(deployment)` returns `{lock,integrity}`; both are null if absent.
|
|
34
|
-
The integrity is a versioned canonical-JSON CAS token, not executable trust.
|
|
35
|
-
Malformed, noncanonical, symlinked and unsupported files refuse. Old versions
|
|
36
|
-
require their explicit evidence/migration reader; even an empty v1 file is not
|
|
37
|
-
silently treated as a fresh v3 deployment.
|
|
38
|
-
|
|
39
|
-
`writeLock3(deployment, expectedPreviousIntegrity, next)` validates the whole
|
|
40
|
-
next snapshot and compares the exact previous token under a cooperative scope
|
|
41
|
-
guard. It commits the entire snapshot atomically or reports `selection-changed`;
|
|
42
|
-
no implicit row merging or artifact/record deletion occurs. First publication
|
|
43
|
-
is no-replace. Identical snapshots may be kept, but a stale expected token still
|
|
44
|
-
refuses. Staging is private and ignored before publication.
|
|
45
|
-
|
|
46
|
-
All new portable-state writers use `portable-state.mjs`. A held/crashed guard
|
|
47
|
-
is not auto-reaped; recovery is explicit. This serializes cooperating new
|
|
48
|
-
writers, not legacy operations, hostile host processes or power loss. A live
|
|
49
|
-
legacy cutover still needs the separately reviewed migration barrier. No such
|
|
50
|
-
cutover or live lock write was performed while implementing this module.
|
|
51
|
-
|
|
52
|
-
`portable-files.mjs` shares the bounded descriptor-backed metadata read with
|
|
53
|
-
captured records, preserving their size/identity/content-change checks.
|
|
54
|
-
|
|
55
|
-
## Separate exact-artifact approval
|
|
56
|
-
|
|
57
|
-
`lib/artifact-approvals.mjs` owns `.agents/portable/approvals.json`. Its closed
|
|
58
|
-
version-1 ledger is keyed by capability ID, then integrity format and full digest.
|
|
59
|
-
Every entry must agree with its keys and carry explicit operator provenance.
|
|
60
|
-
Legacy digests, source/provider declarations and captured approval flags cannot
|
|
61
|
-
supply this new authority. Missing ledger means no approvals; malformed existing
|
|
62
|
-
metadata refuses, never repairs itself from a selection lock.
|
|
63
|
-
|
|
64
|
-
`approveCapturedCapability(deployment, resolution, id, operatorOrigin)` is the
|
|
65
|
-
record-addressed approval writer. It verifies the retained record, selected artifact
|
|
66
|
-
and provenance, then preserves previous approvals under the same scope write guard.
|
|
67
|
-
Prospective `approveAvailableCapability(deployment, artifactSet, id, operatorOrigin)`
|
|
68
|
-
uses an exact content-addressed set already in lock v3, verifies its retained artifact
|
|
69
|
-
and installation provenance with the SAME proof, and runs the complete kernel manifest
|
|
70
|
-
codec before that same ledger writer. This breaks the legitimate ordering cycle:
|
|
71
|
-
provider normalization code needs approval BEFORE a complete resolution can be built.
|
|
72
|
-
No partial resolution is fabricated for approval. The CLI spelling is
|
|
73
|
-
`oats trust <id> --deployment <absolute scope> --artifact-set <sha256-set-id>`;
|
|
74
|
-
artifact-set selectors authorize no command execution and cannot mix with resolution
|
|
75
|
-
selectors. Approval itself still grants neither binding readiness nor enrollment.
|
|
76
|
-
There is no bulk caller-supplied ledger overwrite or approval during discovery.
|
|
77
|
-
Approving B neither revokes nor rewrites A. Repeating A keeps its original receipt.
|
|
78
|
-
|
|
79
|
-
`inspectCapturedApprovals` verifies retained inputs and reads current local
|
|
80
|
-
approval authority without consulting current selections/configuration. It returns
|
|
81
|
-
per-capability facts, not a dispatch permit. Helpers have dedicated record checks.
|
|
82
|
-
The existing command/hook/environment classifier was extracted byte-identically
|
|
83
|
-
from core into `capability-execution.mjs`; both callers use it. An environment-only
|
|
84
|
-
artifact needs approval, and owner-execute changes require a new exact approval.
|
|
85
|
-
Declarative-only changes have no executable gate; they remain visible as changed
|
|
86
|
-
artifact identities. No approval for an unrelated managed harness resource follows
|
|
87
|
-
from a capability's approval.
|
|
88
|
-
|
|
89
|
-
All mutable publication uses an active synchronous scope-write context; saved or
|
|
90
|
-
fabricated contexts cannot publish after the guard is released. This is an internal
|
|
91
|
-
coordination safeguard, not a hostile-host permission system. Full manifest/launch
|
|
92
|
-
validation, action-specific trust checks, explicit CLI consent and runtime/provider
|
|
93
|
-
qualification still belong to the forthcoming preparation/dispatch integration.
|
|
94
|
-
|
|
95
|
-
## Shared structural schemas
|
|
96
|
-
|
|
97
|
-
`docs/portable.schema.json` owns the shared value definitions. The thin
|
|
98
|
-
`captured-resolution.schema.json`, `oats-lock-v3.schema.json` and
|
|
99
|
-
`artifact-approvals.schema.json` reference them without copying their types.
|
|
100
|
-
Generate with `node scripts/portable-schemas.mjs --write`; invocation without
|
|
101
|
-
`--write` checks drift. All four schemas compile offline. Existing current-format
|
|
102
|
-
schemas are unchanged; publishing these new wire schemas does not activate them
|
|
103
|
-
in the old installer or CLI.
|
|
104
|
-
|
|
105
|
-
Schema acceptance is structural, not a replacement for strict bounded decoding,
|
|
106
|
-
canonical source parsing, choice replay, cross-reference/digest equality, graph
|
|
107
|
-
closure, source/provenance verification or provider non-secret classification.
|
|
108
|
-
The existing launch/manifest codecs still own their complete contracts. Real
|
|
109
|
-
captured-record, lock and approval fixtures are checked against these schemas;
|
|
110
|
-
a separate test checks deterministic generation and authority/credential boundaries.
|
|
111
|
-
|
|
112
|
-
## Verification so far
|
|
113
|
-
|
|
114
|
-
Four focused tests cover A/B selection and failed-refresh visibility, canonical
|
|
115
|
-
keys/root correlation, full-snapshot CAS/legacy/symlink/guard refusal, and two
|
|
116
|
-
independent concurrent first writers. Existing captured-record and scaffold-only
|
|
117
|
-
spawn/inspect/retire tests cover the shared read-helper extraction. Two focused
|
|
118
|
-
captured-approval tests cover source-deleted A/B coexistence, poisoned current trust,
|
|
119
|
-
key/format refusal, environment-only gating, owner-execute changes and declarative
|
|
120
|
-
no-op. Two existing package-engine trust/environment regressions cover the classifier
|
|
121
|
-
extraction. These qualify the tested storage/approval boundaries, not public CLI
|
|
122
|
-
consent, complete preparation, native dispatch or live migration.
|