TracePulse PLM Skill Kernel — Wave 2 Conv A. Decorator-based Skill SDK + V1 in-process dispatcher + Kernel HTTP server stub matching CR.10 §7.bis (POST /v1/skills/{id}/invoke). Ships 3 starter skills (cleansing.normalise, cleansing.dedupe, bpmn.generate). Sibling of plm-engine-core; the two communicate over the V1.1 HTTP loopback (SKILL_KERNEL_LOOPBACK=on) — no Python-level coupling at the dispatch boundary.
Project description
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]
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).
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file plm_skill_kernel-1.0.0.tar.gz.
File metadata
- Download URL: plm_skill_kernel-1.0.0.tar.gz
- Upload date:
- Size: 54.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
404ce85c3ff3b118870d3f505c589d641b71104150b25a38ce36980cc3906216
|
|
| MD5 |
fb9334119c95aa77111315944ba0b7af
|
|
| BLAKE2b-256 |
edda97fd3280cd3693fd868b14844b258689d7cadf8ea4e55455875c8ac596b0
|
File details
Details for the file plm_skill_kernel-1.0.0-py3-none-any.whl.
File metadata
- Download URL: plm_skill_kernel-1.0.0-py3-none-any.whl
- Upload date:
- Size: 61.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2a990d8052e9abe581e935b3a185eb35a21ff7af3bcb478b9280d4616df2b87b
|
|
| MD5 |
0f1cd20abb402f759a6f8ec0639b6681
|
|
| BLAKE2b-256 |
60fd257d4e544c6eaf3e2262bc2baa6addbc845b182ff9ce1d7595d6c928c010
|