19 KiB
Platform Source Policy Implementation Plan
For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (
- [ ]) syntax for tracking.
Goal: Mark built-in wf.* capability sources as platform sources so artifacts/deployments do not need self-bindings such as wf.std=wf.std.
Architecture: Add a small SourcePolicy value on CapabilitySource that distinguishes account-bound external sources from process-provided platform sources. Artifact requirement inference and deployment validation should skip binding requirements for platform sources, while runtime dependency resolution still resolves platform node names by exact source id. External source providers keep the current logical-source binding behavior.
Tech Stack: Python 3.14 dataclasses/Pydantic snapshots, wf_platform.CapabilitySource, wf_artifacts validation/factory, wf_api.runtime_dependencies, pytest.
File Structure
- Modify
src/wf_platform/sources.py: addSourcePolicy, snapshot model, andCapabilitySource.policy. - Modify
src/wf_api/local_sources.py: mark built-inwf.*sources as platform sources. - Modify MCP broker-local source creation if needed:
src/wf_mcp/broker/service/core.pyor source factory files that createwf.recipes/wf.mcp. - Modify
src/wf_artifacts/models.py: addplatform: bool = FalsetoAvailableSource. - Modify
src/wf_api/deployments.py: project source policy intoAvailableSource. - Modify
src/wf_artifacts/validation.py: skip binding lookup for platform required capabilities. - Modify
src/wf_api/artifacts.py: stop suggesting/returning required logical sources for platform sources. - Modify tests:
tests/platform/test_sources.pytests/wf_server/test_local_static_server.pytests/wf_transport_rpc_http/test_app.pytests/wf_api/test_artifact_api.pytests/artifacts/test_validation.py
Task 1: Add Source Policy Metadata
Files:
-
Modify:
src/wf_platform/sources.py -
Test:
tests/platform/test_sources.py -
Step 1: Add failing source policy test
In tests/platform/test_sources.py, add:
def test_capability_source_exposes_policy_snapshot() -> None:
source = CapabilitySource(
id="wf.std",
kind="system",
policy=SourcePolicy(platform=True, binding_required=False),
)
status = source.as_status()
assert status.policy.platform is True
assert status.policy.binding_required is False
assert status.model_dump(mode="json")["policy"] == {
"platform": True,
"binding_required": False,
}
Update imports in that test file:
from wf_platform import CapabilitySource, SourcePolicy
- Step 2: Run test and confirm failure
Run:
uv run pytest tests/platform/test_sources.py::test_capability_source_exposes_policy_snapshot -q
Expected: fails because SourcePolicy does not exist.
- Step 3: Implement source policy
In src/wf_platform/sources.py, add after SourcePermissions:
@dataclass(frozen=True, slots=True)
class SourcePolicy:
"""Runtime/deployment policy for one capability source.
Platform sources are process-provided built-ins such as `wf.std`. They are
not account-bound and should not require deployment source bindings.
"""
platform: bool = False
binding_required: bool = True
Add snapshot model after SourcePermissionsSnapshot:
class SourcePolicySnapshot(BaseModel):
"""Serializable source policy used by CLI/API inventory responses."""
platform: bool = False
binding_required: bool = True
Add to SourceStatus:
policy: SourcePolicySnapshot
Add to CapabilitySource:
policy: SourcePolicy = field(default_factory=SourcePolicy)
Add to as_status():
policy=SourcePolicySnapshot(
platform=self.policy.platform,
binding_required=self.policy.binding_required,
),
In src/wf_platform/__init__.py, export SourcePolicy if the package uses lazy exports. Add it beside SourcePermissions.
- Step 4: Run test and commit
Run:
uv run pytest tests/platform/test_sources.py::test_capability_source_exposes_policy_snapshot -q
uv run basedpyright --level error src/wf_platform/sources.py src/wf_platform/__init__.py tests/platform/test_sources.py
Expected: test passes and typecheck has 0 errors.
Commit:
git add src/wf_platform/sources.py src/wf_platform/__init__.py tests/platform/test_sources.py
git commit -m "feat: add capability source policy metadata"
Task 2: Mark Built-In Platform Sources
Files:
-
Modify:
src/wf_api/local_sources.py -
Modify:
src/wf_mcp/broker/service/core.pyor the exact file that createswf.recipes/wf.mcpsources -
Test:
tests/wf_server/test_local_static_server.py -
Test:
tests/wf_mcp/service/test_catalog.py -
Step 1: Add tests for platform source policy
In tests/wf_server/test_local_static_server.py, add:
def test_local_static_builtins_are_platform_sources(tmp_path) -> None:
server = build_local_static_workflow_server(tmp_path)
wf_std = server.context.specs.capability_sources["wf.std"]
assert wf_std.policy.platform is True
assert wf_std.policy.binding_required is False
In tests/wf_mcp/service/test_catalog.py, add or extend an existing broker-local source test:
def test_broker_local_sources_are_platform_sources() -> None:
service = WfMcpService()
wf_recipes = service.capability_sources["wf.recipes"]
assert wf_recipes.policy.platform is True
assert wf_recipes.policy.binding_required is False
If WfMcpService() needs stores/adapters in the existing tests, use that file's existing service fixture/helper.
- Step 2: Run tests and confirm failure
Run:
uv run pytest tests/wf_server/test_local_static_server.py::test_local_static_builtins_are_platform_sources tests/wf_mcp/service/test_catalog.py::test_broker_local_sources_are_platform_sources -q
Expected: fails because sources still have default external policy.
- Step 3: Mark built-ins
In src/wf_api/local_sources.py, import SourcePolicy:
from wf_platform import SourcePolicy
For every built-in CapabilitySource(id="wf.std", ...) and related local static wf.* source, set:
policy=SourcePolicy(platform=True, binding_required=False),
In the MCP broker file that creates wf.recipes, wf.mcp, or other broker-local wf.* sources, set the same policy:
policy=SourcePolicy(platform=True, binding_required=False),
Do not mark upstream MCP connection sources or Python configured sources as platform.
- Step 4: Run tests and commit
Run:
uv run pytest tests/wf_server/test_local_static_server.py::test_local_static_builtins_are_platform_sources tests/wf_mcp/service/test_catalog.py::test_broker_local_sources_are_platform_sources -q
uv run ruff check src/wf_api/local_sources.py src/wf_mcp/broker tests/wf_server/test_local_static_server.py tests/wf_mcp/service/test_catalog.py
Expected: tests pass and ruff is clean.
Commit:
git add src/wf_api/local_sources.py src/wf_mcp tests/wf_server/test_local_static_server.py tests/wf_mcp/service/test_catalog.py
git commit -m "feat: mark wf builtins as platform sources"
Task 3: Make Deployment Validation Binding-Free For Platform Sources
Files:
-
Modify:
src/wf_artifacts/models.py -
Modify:
src/wf_api/deployments.py -
Modify:
src/wf_artifacts/validation.py -
Test:
tests/artifacts/test_validation.py -
Step 1: Add validation tests
In tests/artifacts/test_validation.py, add:
from wf_artifacts import AvailableSource
def test_platform_source_requirement_does_not_need_binding() -> None:
artifact = artifact_with(required_capability(logical_source="wf.std", name="replace"))
deployment = WorkflowDeployment(
id="demo.default",
artifact_id=artifact.id,
artifact_version=artifact.version,
bindings={},
)
diagnostics = validate_deployment_dependencies(
artifact=artifact,
deployment=deployment,
sources=[
AvailableSource(
id="wf.std",
platform=True,
capabilities={
"replace": AvailableCapability(name="replace", kind="node_spec")
},
)
],
)
assert diagnostics == []
def test_missing_platform_source_still_reports_source_missing() -> None:
artifact = artifact_with(required_capability(logical_source="wf.std", name="replace"))
deployment = WorkflowDeployment(
id="demo.default",
artifact_id=artifact.id,
artifact_version=artifact.version,
bindings={},
)
diagnostics = validate_deployment_dependencies(
artifact=artifact,
deployment=deployment,
sources=[],
)
assert [diagnostic.code for diagnostic in diagnostics] == ["source_missing"]
assert diagnostics[0].bound_source == "wf.std"
If required_capability() helper uses different argument names, adapt the calls to the helper already in the file. The required capability must represent wf.std.replace.
- Step 2: Run tests and confirm failure
Run:
uv run pytest tests/artifacts/test_validation.py::test_platform_source_requirement_does_not_need_binding tests/artifacts/test_validation.py::test_missing_platform_source_still_reports_source_missing -q
Expected: first test fails with binding_missing; AvailableSource(platform=True) may also fail before model update.
- Step 3: Add platform flag to available source projection
In src/wf_artifacts/models.py, add to AvailableSource:
platform: bool = False
In src/wf_api/deployments.py, change AvailableSource(...) construction to include:
platform=source.policy.platform,
- Step 4: Update validation logic
In src/wf_artifacts/validation.py, build sources_by_id before binding checks, then replace:
bound_source_id = bindings.get(required.logical_source)
if bound_source_id is None:
diagnostics.append(...)
continue
with:
platform_source = sources_by_id.get(required.logical_source)
if platform_source is not None and platform_source.platform:
bound_source_id = required.logical_source
else:
bound_source_id = bindings.get(required.logical_source)
if bound_source_id is None:
diagnostics.append(
_diagnostic(
code="binding_missing",
logical_ref=logical_ref,
required=required,
message=(
f"No binding exists for logical source "
f"{required.logical_source!r}."
),
repair_hint=(
"Bind the logical source to a compatible concrete source."
),
)
)
continue
Then keep the existing source lookup:
source = sources_by_id.get(bound_source_id)
If no source exists and no binding exists, platform source absence should produce source_missing with bound_source="wf.std" as covered by the test.
- Step 5: Run tests and commit
Run:
uv run pytest tests/artifacts/test_validation.py -q
uv run basedpyright --level error src/wf_artifacts/models.py src/wf_artifacts/validation.py src/wf_api/deployments.py tests/artifacts/test_validation.py
Expected: validation tests pass and typecheck has 0 errors.
Commit:
git add src/wf_artifacts/models.py src/wf_artifacts/validation.py src/wf_api/deployments.py tests/artifacts/test_validation.py
git commit -m "feat: skip bindings for platform sources"
Task 4: Remove Platform Sources From Required Binding UX
Files:
-
Modify:
src/wf_api/artifacts.py -
Test:
tests/wf_api/test_artifact_api.py -
Test:
tests/wf_transport_rpc_http/test_app.py -
Step 1: Add API tests
In tests/wf_api/test_artifact_api.py, add:
async def test_create_artifact_from_workspace_excludes_platform_sources_from_required_bindings(tmp_path: Path) -> None:
api = _api(tmp_path)
workspace = await api.create_draft_workspace_from_capability(
workspace_id="constant_ws",
capability_name="wf.std.constant",
name="constant_value",
)
saved = await api.create_artifact_from_workspace(
workspace_id=workspace["workspace_id"],
artifact_id="constant_artifact",
version=1,
title="Constant Artifact",
outcomes=["ok"],
)
assert saved["saved"] is True
assert saved["required_logical_sources"] == []
assert saved["suggested_bindings"] == {}
Use the existing helper names in the file if _api() or method names differ.
- Step 2: Run test and confirm failure
Run:
uv run pytest tests/wf_api/test_artifact_api.py::test_create_artifact_from_workspace_excludes_platform_sources_from_required_bindings -q
Expected: fails because wf.std is currently returned as required/suggested.
- Step 3: Filter platform sources in artifact save response
In src/wf_api/artifacts.py, add a helper near _suggested_self_bindings:
def _binding_required_sources(
required_capabilities: dict[str, RequiredCapability],
sources: dict[str, CapabilitySource],
) -> list[str]:
return sorted(
{
capability.logical_source
for capability in required_capabilities.values()
if sources.get(capability.logical_source) is None
or sources[capability.logical_source].policy.binding_required
}
)
Import CapabilitySource if needed:
from wf_platform import CapabilitySource
Replace the required_sources = sorted({...}) block in create_artifact_from_draft() with:
required_sources = _binding_required_sources(
workflow_artifact.required_capability_map(),
self.context.specs.capability_sources,
)
Change _suggested_self_bindings() to return {} or remove wf.std/wf.mcp special casing:
def _suggested_self_bindings(required_sources: Sequence[str]) -> dict[str, str]:
"""Suggest local bindings for external sources that deploy to themselves."""
return {}
This keeps response shape stable while avoiding platform-source binding suggestions.
- Step 4: Run tests and commit
Run:
uv run pytest tests/wf_api/test_artifact_api.py tests/wf_transport_rpc_http/test_app.py -q
uv run ruff check src/wf_api/artifacts.py tests/wf_api/test_artifact_api.py tests/wf_transport_rpc_http/test_app.py
uv run basedpyright --level error src/wf_api/artifacts.py tests/wf_api/test_artifact_api.py tests/wf_transport_rpc_http/test_app.py
Expected: tests pass, ruff clean, typecheck 0 errors.
Commit:
git add src/wf_api/artifacts.py tests/wf_api/test_artifact_api.py tests/wf_transport_rpc_http/test_app.py
git commit -m "fix: hide platform sources from binding prompts"
Task 5: Runtime E2E Without wf.std Binding
Files:
-
Test:
tests/wf_server/test_local_static_server.py -
Test:
tests/wf_transport_rpc_http/test_app.py -
Docs:
docs/current_roadmap.md -
Step 1: Add no-binding run tests
In tests/wf_server/test_local_static_server.py, add a variant of the existing
test_local_static_server_runs_deployment_and_persists_run that uses the
existing _constant_plan() helper, but removes every wf.std=wf.std binding:
async def test_local_static_wf_std_deployment_runs_without_source_binding(tmp_path) -> None:
server = build_local_static_workflow_server(tmp_path / "store")
api = server.api
plan = _constant_plan()
artifact_result = await api.create_artifact_from_plan(
artifact_id="server_constant_no_binding",
version=1,
title="Server Constant No Binding",
plan=plan.model_copy(update={"name": "server_constant_no_binding"}),
outcomes=["ok"],
source_bindings={},
)
deployment_result = await api.save_deployment(
{
"id": "server_constant_no_binding.default",
"artifact_id": "server_constant_no_binding",
"artifact_version": 1,
"bindings": {},
}
)
run_result = await api.run_deployment(
deployment_id="server_constant_no_binding.default",
workflow_input={},
)
assert artifact_result["required_logical_sources"] == []
assert deployment_result["deployment_id"] == "server_constant_no_binding.default"
assert run_result["status"] == "completed"
assert run_result["output"]["result"] == "hello from server"
If the exact response shape differs, follow the current assertions in
test_local_static_server_runs_deployment_and_persists_run. The only intended
behavioral difference is no artifact source binding and no deployment binding.
- Step 2: Run tests and fix plan shape if needed
Run:
uv run pytest tests/wf_server/test_local_static_server.py::test_local_static_wf_std_deployment_runs_without_source_binding -q
Expected: passes after platform validation changes. If it fails due plan shape, adapt the test to an existing local-static helper workflow; do not change product code unless the failure is binding_missing.
- Step 3: Update roadmap
In docs/current_roadmap.md, replace the platform-source next-design note with:
- Completed platform source policy: `wf.*` process-provided sources are marked
as platform sources and no longer require self-bindings such as
`wf.std=wf.std` in deployments.
Keep the wf.source source-ref helper note as next design work.
- Step 4: Final verification and commit
Run:
uv run pytest tests/platform/test_sources.py tests/artifacts/test_validation.py tests/wf_api/test_artifact_api.py tests/wf_server/test_local_static_server.py tests/wf_transport_rpc_http/test_app.py -q
uv run ruff check src/wf_platform src/wf_artifacts src/wf_api tests/platform tests/artifacts tests/wf_api/test_artifact_api.py tests/wf_server/test_local_static_server.py tests/wf_transport_rpc_http/test_app.py
uv run basedpyright --level error src/wf_platform src/wf_artifacts src/wf_api tests/platform tests/artifacts tests/wf_api/test_artifact_api.py tests/wf_server/test_local_static_server.py tests/wf_transport_rpc_http/test_app.py
Expected: focused tests pass, ruff clean, typecheck 0 errors.
Commit:
git add tests/wf_server/test_local_static_server.py docs/current_roadmap.md
git commit -m "test: prove platform sources need no bindings"
Self-Review
- Spec coverage: plan adds metadata/policy, marks platform sources, updates validation, removes binding UX prompts, and proves
wf.stdworks without self-binding. - Placeholder scan: no TBD/TODO/fill-in placeholders remain.
- Type consistency: the field is
CapabilitySource.policy, snapshot isSourcePolicySnapshot, and validation usesAvailableSource.platform.