plm-skill-kernel
Wave 2 Conv A (FTR-604). The Skill Kernel package — sibling of
plm-engine-core — that hosts the decorator-based Skill SDK, the V1
in-process dispatcher, and the Kernel HTTP server stub matching CR.10
§7.bis verbatim.
Layout
02_App/plm-skill-kernel/
├── pyproject.toml # editable install + import-linter contracts
├── plm_skill_kernel/
│ ├── __init__.py # re-exports `skill`, `SkillContext`, etc.
│ ├── __main__.py # `python -m plm_skill_kernel` → server
│ ├── server.py # FastAPI app at POST /v1/skills/{id}/invoke
│ ├── dispatcher.py # V1 in-process invoker
│ ├── registry.py # boot wiring — discovers + registers skills
│ ├── sdk/
│ │ ├── decorator.py # `@skill(id=, version=)`
│ │ ├── context.py # SkillContext Pydantic
│ │ ├── types.py # SkillInvokeRequest / SkillInvokeResult
│ │ └── _registry.py # in-process decorator registry
│ └── skills/ # 3 starter skills (Q-W2A-1 nested layout)
│ ├── cleansing/
│ │ ├── normalise.py # cleansing.normalise / 1.0.0 / L2
│ │ └── dedupe.py # cleansing.dedupe / 1.0.0 / L2
│ └── bpmn/
│ └── generate.py # bpmn.generate / 1.0.0 / L1 (thin proxy)
└── tests/ # unit + ASGI in-process integration
Editable install
cd 02_App/backend
.\venv\Scripts\Activate.ps1 # Windows
pip install -e ../plm-skill-kernel
Mirrors the plm-engine-core editable-install pattern.
Dev launch (Q-W2A-3)
python -m plm_skill_kernel # uvicorn on port 8100
plm-skill-kernel --port 8100 # equivalent CLI
The backend at port 8000 is unaffected. The V1.1 loopback round-trip
(D-CONV-M-4 closure) sends HTTP from the Engine Core dispatcher to
this Kernel server when SKILL_KERNEL_LOOPBACK=on.
V1 wire contract
POST /v1/skills/{id}/invoke — frozen at CR.10 §7.bis.
Headers:
X-Core-Caller: <UUID> (required when caller is Core)
Idempotency-Key: <uuid> (optional, V1)
traceparent: <W3C> (optional)
Request body (SkillInvokeRequest):
payload: Dict[str, Any]
version: str ("1.0.0", etc.)
autonomy_hint: Optional[str] ("L1" / "L2" / "L3")
Response body (SkillInvokeResult):
ok: bool
result: Optional[Dict[str, Any]]
error: Optional[SkillErrorEnvelope]
deferred_to: Optional[str]
cancelled: Optional[bool]
Knowledge corpora
knowledge.search / get_record / retrieve serve the in-process seed
(demo, foundation) plus every <corpus_id>.json under
PLM_KERNEL_CORPORA_DIR, loaded once at boot. Shape:
{"records": {"<record_id>": {title, body, source_uri, revision, payload}}};
source_uri and revision are required. A malformed file, or one reusing a
seed corpus_id, fails the boot. Search matches the exact phrase first, then
all query terms in any order (scored at half weight).
knowledge.list_records pages a whole corpus without a query
({corpus_id, limit, offset, with_body}), for catalogue views.
Skill authoring (Decision #59 — decorator)
from plm_skill_kernel import skill, SkillContext
@skill(id="cleansing.normalise", version="1.0.0")
async def normalise(payload: dict, ctx: SkillContext) -> dict:
return {"normalised": _normalise_records(payload["records"])}
The decorator auto-registers into the in-process registry at module
import time + carries version through to the federated manifest
builder (CR.9).
Import-linter contracts
Two Forbidden contracts live in pyproject.toml:
plm_skill_kernelMUST NOT importplm_engine_core— federation contract preservation. The two communicate over HTTP, not Python.plm_skill_kernelMUST NOT importplm_accelerators(Workbench) — mirror of the plm-engine-core constraint.
Run:
lint-imports --config 02_App/plm-skill-kernel/pyproject.toml
Tests
cd 02_App/plm-skill-kernel
python -m pytest -q
The V1.1 HTTP round-trip integration test mounts the FastAPI app via httpx.AsyncClient(ASGITransport) — no subprocess, no real port (Q-W2A-4).
Metadata
Release files for plm-skill-kernel 1.6.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| plm_skill_kernel-1.6.0.tar.gz | 150.5 kB | With provenance | Details for plm_skill_kernel-1.6.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| plm_skill_kernel-1.6.0-py3-none-any.whl | Python 3 | none | any | Details for plm_skill_kernel-1.6.0-py3-none-any.whl |
Total release size: 299.4 kB
Release files / plm_skill_kernel-1.6.0.tar.gz
| Download URL | plm_skill_kernel-1.6.0.tar.gz |
|---|---|
| Size | 150.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3fe0701620ee9a39fd856388980c99a561c52c79395616f7c2d364faa6255d3a
|
|
BLAKE2b-256 checksum How to use checksums |
1aad2bf8f6b3d7640bb7e59d7dd4b8f684121caa137940f610f20d5ce3e84431
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 9, 2026.
Transparency logRelease files / plm_skill_kernel-1.6.0-py3-none-any.whl
| Download URL | plm_skill_kernel-1.6.0-py3-none-any.whl |
|---|---|
| Size | 148.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
444053914ce9b25866d6f2907f36b77bb9fe0c6723c0618b4c8651dbfc411b96
|
|
BLAKE2b-256 checksum How to use checksums |
55197823fbff7639491ae2dc0fe8599d8257fec911fc7de692873b30248095f9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 9, 2026.
Transparency logSecurity for plm-skill-kernel 1.6.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
Both files in this release have been uploaded with provenance metadata.
Attestation for plm_skill_kernel-1.6.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 9, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.