Skip to content

Commit 528b933

Browse files
committed
test: complete executable encoding coverage
Preserve reviewed runtime admission and cover each execute bit. Cover every standard Mach-O encoding and accurate evidence locator. Retain valid signed bundles, caches and ordinary excluded diagnostics. Actual signed native100 RED precedes code and coherent0.55.10 delivery.
1 parent d20d6a5 commit 528b933

20 files changed

Lines changed: 591 additions & 148 deletions

‎CHANGELOG.md‎

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,35 @@ All notable changes to this project will be documented in this file.
1010

1111
---
1212

13+
## [0.55.10] - 2026-10-13
14+
15+
### Security
16+
17+
- Reject malformed alternate project manifests during authenticated admission without aborting CLI startup.
18+
19+
- Require authenticated project authority for indirect category mounts and shared member loaders, including bundle aliases and cross-category claims.
20+
21+
- Bind privileged project registration metadata and executable inventory to authenticated artifact bytes; reproduce source caches before the final file check and recheck authority before registration effects.
22+
23+
- Reject category-less grouped workspace root commands, external claims to permanent core commands and
24+
unauthenticated workspace claims to official category roots before registry, bridge or import-source activation.
25+
- Preserve resolved built-in authority, reject forged source labels and escaping symlinks, and prevent
26+
rejected workspace sources from shadowing eligible package dependencies.
27+
- Reject unsigned executable caches and omitted Python/native artifacts; authenticate captured signed source
28+
bytes before reproducing compatible interpreter caches without executing candidate code.
29+
30+
### Fixed
31+
32+
- Select the first fully eligible copy of each module, reconsider dependency fallbacks against selected versions
33+
and each candidate's own version, and refuse contradictory priority cycles before registration effects.
34+
- Preserve categorized routing and supported unreserved legacy registration, including operator-configured
35+
built-in discovery, while retaining the completed removal of flat bundle shims.
36+
- Preserve all six official project-scoped bundle roots only after full artifact checksum and signature
37+
verification against the core-bundled key; reject unsigned, tampered and workspace-key replacements.
38+
- Preserve genuine installed bundles when a rejected project copy claims the same name, retain authenticated
39+
project priority, and skip artifact payload verification for disabled module names.
40+
- Synchronize bugfix version declarations, frozen project metadata and the promotion fixture.
41+
1342
## [0.55.9] - 2026-10-13
1443

1544
### Security

‎docs/reference/module-categories.md‎

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ nav_order: 35
55
permalink: /reference/module-categories/
66
doc_owner: specfact-cli
77
tracks: [src/specfact_cli/registry/**, ../specfact-cli-modules/packages/**]
8-
last_reviewed: 2026-07-10
8+
last_reviewed: 2026-10-11
99
exempt: false
1010
exempt_reason: ""
1111
---
@@ -91,6 +91,15 @@ Namespace mapping:
9191
Compatibility note:
9292

9393
- Flat top-level command shims were removed. Use category groups (`project`, `backlog`, `code`, `spec`, `govern`, `requirements`).
94+
- Category-less workspace modules are skipped in default grouped mode. Add category/bundle metadata to
95+
use the supported grouped surface. Explicitly disabling grouping preserves unreserved legacy workspace
96+
commands; category-less user, marketplace and custom sources retain their compatibility path.
97+
- Permanent core commands (`init`, `module`, `upgrade`) are reserved for resolved built-in package paths.
98+
Operator-selected built-in discovery remains supported. External packages cannot extend these roots
99+
by declaring a core category, name or source label. Workspace packages also cannot supply official
100+
category root command apps in either mode. Rejected packages contribute no active import roots,
101+
schema extensions, service bridges or category mounts. Eligible categorized execution remains
102+
intentional extension behavior; this guard is not a sandbox.
94103
- `specfact backlog auth ...` is provided by the backlog bundle, not by the permanent core command surface.
95104
- Prerelease `specfact-requirements` manifests that still declare category
96105
`project` with `bundle_group_command: requirements` are normalized to the

‎docs/reference/module-security.md‎

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,34 @@ Module packages carry **publisher** and **integrity** metadata so installation,
1919
- **Publisher trust gate**: Non-official publishers require one-time explicit trust (interactive confirmation or `--trust-non-official` / `SPECFACT_TRUST_NON_OFFICIAL`).
2020
- **Denylist gate**: Modules listed in denylist are blocked before install/bootstrap regardless of source.
2121

22+
## Workspace command authority
23+
24+
Default grouped registration rejects category-less project modules before registration or import effects.
25+
Permanent `init`, `module` and `upgrade` commands require resolved built-in package paths in both modes.
26+
Unverified workspace packages cannot supply the official `project`, `backlog`, `code`, `spec`, `govern` or
27+
`requirements` roots. Supported official bundles installed with `--scope project` retain their canonical roots
28+
only after complete filesystem checksum and signature verification, including untracked module source files,
29+
against the public key bundled with the CLI and matching
30+
signed official bundle metadata. Payload symlink members, standalone bytecode, uncovered executable source and missing keys fail closed.
31+
Current-interpreter source caches remain compatible only when their compiled bytes match the signed source.
32+
Verification compares those bytes without executing or deserializing candidate caches. Unsigned/test flags, installation receipts and
33+
`SPECFACT_MODULE_PUBLIC_KEY_PEM` overrides cannot grant these project root commands.
34+
35+
Categorized project packages can populate shared category-member loaders even when their commands do not name a
36+
root. They therefore require authenticated official bundle authority before candidate selection and registration.
37+
The same gate covers category mounts induced by explicit bundle metadata or namespaced bundle aliases.
38+
Explicit legacy registration retains unreserved category-less project commands without an official mount claim;
39+
non-project categorized routing retains its existing policy. These controls protect command admission and import activation, and do not sandbox intentionally
40+
invoked module code.
41+
42+
## Preparing project-scoped release artifacts
43+
44+
Publish regular payload files rather than symlinks. Replace links with their intended files before signing;
45+
remove standalone bytecode and executable files under directories excluded from signing. Regenerate ordinary
46+
source caches with the target interpreter, or remove stale or transformed caches before project installation.
47+
The strict project-root admission check independently verifies these conditions. Passing a companion repository
48+
signing or release-verification command alone does not establish eligibility for privileged project roots.
49+
2250
## Integrity flow
2351

2452
1. Discovery reads `module-package.yaml` and parses `integrity.checksum`.
@@ -104,3 +132,9 @@ Module packages carry **publisher** and **integrity** metadata so installation,
104132
## Versioned dependencies
105133

106134
Manifest may declare versioned module and pip dependencies via `module_dependencies_versioned` and `pip_dependencies_versioned` (each entry: `name`, `version_specifier`). These are parsed and stored for installation-time resolution while keeping legacy `module_dependencies` / `pip_dependencies` lists backward compatible.
135+
136+
Privileged project-root admission binds discovery fields to the same normalized manifest captured in the signed
137+
payload. It also completes reproduction of any permitted source caches before checking a fresh executable inventory.
138+
The final check compares membership, source/native digests and raw cache bodies without executing candidate code or
139+
invoking compilation. Admission and its recheck precede schema, bridge, protocol and import-root registration effects.
140+
These checks authenticate the admission snapshot; they do not make a mutable workspace immutable after admission.

‎openspec/changes/fix-categoryless-module-command-squatting/CHANGE_VALIDATION.md‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,14 @@
1+
2+
## Signed native100 RED verified — 15 October 2026 (Europe/Berlin)
3+
4+
Signed specification6c63d63323e94a7c633c69ea964c85c3d1c9c71c precedes signed authored testsd20d6a56e9781a740a1c82907158c671ad3d4b7f on unchanged protected production/version.
5+
Actual native run38647654283, artifact11932289125, service ZIP SHA2568429e0ff751d0fcd044cda08b1d4225ca2ea494b94b5330c90bbf24c384151bc, has100 genuine AssertionErrors,
6+
zero errors/skips and exact source/tree/base/selectors plus all8 authored test hashes. Its RED gate passes
7+
with zero proof findings. JUnit digest:sha256:6a252b0198a77bdc86e5bb7511af4843a68fe7b836c1856b8c5f870c4ea54ea5. Reviewed production/version0.55.10 is restored only
8+
after this real service artifact and bindings are verified. Deliberate RED workflow failure is evidence,
9+
not final merge-ready CI. Final native producer/execution/FULL review, required CI, live exact-head authority
10+
and completed current-head review remain required; no target merge is authorized. Companion symlink blocker remains.
11+
112
## Current accepted100 signed authoring — 15 October 2026 (Europe/Berlin)
213

314
The human accepted exact per-source100 mapping4c3ded1d98d1437c1de1fb73c243ad71d804506769135ea42581e9b3781ed274

‎openspec/changes/fix-categoryless-module-command-squatting/TDD_EVIDENCE.md‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,14 @@
1+
2+
## Signed native100 RED verified — 15 October 2026 (Europe/Berlin)
3+
4+
Signed specification6c63d63323e94a7c633c69ea964c85c3d1c9c71c precedes signed authored testsd20d6a56e9781a740a1c82907158c671ad3d4b7f on unchanged protected production/version.
5+
Actual native run38647654283, artifact11932289125, service ZIP SHA2568429e0ff751d0fcd044cda08b1d4225ca2ea494b94b5330c90bbf24c384151bc, has100 genuine AssertionErrors,
6+
zero errors/skips and exact source/tree/base/selectors plus all8 authored test hashes. Its RED gate passes
7+
with zero proof findings. JUnit digest:sha256:6a252b0198a77bdc86e5bb7511af4843a68fe7b836c1856b8c5f870c4ea54ea5. Reviewed production/version0.55.10 is restored only
8+
after this real service artifact and bindings are verified. Deliberate RED workflow failure is evidence,
9+
not final merge-ready CI. Final native producer/execution/FULL review, required CI, live exact-head authority
10+
and completed current-head review remain required; no target merge is authorized. Companion symlink blocker remains.
11+
112
## Current accepted100 signed authoring — 15 October 2026 (Europe/Berlin)
213

314
The human accepted exact per-source100 mapping4c3ded1d98d1437c1de1fb73c243ad71d804506769135ea42581e9b3781ed274

‎openspec/changes/fix-categoryless-module-command-squatting/tasks.md‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ effects.
133133

134134
- [ ] Reproduce bundle-induced mounts and existing-root replacement through public registration.
135135
- [ ] Bind indirect category capabilities to authenticated project authority before effects.
136-
- [ ] Extend native-format controls for `.so` and `.pyd` and retain clear required fixture diagnostics.
136+
- [x] Extend native-format controls for `.so` and `.pyd` and retain clear required fixture diagnostics.
137137
- [ ] Revalidate full delivery, canonical mapping acceptance and exact-current native RED/GREEN/review.
138138

139139
## Alternate-manifest review follow-up
@@ -192,4 +192,5 @@ No production behavior, pin, threshold, timeout, signature format or global depe
192192
- [x] Complete final full3420/FULL19score72/types0/1456 with unchanged inputs/graphs.
193193
- [x] Complete final standalone verify-fix before diverse review on194bf bytes, no actionable findings.
194194
- [ ] Obtain fresh exact100 mapping acceptance before signed/native publication.
195-
- [ ] Obtain signed native100 RED before runtime restoration and actual final native/CI/completed review.
195+
- [x] Obtain signed native100 RED38647654283 with100 genuine assertion failures and all18 encoding observations before runtime restoration.
196+
- [ ] Verify final native100 GREEN, all required CI and completed current-head review.

‎pyproject.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
44

55
[project]
66
name = "specfact-cli"
7-
version = "0.55.9"
7+
version = "0.55.10"
88
description = "AI-bloat defense CLI for Python teams. Run deterministic code review, cleanup forecasts, and spec/contract evidence for AI-assisted and brownfield delivery."
99
readme = "README.md"
1010
requires-python = ">=3.11"

‎setup.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
if __name__ == "__main__":
88
_setup = setup(
99
name="specfact-cli",
10-
version="0.55.9",
10+
version="0.55.10",
1111
description=(
1212
"AI-bloat defense CLI for Python teams. Run deterministic code review, cleanup forecasts, "
1313
"and spec/contract evidence for AI-assisted and brownfield delivery."

‎src/__init__.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@
33
"""
44

55
# Package version: keep in sync with pyproject.toml, setup.py, src/specfact_cli/__init__.py
6-
__version__ = "0.55.9"
6+
__version__ = "0.55.10"

‎src/specfact_cli/__init__.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,6 @@ def _install_progressive_disclosure() -> None:
7676
# keeps missing-command and missing-parameter UX consistent outside the root CLI too.
7777
_install_progressive_disclosure()
7878

79-
__version__ = "0.55.9"
79+
__version__ = "0.55.10"
8080

8181
__all__ = ["__version__"]

0 commit comments

Comments
 (0)