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.
Files changed (98) hide show
  1. {abstractskill-0.3.2/src/abstractskill.egg-info → abstractskill-0.3.4}/PKG-INFO +6 -2
  2. {abstractskill-0.3.2 → abstractskill-0.3.4}/README.md +5 -1
  3. {abstractskill-0.3.2 → abstractskill-0.3.4}/pyproject.toml +1 -1
  4. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/__init__.py +1 -1
  5. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/catalog.yaml +1 -1
  6. abstractskill-0.3.4/src/abstractskill/registry/skills/abstract-release/SKILL.md +346 -0
  7. abstractskill-0.3.4/src/abstractskill/registry/skills/abstract-release/agents/openai.yaml +4 -0
  8. abstractskill-0.3.4/src/abstractskill/registry/skills/abstract-release/references/package-discovery.md +74 -0
  9. abstractskill-0.3.4/src/abstractskill/registry/skills/abstract-release/references/package-inventory.md +140 -0
  10. abstractskill-0.3.4/src/abstractskill/registry/skills/abstract-release/references/readiness-audit.md +54 -0
  11. abstractskill-0.3.4/src/abstractskill/registry/skills/abstract-release/references/release-process.md +227 -0
  12. abstractskill-0.3.4/src/abstractskill/registry/skills/abstract-release/scripts/abstract_release_plan.py +1123 -0
  13. abstractskill-0.3.4/src/abstractskill/registry/skills/abstract-release/scripts/pypi_visibility_gate.py +207 -0
  14. abstractskill-0.3.4/src/abstractskill/registry/skills/abstractframework-website/SKILL.md +110 -0
  15. abstractskill-0.3.4/src/abstractskill/registry/skills/abstractframework-website/references/check_site.py +83 -0
  16. abstractskill-0.3.4/src/abstractskill/registry/skills/abstractframework-website/references/preview_server.py +95 -0
  17. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/coredoc/SKILL.md +68 -1
  18. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/validations.yaml +69 -4
  19. {abstractskill-0.3.2 → abstractskill-0.3.4/src/abstractskill.egg-info}/PKG-INFO +6 -2
  20. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill.egg-info/SOURCES.txt +11 -0
  21. {abstractskill-0.3.2 → abstractskill-0.3.4}/tests/test_bundled.py +4 -4
  22. {abstractskill-0.3.2 → abstractskill-0.3.4}/tests/test_shelf.py +11 -1
  23. {abstractskill-0.3.2 → abstractskill-0.3.4}/LICENSE +0 -0
  24. {abstractskill-0.3.2 → abstractskill-0.3.4}/setup.cfg +0 -0
  25. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/bundled.py +0 -0
  26. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/catalog.py +0 -0
  27. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/demand.py +0 -0
  28. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/errors.py +0 -0
  29. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/hash.py +0 -0
  30. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/loader.py +0 -0
  31. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/models.py +0 -0
  32. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/parser.py +0 -0
  33. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/policy.py +0 -0
  34. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/prompt.py +0 -0
  35. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/advisories.yaml +0 -0
  36. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/guidance.yaml +0 -0
  37. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/licenses/meshvault-live-editing.LICENSE +0 -0
  38. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/licenses/verification-before-completion.LICENSE +0 -0
  39. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/abstractframework-gateway/SKILL.md +0 -0
  40. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/adr/SKILL.md +0 -0
  41. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/adr/agents/openai.yaml +0 -0
  42. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/adr/references/adr-template-and-workflow.md +0 -0
  43. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/adr/references/default-adr-catalog.md +0 -0
  44. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/adr/references/reader-first-adr-style.md +0 -0
  45. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/adversarial-iteration/SKILL.md +0 -0
  46. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/agora-collaboration/SKILL.md +0 -0
  47. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/agora-collaboration/references/failure-ledger.md +0 -0
  48. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/agora-collaboration/references/mechanics.md +0 -0
  49. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/architect/SKILL.md +0 -0
  50. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/architect/agents/openai.yaml +0 -0
  51. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/architect/references/reviewer-memory.md +0 -0
  52. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/backlog/SKILL.md +0 -0
  53. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/backlog/agents/openai.yaml +0 -0
  54. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/backlog/references/abstractframework-board.md +0 -0
  55. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/backlog/references/hub-work-join.md +0 -0
  56. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/backlog/references/layout-and-templates.md +0 -0
  57. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/backlog/references/maintenance-checklists.md +0 -0
  58. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/cicd/SKILL.md +0 -0
  59. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/cicd/agents/openai.yaml +0 -0
  60. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/cicd/references/docs-and-containers.md +0 -0
  61. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/cicd/references/maintenance-playbook.md +0 -0
  62. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/cicd/references/package-publishing.md +0 -0
  63. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/cicd/references/repository-setup.md +0 -0
  64. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/cicd/references/workflow-patterns.md +0 -0
  65. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/coredoc/agents/openai.yaml +0 -0
  66. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/coredoc/references/agent-skill.md +0 -0
  67. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/coredoc/references/core-doc-set.md +0 -0
  68. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/coredoc/references/llms-files.md +0 -0
  69. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/coredoc/references/maintenance-playbook.md +0 -0
  70. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/entity-observation/SKILL.md +0 -0
  71. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/entity-self-knowledge/SKILL.md +0 -0
  72. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/entity-self-knowledge/references/capability_map.md +0 -0
  73. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/meshvault-live-editing/SKILL.md +0 -0
  74. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/review/SKILL.md +0 -0
  75. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/review/agents/openai.yaml +0 -0
  76. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/review/references/reviewer-memory.md +0 -0
  77. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/uxreview/SKILL.md +0 -0
  78. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/uxreview/agents/openai.yaml +0 -0
  79. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/uxreview/references/reviewer-memory.md +0 -0
  80. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/registry/skills/verification-before-completion/SKILL.md +0 -0
  81. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/selection.py +0 -0
  82. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/tree.py +0 -0
  83. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/trust.py +0 -0
  84. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill/validation.py +0 -0
  85. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill.egg-info/dependency_links.txt +0 -0
  86. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill.egg-info/requires.txt +0 -0
  87. {abstractskill-0.3.2 → abstractskill-0.3.4}/src/abstractskill.egg-info/top_level.txt +0 -0
  88. {abstractskill-0.3.2 → abstractskill-0.3.4}/tests/test_audience.py +0 -0
  89. {abstractskill-0.3.2 → abstractskill-0.3.4}/tests/test_catalog.py +0 -0
  90. {abstractskill-0.3.2 → abstractskill-0.3.4}/tests/test_demand.py +0 -0
  91. {abstractskill-0.3.2 → abstractskill-0.3.4}/tests/test_loader.py +0 -0
  92. {abstractskill-0.3.2 → abstractskill-0.3.4}/tests/test_parser.py +0 -0
  93. {abstractskill-0.3.2 → abstractskill-0.3.4}/tests/test_policy.py +0 -0
  94. {abstractskill-0.3.2 → abstractskill-0.3.4}/tests/test_refresh_shelf_pins.py +0 -0
  95. {abstractskill-0.3.2 → abstractskill-0.3.4}/tests/test_selection.py +0 -0
  96. {abstractskill-0.3.2 → abstractskill-0.3.4}/tests/test_tree.py +0 -0
  97. {abstractskill-0.3.2 → abstractskill-0.3.4}/tests/test_trust.py +0 -0
  98. {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.2
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/ # 14 curated skills (one folder per SKILL.md)
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/ # 14 curated skills (one folder per SKILL.md)
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.2"
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"
@@ -140,4 +140,4 @@ __all__ = [
140
140
  "validate_skill_name",
141
141
  ]
142
142
 
143
- __version__ = "0.3.2"
143
+ __version__ = "0.3.4"
@@ -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.10.21"
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`.