Skip to content

feat(profile): v0.6.1 — Project Isolation (activation policy)#5

Merged
g761007 merged 2 commits into
mainfrom
v0.6.1
May 15, 2026
Merged

feat(profile): v0.6.1 — Project Isolation (activation policy)#5
g761007 merged 2 commits into
mainfrom
v0.6.1

Conversation

@g761007
Copy link
Copy Markdown
Owner

@g761007 g761007 commented May 15, 2026

Summary

  • Add ActivationPolicy model to manifest/models.py with 4 modes: strict, merge, fallback, manual
  • Skillfile gains activation: field (default: manual + inherit_global=true → zero breaking change from v0.6.0)
  • compose_effective_skillset() applies the policy via _apply_activation_policy(); EffectiveSkillset gains warnings: tuple[str, ...] surfaced to CLI stderr
  • New LayerOrigin values: GLOBAL_PROFILE_FILTER, POLICY_BLOCKED_GLOBAL
  • resolve and status gain --ignore-global flag
  • status output shows activation: <mode> / inherit_global=<bool> line
  • 25 new tests (348 total, all green on Linux/macOS; Windows 3.12 failure is pre-existing on main)

Mode semantics

Mode No --profile With --profile X
strict base only (or default_profile from project) project profile only; global → stderr warning + exit 1
merge auto-apply default_profile (project ∪ global) project ∪ global union
fallback auto-apply default_profile: project first, else global project first, else global
manual base only v0.6.0 behaviour: project first, else global

Out of scope (deferred)

  • --ignore-global for install / sync (requires migrating pipeline.py / sync.py call sites from flatten() to compose_effective_skillset())
  • v0.6.2 Safe Switching (switch command, 3-scope active profile state)

Test plan

  • uv run pytest -q — 348 passed, 1 skipped
  • uv run mypy src/skillpod — clean
  • uv run ruff check src tests — clean
  • skillpod status shows activation: line
  • skillpod resolve --ignore-global skips global profiles
  • activation: {mode: strict} rejects global profile with exit 1 + stderr warning

g761007 added 2 commits May 14, 2026 19:46
Add `activation:` block to skillfile.yml with 4 modes (strict / merge /
fallback / manual) × inherit_global flag.  compose_effective_skillset()
now applies the policy; resolve and status gain --ignore-global.

- ActivationPolicy model + Skillfile.activation field (default: manual +
  inherit_global=true → backward-compatible with v0.6.0)
- _normalise_activation in manifest/loader.py
- _apply_activation_policy in skillset/compose.py; EffectiveSkillset gains
  warnings: tuple[str, ...] surfaced to CLI stderr
- New LayerOrigin values: GLOBAL_PROFILE_FILTER, POLICY_BLOCKED_GLOBAL
- --ignore-global flag wired into resolve and status CLI commands
- status output shows "activation: <mode> / inherit_global=<bool>" line
- 25 new tests (348 total, all green)
@g761007 g761007 merged commit dafba92 into main May 15, 2026
7 of 8 checks passed
@g761007 g761007 deleted the v0.6.1 branch May 15, 2026 01:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant