You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Folded into the in-flight 0.18.0 release. All items now in CHANGELOG.md
[0.18.0] - 2026-04-08.
Changed:
- MAX_MODULE_ID_LENGTH raised from 128 to 192 (apcore.registry.registry).
Tracks PROTOCOL_SPEC §2.7 EBNF constraint #1 update. Module IDs valid
before this change remain valid; only the upper bound moved. Forward-
compatible relaxation: older 0.17.x/0.18.x readers will reject IDs in
the 129-192 range emitted by this version.
- Registry.register() and Registry.register_internal() now share a
_validate_module_id() helper that runs validation in canonical order:
empty → EBNF pattern → length → reserved word per-segment. The
reserved-word check is the only step register_internal() skips (so sys
modules can use the system.* prefix); empty/pattern/length/duplicate
now apply uniformly. Aligned cross-language with apcore-typescript and
apcore-rust.
- register_internal() now enforces empty/pattern/length/duplicate checks.
Previously bypassed every validation step. Production callers
(apcore.sys_modules.*) all use canonical-shape IDs so no in-tree
caller is broken; external adapters that used register_internal as a
generic escape hatch should review.
- Duplicate registration error message canonicalized to
"Module ID '<id>' is already registered" (was "Module already exists:
<id>" for register_internal). Both register() and register_internal()
now emit the same message. Byte-aligned with apcore-rust and
apcore-typescript.
Added:
- Pipeline preset builders re-exported at package root:
build_standard_strategy, build_internal_strategy, build_testing_strategy,
build_performance_strategy, build_minimal_strategy. These functions
existed in apcore.builtin_steps but were not in apcore.__all__. Parity
with apcore-typescript (buildXxxStrategy) and apcore-rust
(build_xxx_strategy at crate root).
- TestRegisterInternalValidation test class in
tests/registry/test_registry.py (6 parity tests) + two new
test_pipeline_preset_builders_* tests in tests/test_public_api.py +
tests/test_public_api.py EXPECTED_NAMES updated.
- tests/sys_modules/test_control.py: test_reload_module_calls_safe_unregister
now also mocks register_internal since the re-registration path now
enforces the duplicate-ID check (the test mocks safe_unregister so the
slot is never actually cleared).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: tercel <tercel.yi@gmail.com>
Copy file name to clipboardExpand all lines: CHANGELOG.md
+13-1Lines changed: 13 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -5,7 +5,19 @@ All notable changes to this project will be documented in this file.
5
5
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
8
-
## [0.18.0] - 2026-04-07
8
+
## [0.18.0] - 2026-04-08
9
+
10
+
### Added
11
+
12
+
-**Pipeline preset builders re-exported at package root** — `build_standard_strategy`, `build_internal_strategy`, `build_testing_strategy`, `build_performance_strategy`, `build_minimal_strategy` are now importable directly from `apcore`. These functions existed in `apcore.builtin_steps` but were not previously in `apcore.__all__`. Parity with apcore-typescript (`buildXxxStrategy`) and apcore-rust (`build_xxx_strategy` at the crate root).
13
+
-**`TestRegisterInternalValidation`** test class in `tests/registry/test_registry.py` (6 parity tests covering empty rejection, pattern rejection, over-length rejection, reserved-word bypass, duplicate rejection, accept-at-max-length) plus `test_pipeline_preset_builders_*` in `tests/test_public_api.py`.
14
+
15
+
### Changed
16
+
17
+
-**`MAX_MODULE_ID_LENGTH` raised from 128 to 192** (`apcore.registry.registry`). Tracks PROTOCOL_SPEC §2.7 EBNF constraint #1 update — accommodates Java/.NET deep-namespace FQN-derived IDs while remaining filesystem-safe (`192 + len('.binding.yaml') = 205 < 255`-byte filename limit on ext4/xfs/NTFS/APFS/btrfs). Module IDs valid before this change remain valid; only the upper bound moved. **Forward-compatible relaxation:** older 0.17.x/0.18.x readers will reject IDs in the 129–192 range emitted by this version.
18
+
-**`Registry.register()` and `Registry.register_internal()` now share a `_validate_module_id()` helper** that runs validation in canonical order (empty → EBNF pattern → length → reserved word per-segment). The reserved-word check is the only step `register_internal()` skips (so sys modules can use the `system.*` prefix); empty/pattern/length/duplicate now apply uniformly. Aligned cross-language with apcore-typescript and apcore-rust.
19
+
-**`register_internal()` now enforces empty / pattern / length / duplicate checks.** Previously bypassed every validation step. Production callers (`apcore.sys_modules.*`) all use canonical-shape IDs so no in-tree caller is broken; external adapters that used `register_internal` as a generic escape hatch should review.
20
+
-**Duplicate registration error message canonicalized** to `"Module ID '<id>' is already registered"` (was `"Module already exists: <id>"` for `register_internal`). Both `register()` and `register_internal()` now emit the same message via the shared error path. Aligned with apcore-rust and apcore-typescript byte-for-byte.
0 commit comments