abstractskill 0.3.2__tar.gz → 0.3.4__tar.gz
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.
- {abstractskill-0.3.2/src/abstractskill.egg-info → abstractskill-0.3.4}/PKG-INFO +6 -2
- {abstractskill-0.3.2 → abstractskill-0.3.4}/README.md +5 -1
- {abstractskill-0.3.2 → abstractskill-0.3.4}/pyproject.toml +1 -1
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/__init__.py +1 -1
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/catalog.yaml +1 -1
- abstractskill-0.3.4/src/abstractskill/registry/skills/abstract-release/SKILL.md +346 -0
- abstractskill-0.3.4/src/abstractskill/registry/skills/abstract-release/agents/openai.yaml +4 -0
- abstractskill-0.3.4/src/abstractskill/registry/skills/abstract-release/references/package-discovery.md +74 -0
- abstractskill-0.3.4/src/abstractskill/registry/skills/abstract-release/references/package-inventory.md +140 -0
- abstractskill-0.3.4/src/abstractskill/registry/skills/abstract-release/references/readiness-audit.md +54 -0
- abstractskill-0.3.4/src/abstractskill/registry/skills/abstract-release/references/release-process.md +227 -0
- abstractskill-0.3.4/src/abstractskill/registry/skills/abstract-release/scripts/abstract_release_plan.py +1123 -0
- abstractskill-0.3.4/src/abstractskill/registry/skills/abstract-release/scripts/pypi_visibility_gate.py +207 -0
- abstractskill-0.3.4/src/abstractskill/registry/skills/abstractframework-website/SKILL.md +110 -0
- abstractskill-0.3.4/src/abstractskill/registry/skills/abstractframework-website/references/check_site.py +83 -0
- abstractskill-0.3.4/src/abstractskill/registry/skills/abstractframework-website/references/preview_server.py +95 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/coredoc/SKILL.md +68 -1
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/validations.yaml +69 -4
- {abstractskill-0.3.2 → abstractskill-0.3.4/src/abstractskill.egg-info}/PKG-INFO +6 -2
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill.egg-info/SOURCES.txt +11 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/tests/test_bundled.py +4 -4
- {abstractskill-0.3.2 → abstractskill-0.3.4}/tests/test_shelf.py +11 -1
- {abstractskill-0.3.2 → abstractskill-0.3.4}/LICENSE +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/setup.cfg +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/bundled.py +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/catalog.py +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/demand.py +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/errors.py +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/hash.py +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/loader.py +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/models.py +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/parser.py +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/policy.py +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/prompt.py +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/advisories.yaml +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/guidance.yaml +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/licenses/meshvault-live-editing.LICENSE +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/licenses/verification-before-completion.LICENSE +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/abstractframework-gateway/SKILL.md +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/adr/SKILL.md +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/adr/agents/openai.yaml +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/adr/references/adr-template-and-workflow.md +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/adr/references/default-adr-catalog.md +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/adr/references/reader-first-adr-style.md +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/adversarial-iteration/SKILL.md +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/agora-collaboration/SKILL.md +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/agora-collaboration/references/failure-ledger.md +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/agora-collaboration/references/mechanics.md +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/architect/SKILL.md +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/architect/agents/openai.yaml +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/architect/references/reviewer-memory.md +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/backlog/SKILL.md +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/backlog/agents/openai.yaml +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/backlog/references/abstractframework-board.md +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/backlog/references/hub-work-join.md +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/backlog/references/layout-and-templates.md +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/backlog/references/maintenance-checklists.md +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/cicd/SKILL.md +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/cicd/agents/openai.yaml +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/cicd/references/docs-and-containers.md +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/cicd/references/maintenance-playbook.md +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/cicd/references/package-publishing.md +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/cicd/references/repository-setup.md +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/cicd/references/workflow-patterns.md +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/coredoc/agents/openai.yaml +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/coredoc/references/agent-skill.md +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/coredoc/references/core-doc-set.md +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/coredoc/references/llms-files.md +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/coredoc/references/maintenance-playbook.md +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/entity-observation/SKILL.md +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/entity-self-knowledge/SKILL.md +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/entity-self-knowledge/references/capability_map.md +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/meshvault-live-editing/SKILL.md +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/review/SKILL.md +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/review/agents/openai.yaml +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/review/references/reviewer-memory.md +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/uxreview/SKILL.md +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/uxreview/agents/openai.yaml +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/uxreview/references/reviewer-memory.md +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/verification-before-completion/SKILL.md +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/selection.py +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/tree.py +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/trust.py +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/validation.py +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill.egg-info/dependency_links.txt +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill.egg-info/requires.txt +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill.egg-info/top_level.txt +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/tests/test_audience.py +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/tests/test_catalog.py +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/tests/test_demand.py +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/tests/test_loader.py +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/tests/test_parser.py +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/tests/test_policy.py +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/tests/test_refresh_shelf_pins.py +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/tests/test_selection.py +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/tests/test_tree.py +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/tests/test_trust.py +0 -0
- {abstractskill-0.3.2 → abstractskill-0.3.4}/tests/test_vendor_script.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: abstractskill
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.4
|
|
4
4
|
Summary: Agent Skills (SKILL.md) parsing, discovery, trust gating, and demand derivation for AbstractFramework
|
|
5
5
|
Author-email: Laurent-Philippe Albou <contact@abstractcore.ai>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -61,12 +61,16 @@ pip install abstractskill
|
|
|
61
61
|
|
|
62
62
|
The wheel carries the library and the curated skill registry (the shelf below).
|
|
63
63
|
|
|
64
|
+
What's new in 0.3.4: the `abstractframework-website` skill joins the shelf and
|
|
65
|
+
`abstract-release` covers AbstractAvatar and the AbstractAssistant lanes; see
|
|
66
|
+
the [changelog](CHANGELOG.md#034---2026-11-02).
|
|
67
|
+
|
|
64
68
|
## The bundled skill registry
|
|
65
69
|
|
|
66
70
|
`pip install abstractskill` installs the reviewed shelf as package data:
|
|
67
71
|
|
|
68
72
|
```
|
|
69
|
-
abstractskill/registry/skills/ #
|
|
73
|
+
abstractskill/registry/skills/ # 16 curated skills (one folder per SKILL.md)
|
|
70
74
|
abstractskill/registry/licenses/ # upstream licenses of catalog-vendored skills
|
|
71
75
|
abstractskill/registry/validations.yaml # trust records: byte pins per skill tree
|
|
72
76
|
abstractskill/registry/advisories.yaml # do-not-use advisories (empty at v1, by design)
|
|
@@ -28,12 +28,16 @@ pip install abstractskill
|
|
|
28
28
|
|
|
29
29
|
The wheel carries the library and the curated skill registry (the shelf below).
|
|
30
30
|
|
|
31
|
+
What's new in 0.3.4: the `abstractframework-website` skill joins the shelf and
|
|
32
|
+
`abstract-release` covers AbstractAvatar and the AbstractAssistant lanes; see
|
|
33
|
+
the [changelog](CHANGELOG.md#034---2026-11-02).
|
|
34
|
+
|
|
31
35
|
## The bundled skill registry
|
|
32
36
|
|
|
33
37
|
`pip install abstractskill` installs the reviewed shelf as package data:
|
|
34
38
|
|
|
35
39
|
```
|
|
36
|
-
abstractskill/registry/skills/ #
|
|
40
|
+
abstractskill/registry/skills/ # 16 curated skills (one folder per SKILL.md)
|
|
37
41
|
abstractskill/registry/licenses/ # upstream licenses of catalog-vendored skills
|
|
38
42
|
abstractskill/registry/validations.yaml # trust records: byte pins per skill tree
|
|
39
43
|
abstractskill/registry/advisories.yaml # do-not-use advisories (empty at v1, by design)
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "abstractskill"
|
|
7
|
-
version = "0.3.
|
|
7
|
+
version = "0.3.4"
|
|
8
8
|
description = "Agent Skills (SKILL.md) parsing, discovery, trust gating, and demand derivation for AbstractFramework"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
# four yaml files shipped in the abstractskill wheel). Bump it whenever any
|
|
17
17
|
# of that content changes; seed_registry() records it in <dest>/.seeded.json
|
|
18
18
|
# and tests/test_bundled.py pins it to a content digest.
|
|
19
|
-
version: "2026.
|
|
19
|
+
version: "2026.11.02"
|
|
20
20
|
|
|
21
21
|
skills:
|
|
22
22
|
|
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: abstract-release
|
|
3
|
+
description: Plan and run an AbstractFramework release wave across its packages in dependency order. Covers which packages changed, the release order, the per-package mechanics (tag push or workflow_dispatch, the PyPI/npm/crates.io GitHub environments), the gates (adversarial review before merge, real-weights or real-gateway end-to-end checks, merge only on all-green, registry visibility, dependency-floor propagation with the install-profile pin tests), and the final report. Use when releasing one or more AbstractFramework packages, raising inter-package floors, publishing the root `abstractframework` profile, or auditing whether a release wave is complete. For a single package with no dependents, the package-level `release` skill is enough.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Abstract Release
|
|
7
|
+
|
|
8
|
+
AbstractFramework contains Python packages on PyPI, npm packages and apps, and Rust crates on
|
|
9
|
+
crates.io; `./scripts/deps.sh` lists the current workspace inventory. A release
|
|
10
|
+
wave publishes the changed ones from the bottom of the dependency graph upward, so every package
|
|
11
|
+
a parent depends on is already published, green, and visible on its registry before the parent
|
|
12
|
+
raises its floor and publishes.
|
|
13
|
+
|
|
14
|
+
This skill orchestrates the wave. Inside each package, use the `release` skill (version, changelog,
|
|
15
|
+
tag, publish), `coredoc` (README, docs, llms files, version source), `backlog` (the work item and
|
|
16
|
+
its evidence) and `adr` (durable rules). This skill adds what only shows up across packages: the
|
|
17
|
+
order, the gates between packages, floor propagation, and the root profile.
|
|
18
|
+
|
|
19
|
+
## Read-only readiness audits
|
|
20
|
+
|
|
21
|
+
When asked whether to release, produce evidence and a recommendation without executing a release.
|
|
22
|
+
The checkout synchronization, checkpoint commits, branch integration and final build rules below
|
|
23
|
+
apply when release execution is authorized; an audit does not authorize pulling, merging, staging
|
|
24
|
+
operator edits, dispatching workflows, rerunning CI, or publishing. Read remote refs and CI through
|
|
25
|
+
read-only GitHub APIs when needed and label cached tracking refs explicitly.
|
|
26
|
+
|
|
27
|
+
Read `references/readiness-audit.md` for the audit evidence contract, registry-only build checks,
|
|
28
|
+
missing-package discovery and the distinction between a release blocker and later roadmap work.
|
|
29
|
+
|
|
30
|
+
## Non-negotiable rules (operator, 2026-10-28; release execution)
|
|
31
|
+
|
|
32
|
+
1. **A release ships EVERY pending change of the work in scope.** Before cutting any package: every
|
|
33
|
+
pending change ON `main` (local unpushed commits, uncommitted edits: an operator's edit is committed
|
|
34
|
+
as `checkpoint` after a secret scan, never left aside) and every branch THE AGENTS CREATED to complete
|
|
35
|
+
a task is merged into an up-to-date `main`, tested and released. NOT every branch: the operator's own
|
|
36
|
+
branches (e.g. a private memory-block branch in AbstractCore) are theirs, are never merged, pushed or
|
|
37
|
+
touched unless the operator says so; when in doubt about a branch's owner, ask. "Held because the operator has edits" or "held because local main has
|
|
38
|
+
unpushed commits" is forbidden: fix the build, merge with origin, release. The only reasons to stop
|
|
39
|
+
are secrets in the tree or a failing test that cannot be fixed without a decision: then ask, with
|
|
40
|
+
the exact file and failure, and keep every other package moving.
|
|
41
|
+
2. **Always pull before starting any work**, in every repository, every time: `git -C <repo> fetch
|
|
42
|
+
origin && git -C <repo> pull --ff-only origin main` before cutting a branch or a worktree; cut
|
|
43
|
+
worktrees from `origin/main`. Pull the local `main` again right after every merge on GitHub.
|
|
44
|
+
3. **A release means every pending change has been merged into an up-to-date `main`.** The wave ends
|
|
45
|
+
only when `./scripts/status.sh` shows every repository on `main`, clean, 0 ahead, 0 behind, and
|
|
46
|
+
`./scripts/build.sh` passes from those checkouts. A checkout left on a feature branch, a merged PR
|
|
47
|
+
not pulled, or a repo "N ahead" is a release defect, reported as such, not as a note.
|
|
48
|
+
4. A worker that cannot run `git merge` or `git rebase` or `git switch` asks the coordinator to do it
|
|
49
|
+
immediately; it never leaves the branch unmerged and moves on.
|
|
50
|
+
|
|
51
|
+
## Before you start
|
|
52
|
+
|
|
53
|
+
- Default to a read-only plan. Commits, pushes, tags, workflow dispatches, publishes, CI reruns and
|
|
54
|
+
skipped gates need the operator's explicit approval (see the approval packet in
|
|
55
|
+
`references/release-process.md`).
|
|
56
|
+
- Set the skill directory once; the scripts run from any working directory:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
SKILL_DIR=~/.claude/skills/abstract-release # or wherever this skill is installed
|
|
60
|
+
AF_ROOT=/path/to/abstractframework # the workspace root (holds scripts/lib/packages.txt)
|
|
61
|
+
git -C "$AF_ROOT/<repo>" fetch --tags # per repository: the planner reads local release tags
|
|
62
|
+
python3 "$SKILL_DIR/scripts/abstract_release_plan.py" "$AF_ROOT" --registry
|
|
63
|
+
python3 "$SKILL_DIR/scripts/abstract_release_plan.py" "$AF_ROOT" --registry --json -o "$AF_ROOT/untracked/release-plan.json"
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Two packages may share a registry name across registries (AbstractAvatar's crate and Python
|
|
67
|
+
package): the planner keys the crate as `<name>-crate`; a crate dependent's edge resolves to it.
|
|
68
|
+
Without a path, the planner finds the workspace by walking up from the current directory
|
|
69
|
+
(or reads `ABSTRACTFRAMEWORK_ROOT`). A package is in the wave when it has uncommitted changes,
|
|
70
|
+
commits since its last release tag, a version with no tag, or (with `--registry`) a version not
|
|
71
|
+
on its registry; packages downstream of one are added for a floor review only.
|
|
72
|
+
- Read `references/package-inventory.md` for the tiers and each package's version source,
|
|
73
|
+
release trigger and registry environment. Read `references/release-process.md` before the first
|
|
74
|
+
irreversible step.
|
|
75
|
+
- Operator checkouts can hold uncommitted work that is not yours. Never stage it, never rebase a
|
|
76
|
+
diverged branch for the operator. When you need a clean tree, use a worktree in a scratch
|
|
77
|
+
directory.
|
|
78
|
+
|
|
79
|
+
## The order
|
|
80
|
+
|
|
81
|
+
Release by published dependency floors, not by what happens to pass locally:
|
|
82
|
+
|
|
83
|
+
1. Independent lower packages: `abstractvoice`, `abstractvision`, `abstractmusic` (and the other
|
|
84
|
+
tier-0 media plugins), `abstractskill`, `abstractavatar` (one repository, TWO packages: the
|
|
85
|
+
crate `abstractavatar` on crates.io and the Python package `abstractavatar` on PyPI; the crate
|
|
86
|
+
first: `abstracttui`'s `avatar` feature depends on it, and `abstractcore-console`,
|
|
87
|
+
`abstractgateway-console` and `abstractcode` depend on `abstracttui` with that feature), and
|
|
88
|
+
the AbstractUIC npm packages (`ui-kit`, `app-server`, `monitor-*`, `panel-chat`).
|
|
89
|
+
2. `abstractsemantics` and `abstractmemory` (AbstractMemory owns the memory graph).
|
|
90
|
+
3. `abstractcore`.
|
|
91
|
+
4. `abstractruntime`.
|
|
92
|
+
5. `abstractagent`.
|
|
93
|
+
6. `abstractgateway`.
|
|
94
|
+
7. Apps on the gateway: `abstractassistant`, `abstractcode`, `abstractobserver`, `abstractentity`,
|
|
95
|
+
`abstractflow`, `abstractcontinuum`, `abstractnote` (Python on the gateway and AbstractMemory,
|
|
96
|
+
plus its web app). AbstractAssistant is one repository with FOUR lanes: the Python package
|
|
97
|
+
(PyPI, the desktop palette and the gateway seam), the web app (`web/`, `@abstractframework/assistant`,
|
|
98
|
+
served by the gateway; not on npm yet), the iPhone app (`phone/iphone`, App Store / TestFlight
|
|
99
|
+
through `scripts/release.py` and `scripts/upload-candidate.sh`, `iphone.yml`) and the watch app
|
|
100
|
+
(`watch/apple`, `watch.yml`, `scripts/testflight.sh`). The registry wave releases the Python
|
|
101
|
+
package; the Apple lanes release through App Store Connect with the operator's approval
|
|
102
|
+
(`app-store` environment) and are reported as their own rows, never folded into the PyPI row.
|
|
103
|
+
8. Root `abstractframework`: pins, `RELEASE_VERSIONS`, `NPM_RELEASE_VERSIONS`,
|
|
104
|
+
`CRATE_RELEASE_VERSIONS` (includes `abstractavatar` and `abstracttui`), install manifest,
|
|
105
|
+
installers, install docs.
|
|
106
|
+
9. The website, last and gated: once the root profile is on PyPI, run the `abstractframework-website`
|
|
107
|
+
skill — it updates the site branch locally (versions, install commands, new apps and
|
|
108
|
+
capabilities, refreshed screenshots and llms mirrors), serves it locally and hands the operator
|
|
109
|
+
the preview URL. The operator validates and pushes `gh-pages`; a wave never pushes the site.
|
|
110
|
+
|
|
111
|
+
The planner refines this from the real manifests: it skips packages with nothing to release and
|
|
112
|
+
adds every package downstream of a changed package for a floor review. `scripts/lib/packages.txt`
|
|
113
|
+
in the workspace is the inventory the workspace scripts use; the planner reports any package it
|
|
114
|
+
finds on disk that the inventory is missing.
|
|
115
|
+
|
|
116
|
+
## The per-package loop
|
|
117
|
+
|
|
118
|
+
Repeat for each package in the plan's `release_wave`, lowest order first.
|
|
119
|
+
|
|
120
|
+
1. **Work item.** Every change has a `backlog` item in its own package; close it with evidence.
|
|
121
|
+
A rule that should outlive the task (for example "no direct lower-level imports; a missing
|
|
122
|
+
capability is surfaced by the runtime") becomes an ADR.
|
|
123
|
+
2. **Version and docs.** Bump the package's version source (named per package in
|
|
124
|
+
`references/package-inventory.md`; some packages keep it in two places that must agree). Fold
|
|
125
|
+
`Unreleased` into one dated `CHANGELOG.md` section for the version. Run `coredoc`'s release
|
|
126
|
+
checklist: version source, README badges and install snippets, package metadata, llms files
|
|
127
|
+
regenerated with the package's generator and committed, backlog/ADR trace.
|
|
128
|
+
3. **Local proof.** Run the package tests. For anything that touches an engine, run a real-weights
|
|
129
|
+
end-to-end check on the machine, not a mock. For gateway routes, go through a scratch gateway
|
|
130
|
+
over HTTP (recipe in `references/release-process.md`). A local failure can be the stale venv,
|
|
131
|
+
not the code: CI installs from the published pins, so decide per failure whether it is a code
|
|
132
|
+
bug or the environment (keys in the shell, CLIs on PATH, missing extras, older siblings).
|
|
133
|
+
4. **Adversarial review before merge.** A read-only reviewer that did not write the diff reviews
|
|
134
|
+
it. Fix the confirmed findings, re-verify, and record what was found.
|
|
135
|
+
5. **Pull request, merge only on all-green.**
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
gh pr create --base main --head <branch> --title "<package> X.Y.Z: <summary>" --body-file <notes.md>
|
|
139
|
+
gh pr checks <N> --watch
|
|
140
|
+
gh pr checks <N> | awk -F'\t' '{print $2}' | sort -u # must print exactly: pass
|
|
141
|
+
gh pr merge <N> --merge # alone, never chained after other commands
|
|
142
|
+
gh pr view <N> --json state,mergeCommit # confirm MERGED before tagging
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
6. **Publish.** Read the package's row in `references/package-inventory.md` (trigger, dispatch
|
|
146
|
+
inputs, environment policy) first. Then:
|
|
147
|
+
- Confirm the publishing environment admits the ref you will publish from, or the publish job
|
|
148
|
+
is refused after the build passed (a 404 means no policy: any ref may deploy):
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
gh api repos/lpalbou/<Repo>/environments/<pypi|npm|crates-io>/deployment-branch-policies \
|
|
152
|
+
--jq '.branch_policies[]|"\(.type):\(.name)"'
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
- Confirm you publish the merged commit:
|
|
156
|
+
`git switch main && git pull --ff-only`, then `git rev-parse HEAD` must equal the PR's
|
|
157
|
+
`mergeCommit.oid`.
|
|
158
|
+
- Tag push (most packages; AbstractUIC tags its root `package.json` version, AbstractCode's
|
|
159
|
+
web app tags `web-vX.Y.Z`):
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
git tag -a vX.Y.Z -m "<package> X.Y.Z" && git push origin vX.Y.Z
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
- Or `workflow_dispatch` from main, with the inputs that workflow declares (the run builds,
|
|
166
|
+
publishes and creates the tag; required where the environment admits only `main`, as for
|
|
167
|
+
AbstractAssistant):
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
gh workflow run release.yml --ref main -f version=X.Y.Z # most Python packages
|
|
171
|
+
gh workflow run release.yml --ref main -f version=X.Y.Z -f publish=true \
|
|
172
|
+
-f publish_confirmation=publish-<package>-X.Y.Z # AbstractRuntime, AbstractMusic
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
- Follow the run: `gh run list --workflow release.yml --branch vX.Y.Z -L 1` for a tag push
|
|
176
|
+
(`--event workflow_dispatch` for a dispatch), then `gh run watch <run-id> --exit-status`.
|
|
177
|
+
7. **Visibility gate.** The registry index lags the upload. Do not raise a floor upstream until
|
|
178
|
+
the version resolves:
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
python3 "$SKILL_DIR/scripts/pypi_visibility_gate.py" --wait 900 abstractvoice==X.Y.Z
|
|
182
|
+
python3 "$SKILL_DIR/scripts/pypi_visibility_gate.py" --wait 900 npm:@abstractframework/ui-kit==X.Y.Z
|
|
183
|
+
python3 "$SKILL_DIR/scripts/pypi_visibility_gate.py" --wait 900 crates:abstractgateway-console==X.Y.Z
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
8. **Floor propagation.** Raise the floor in each direct dependent the plan lists under
|
|
187
|
+
`dependency_floor_reviews`. Update the tests that pin floors literally in the same change
|
|
188
|
+
(for example AbstractGateway's `tests/test_gateway_install_profiles.py` and
|
|
189
|
+
`live_deltas.ABSTRACTRUNTIME_FLOOR`), respect the cross-package floor rules in
|
|
190
|
+
`references/package-inventory.md`, and refresh npm lockfiles after an AbstractUIC publish.
|
|
191
|
+
Rerun the planner and continue with the updated wave.
|
|
192
|
+
|
|
193
|
+
## Gates (never skipped without the operator's approval)
|
|
194
|
+
|
|
195
|
+
1. Adversarial review of every diff before merge.
|
|
196
|
+
2. Real-weights (engines) or real-gateway (routes) end-to-end proof on the machine.
|
|
197
|
+
3. Merge only when every check is `pass`; check the PR state after merging.
|
|
198
|
+
4. A parent is released only after each lower version is visible on its registry and the lower
|
|
199
|
+
package's release run is green.
|
|
200
|
+
5. Every dependent's floor or exact pin is raised or explicitly confirmed, with its pin tests.
|
|
201
|
+
6. One dated changelog section per released version; llms files regenerated; backlog item closed
|
|
202
|
+
with evidence; durable rules recorded as ADRs.
|
|
203
|
+
7. No publish from a checkout with uncommitted release-scope changes.
|
|
204
|
+
8. Root `abstractframework` last, and only when its pins, `RELEASE_VERSIONS`, install manifest,
|
|
205
|
+
installers and install docs match the released matrix. If the wave stops earlier, either
|
|
206
|
+
release the root profile in the same approved wave or file a backlog item and say plainly that
|
|
207
|
+
`pip install abstractframework[...]` still resolves the older matrix.
|
|
208
|
+
|
|
209
|
+
Stop and report on: an ambiguous version source, a duplicate target version, an unclear publish
|
|
210
|
+
destination, a red or unknown check, a version not visible on its registry, or a floor that still
|
|
211
|
+
points below a just-released version.
|
|
212
|
+
|
|
213
|
+
## Final report
|
|
214
|
+
|
|
215
|
+
End the wave with this report (one row per package touched, including the ones you decided not
|
|
216
|
+
to release):
|
|
217
|
+
|
|
218
|
+
```markdown
|
|
219
|
+
# AbstractFramework release wave <date>
|
|
220
|
+
|
|
221
|
+
| Package | Released | Registry | Release run | Floors raised in dependents |
|
|
222
|
+
|---|---|---|---|---|
|
|
223
|
+
| abstractvoice | 0.19.1 (from 0.18.2) | PyPI, visible | <run URL>, green | abstractcore >=0.19.1 |
|
|
224
|
+
| ... | not released: <reason> | | | |
|
|
225
|
+
|
|
226
|
+
## New capabilities (per package, user-facing)
|
|
227
|
+
- abstractvoice 0.19.1: ...
|
|
228
|
+
|
|
229
|
+
## Gates
|
|
230
|
+
- Adversarial reviews: <package: findings fixed / none>
|
|
231
|
+
- End-to-end proofs: <package: what ran, on which weights or gateway>
|
|
232
|
+
- Root profile: released X.Y.Z | not released, backlog <id>, users of `abstractframework[...]` still get <old matrix>
|
|
233
|
+
|
|
234
|
+
## Remaining work and improvements
|
|
235
|
+
- <package>: <follow-up>, backlog <id>
|
|
236
|
+
- Process: <what slowed the wave, the fix proposed>
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
## Scripts
|
|
240
|
+
|
|
241
|
+
- `scripts/abstract_release_plan.py [ROOT] [--registry] [--json] [-o FILE]`: read-only
|
|
242
|
+
inventory, dependency order, release signals per package, release wave, floor reviews, root pin
|
|
243
|
+
drift (pyproject pins and `RELEASE_VERSIONS` / `NPM_RELEASE_VERSIONS` / `CRATE_RELEASE_VERSIONS`),
|
|
244
|
+
changes outside any package, and packages missing from `scripts/lib/packages.txt`. Needs
|
|
245
|
+
Python 3.11+ (or `tomli` installed).
|
|
246
|
+
- `scripts/pypi_visibility_gate.py SPEC... [--from-plan FILE] [--wait SECONDS]`: checks that each
|
|
247
|
+
`name==version` (PyPI), `npm:@scope/name==version` or `crates:name==version` is installable from
|
|
248
|
+
its registry; `--from-plan` checks the plan's changed packages; with `--wait` it polls until
|
|
249
|
+
visible or the deadline passes. Exit code 0 only when all are visible. Python 3.9+.
|
|
250
|
+
|
|
251
|
+
## References
|
|
252
|
+
|
|
253
|
+
- `references/release-process.md`: the full process: order, per-package loop, gates in detail,
|
|
254
|
+
the scratch-gateway recipe, changelog/llms/backlog/ADR duties, approval packet, stop conditions,
|
|
255
|
+
partial releases, and the pitfalls seen in practice.
|
|
256
|
+
- `references/package-inventory.md`: the tiers, and per package its version source, release
|
|
257
|
+
trigger, registry environment, llms generator, and package-specific rules.
|
|
258
|
+
- `references/package-discovery.md`: how the planner discovers packages and reads its output.
|
|
259
|
+
|
|
260
|
+
## Keep every checkout in step with GitHub (repo sync rule)
|
|
261
|
+
|
|
262
|
+
Observed 2026-10-27: several local `main` checkouts were dozens of commits behind their remotes
|
|
263
|
+
(abstractuic 86, the root 10) because PRs were merged on GitHub while nobody pulled the local
|
|
264
|
+
checkout, and new branches were then cut from the stale main. Rules, every time:
|
|
265
|
+
|
|
266
|
+
1. Before cutting a branch or a worktree: `git -C <repo> fetch origin && git -C <repo> pull --ff-only origin main`
|
|
267
|
+
on the main checkout (a dirty checkout is left alone and reported; never stash someone else's work).
|
|
268
|
+
2. After merging a PR on GitHub: pull the local main checkout immediately (the merge watcher does it).
|
|
269
|
+
3. Worktrees are cut from `origin/main`, never from the local `main` ref.
|
|
270
|
+
4. A sweep before any release wave: for each repo, `rev-list --count main..origin/main` must be 0;
|
|
271
|
+
`scripts/status.sh` at the root prints ahead/behind per repo.
|
|
272
|
+
5. A root `main` that diverged (local release commits made elsewhere) is merged, never rebased: the
|
|
273
|
+
operator's commits keep their hashes; origin's pins and version win in conflicts, local docs and backlog
|
|
274
|
+
additions are kept, duplicated release sections are dropped.
|
|
275
|
+
|
|
276
|
+
## Final gate: the local source build of the whole stack
|
|
277
|
+
|
|
278
|
+
After the root pins are released, run the operator's own developer path before the final report:
|
|
279
|
+
`./scripts/status.sh` (every repo on `main`, 0 behind, no checkout left on a feature branch by a worker)
|
|
280
|
+
and `./scripts/build.sh` (editable Python installs, every npm package built from local packs, every Rust
|
|
281
|
+
crate compiled tier by tier). A failure there is a release defect even when every registry install passes:
|
|
282
|
+
a crate that does not compile from a clean checkout, a pin that does not resolve locally, a checkout left
|
|
283
|
+
behind. Operator-modified files are reported, never built around: say which file fails and whose edit it is.
|
|
284
|
+
|
|
285
|
+
## Final report: the summary table, then "show me your work"
|
|
286
|
+
|
|
287
|
+
The per-package summary table (package | released | new capabilities | remaining work) is the right
|
|
288
|
+
visibility level and stays. It is NOT the report. For every track of the wave add a "show me your work"
|
|
289
|
+
section with exactly three parts, written for the operator who was not watching:
|
|
290
|
+
|
|
291
|
+
- **(a) What was tested:** the suites and counts per package, the end-to-end runs on real weights or a
|
|
292
|
+
real gateway (what scenario, which model, which data), the mutation checks (which rule was removed and
|
|
293
|
+
which test went red), the adversarial review rounds and verdicts, the conformance fixtures (how many,
|
|
294
|
+
real vs synthetic).
|
|
295
|
+
- **(b) What it enables or fixes:** in the operator's words: the user-visible behaviour before and after,
|
|
296
|
+
and which apps/clients actually consume it today versus which still have to migrate (name each client
|
|
297
|
+
and its state: migrated / designed-for / untouched). Never present a served capability as integrated
|
|
298
|
+
when no client reads it.
|
|
299
|
+
- **(c) Proofs:** numbers a human can read: latency and memory before/after, sizes, counts, run ids,
|
|
300
|
+
PR links, registry versions, and one concrete example (a ledger, a run, a voice) walked end to end.
|
|
301
|
+
|
|
302
|
+
A track whose clients are not migrated is reported as "foundation released, integration pending" with the
|
|
303
|
+
migration list and an ETA, never folded into "done".
|
|
304
|
+
|
|
305
|
+
## Think like an architect before closing anything (operator, 2026-10-28)
|
|
306
|
+
|
|
307
|
+
Before a package is held, a track is called done, or a wave is closed, the coordinator (or its adversarial
|
|
308
|
+
reviewer) answers these questions in writing:
|
|
309
|
+
|
|
310
|
+
- What happens if I do not release all the pending changes I have been working on? What breaks for the
|
|
311
|
+
person who installs or builds from source tomorrow?
|
|
312
|
+
- What happens if I do not release this package just yet? Which consumer is left on a stale floor?
|
|
313
|
+
- Did I fully implement AND reuse the functionality I just created in the consumers of that code?
|
|
314
|
+
(A shared component in abstractuic or a gateway contract exists only when the apps consume it:
|
|
315
|
+
AbstractCode, AbstractAssistant, AbstractObserver, AbstractContinuum, AbstractFlow, AbstractNote,
|
|
316
|
+
the consoles.) List each consumer with migrated / pending.
|
|
317
|
+
- Is the result production-grade for a person, not only green for CI?
|
|
318
|
+
|
|
319
|
+
The goal is always a finished, production-grade solution that benefits from the change; the secondary goal
|
|
320
|
+
is the supervisor's visibility: a roadmap while work is ongoing, and at the end a report that shows the
|
|
321
|
+
work (what is new or fixed, what it enables now or later, why it is good). Keep it a dialogue: ask early
|
|
322
|
+
when a decision is genuinely the operator's, decide and say so when it is not.
|
|
323
|
+
|
|
324
|
+
## Backlog discipline for work left pending
|
|
325
|
+
|
|
326
|
+
When a task cannot be carried on now (time, credits, a blocker, a decision), write the backlog item
|
|
327
|
+
immediately, while the understanding is fresh: `proposed` when the need is likely, `planned` when it is
|
|
328
|
+
certain; it carries the analysis, the chosen route, the evidence so far and the open decision.
|
|
329
|
+
When an item is picked up later, start with an adversarial review of the item itself: is its knowledge
|
|
330
|
+
still current, is it still the best route (new research, superseded component, changed contract)?
|
|
331
|
+
|
|
332
|
+
## Changelog fragments (gateway, core, runtime; since 2026-10-29)
|
|
333
|
+
|
|
334
|
+
These repos no longer edit `CHANGELOG.md [Unreleased]` per PR. Each PR adds `changelog.d/<pr-or-slug>.md`; CI fails a PR that touches source without a fragment. At release time, before the version bump commit:
|
|
335
|
+
|
|
336
|
+
```
|
|
337
|
+
python scripts/changelog.py check # every fragment well-formed
|
|
338
|
+
python scripts/changelog.py preview # what the section will say
|
|
339
|
+
python scripts/changelog.py assemble X.Y.Z # writes the [X.Y.Z] section, deletes the fragments
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
Commit the assembled section with the version bump. Never hand-edit `[Unreleased]` in these repos.
|
|
343
|
+
|
|
344
|
+
## A conflicting PR gets no CI run
|
|
345
|
+
|
|
346
|
+
GitHub creates `pull_request` runs from the merge ref; a PR whose `mergeStateStatus` is DIRTY has none, so pushes to it create no run and no error. Before pushing a fix: merge `origin/main` into the branch, then `gh pr view N --json mergeStateStatus` must say CLEAN/BLOCKED, never DIRTY.
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "Abstract Release"
|
|
3
|
+
short_description: "Release AbstractFramework packages in dependency order, with gates."
|
|
4
|
+
default_prompt: "Use $abstract-release to plan an AbstractFramework release wave from the changed packages upward, run each package through review, end-to-end proof, all-green merge, publish and registry visibility, propagate dependency floors, and end with the wave report."
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Package Discovery
|
|
2
|
+
|
|
3
|
+
`scripts/abstract_release_plan.py` builds a deterministic, read-only picture of the workspace. Run
|
|
4
|
+
it before the wave, after every release, and after every floor bump.
|
|
5
|
+
|
|
6
|
+
```bash
|
|
7
|
+
python3 "$SKILL_DIR/scripts/abstract_release_plan.py" "$AF_ROOT" --registry
|
|
8
|
+
python3 "$SKILL_DIR/scripts/abstract_release_plan.py" "$AF_ROOT" --registry --json -o "$AF_ROOT/untracked/release-plan.json"
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Without a path it uses `ABSTRACTFRAMEWORK_ROOT`, else the nearest ancestor of the current directory
|
|
12
|
+
that holds `scripts/lib/packages.txt`, and stops with an error when there is none (it never walks
|
|
13
|
+
an arbitrary directory unless you pass it explicitly). It needs Python 3.11+ (tomllib) or the
|
|
14
|
+
`tomli` backport.
|
|
15
|
+
|
|
16
|
+
## Release signals
|
|
17
|
+
|
|
18
|
+
A package is **changed** (a release candidate) when any of these holds:
|
|
19
|
+
|
|
20
|
+
- uncommitted changes in its directory (`git status`);
|
|
21
|
+
- commits touching its directory since its last release tag (`git describe --match 'v*'`; a
|
|
22
|
+
package in a sub-directory with its own tag family, such as AbstractCode's `web-v*`, uses it).
|
|
23
|
+
Tags are read locally: run `git fetch --tags` in each repository first, or a release a workflow
|
|
24
|
+
tagged remotely shows as untagged;
|
|
25
|
+
- for a package at its repository root, no local tag `v<version>`;
|
|
26
|
+
- with `--registry`, its local version is missing from PyPI, npm or crates.io (a 404; a network
|
|
27
|
+
error leaves it unknown, never "unpublished").
|
|
28
|
+
|
|
29
|
+
Every package downstream of a changed package joins the wave as "floor review only".
|
|
30
|
+
|
|
31
|
+
## How it finds packages
|
|
32
|
+
|
|
33
|
+
- **With the inventory** (`scripts/lib/packages.txt`, the list the workspace scripts read): one
|
|
34
|
+
package per row, read from `<repo>/<path>` (`pyproject.toml`, `package.json` or `Cargo.toml`).
|
|
35
|
+
Scratch copies elsewhere in the workspace (worktrees and audits under `untracked/`, release
|
|
36
|
+
checkouts) are never mistaken for the real package.
|
|
37
|
+
- **Without the inventory**: a filesystem walk that skips `untracked/`, virtualenvs,
|
|
38
|
+
`node_modules`, `site-packages`, build output and `*-backup` / `*-gh-pages` folders, plus the
|
|
39
|
+
local experiment projects (`abstractaudio`, `abstractsound`, `abstractvideo`,
|
|
40
|
+
`abstractcognition`, `abstractgeometry`, `abstractspatial`). Two packages with the same name stop
|
|
41
|
+
the run with both paths listed.
|
|
42
|
+
|
|
43
|
+
The root meta-package's `NPM_RELEASE_VERSIONS` and `CRATE_RELEASE_VERSIONS` pins count as
|
|
44
|
+
dependency edges, so an app or crate release reaches the root's floor review.
|
|
45
|
+
|
|
46
|
+
For each package it reads the version (static, or the setuptools `attr` the pyproject points to),
|
|
47
|
+
the internal dependencies (Python `dependencies` and extras, npm dependency groups, Cargo
|
|
48
|
+
`[dependencies]`), and `git status` for the package directory. Changes inside a nested package's
|
|
49
|
+
directory belong to that package (AbstractUIC's packages, the gateway's `console-tui` crate,
|
|
50
|
+
AbstractNote's `web` app, the sibling repositories under the root).
|
|
51
|
+
|
|
52
|
+
Vite source aliases into the AbstractUIC checkout are not in any manifest. With the inventory they
|
|
53
|
+
come from its `alias` edges (verified by `./scripts/deps.sh check`); without it, from a text scan
|
|
54
|
+
of the package sources for sibling npm package names, which can over-report.
|
|
55
|
+
|
|
56
|
+
## Output
|
|
57
|
+
|
|
58
|
+
The Markdown is for reading; the JSON is for follow-up checks and release logs.
|
|
59
|
+
|
|
60
|
+
- `ordered_packages`: every package in dependency order (ties broken by the ADR-0034 tier rank).
|
|
61
|
+
- `release_wave`: changed packages (`changed: true`, with the reasons) plus every package
|
|
62
|
+
downstream of one (`floor review only`).
|
|
63
|
+
- `dependency_floor_reviews`: each internal requirement inside the wave, with the declared range
|
|
64
|
+
and the lower package's local version: raise or confirm it after the lower publish is visible.
|
|
65
|
+
- `profile_pin_reviews`: the root pins (`pyproject.toml` exact pins, `RELEASE_VERSIONS`,
|
|
66
|
+
`NPM_RELEASE_VERSIONS`, `CRATE_RELEASE_VERSIONS`) against local versions; `drift` means the root
|
|
67
|
+
profile would not deliver the local version.
|
|
68
|
+
- `changes_outside_packages`: uncommitted changes in a package repository that no package
|
|
69
|
+
directory owns (for example AbstractUIC's root `package.json`, which names its release tag, and
|
|
70
|
+
its lockfile). Assign them to a release by hand.
|
|
71
|
+
- `inventory_gaps`: packages the workspace scripts would miss: `repo_not_in_inventory` (a sibling
|
|
72
|
+
AbstractFramework repository with no row), `package_not_in_inventory` (a public manifest tracked
|
|
73
|
+
in a listed repository, outside tests, fixtures, examples and docs), `not_cloned`,
|
|
74
|
+
`name_mismatch`.
|