src/doctrine/skills/ad-hoc-profile-load/SKILL.md
Load an agent profile on demand to adopt a specific role for the current session. Applies the profile's identity, governance scope, boundaries, and initialization declaration without requiring a running mission. Triggers: "act as the architect", "load the reviewer profile", "switch to implementer", "use the researcher persona", "start a session as planner", "adopt the curator role", "initialize profile", "assume the designer identity". Does NOT handle: mission advancement (use runtime-next), charter interview/generation (use charter-doctrine), or profile creation (use the charter synthesize workflow / edit the profile YAML directly).
npx skillsauth add priivacy-ai/spec-kitty ad-hoc-profile-loadInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Load an agent profile interactively to adopt a specific role for the current session. This skill is for ad-hoc use outside the mission runtime loop — when a user wants an agent to behave as a particular role without starting a formal mission.
Use this when the user asks you to:
Do NOT use this when:
spec-kitty next is driving the loop — the
runtime assigns profiles automatically via DDR-011 matchingspec-kitty charter synthesize) or author the profile YAML directlyIf the user names a profile directly, load it. If they describe a role or task, resolve the best match.
Inspect by explicit ID — read the full resolved definition before adopting it:
spec-kitty agent profile show <profile-id>
# Add --all to inspect a non-activated abstract base profile:
spec-kitty agent profile show <profile-id> --all
from doctrine.agent_profiles import AgentProfileRepository
repo = AgentProfileRepository(project_dir=project_agents_dir)
profile = repo.resolve_profile("architect")
By task context (when the user describes what they want to do):
from doctrine.agent_profiles.profile import TaskContext
context = TaskContext(
languages=["python"],
frameworks=["fastapi", "<project-test-runner>"],
file_patterns=["src/**/*.py"],
domain_keywords=["architecture", "design"],
)
profile = repo.find_best_match(context)
Discovery (when the user is unsure which profile to use):
spec-kitty agent profile list
One-shot invocation (when the user wants a profile-governed answer rather than to adopt the role for the session): route the request through the canonical invoke surfaces instead of loading the profile manually:
# Ask a named profile to handle a specific request:
spec-kitty ask <profile-id> "<request>"
# Or let the router pick a profile for the request:
spec-kitty advise "<request>" --profile <profile-id>
Once resolved, adopt the profile by internalizing three things:
Read initialization_declaration — this is your startup persona statement.
Acknowledge it at the beginning of the session.
print(profile.initialization_declaration)
# "I am Architect Alphonso. I design scalable, maintainable system
# architectures using established design patterns and principles..."
Read specialization — this defines your scope:
primary_focus — what you actively dosecondary_awareness — what you consider but don't ownavoidance_boundary — what you must not doBefore taking any action, check whether it falls within your boundaries.
If the user asks you to do something in the avoidance boundary, acknowledge
the request and explain which role would handle it instead (using
collaboration.handoff_to).
The profile's context_sources declares which doctrine layers and specific
directives are relevant to this role. Load only those:
from doctrine.service import DoctrineService
service = DoctrineService(shipped_root, project_root)
# Load directives referenced by this profile
for ref in profile.directive_references:
directive = service.directives.get(f"DIRECTIVE_{ref.code}")
# Apply this directive's constraints to your behavior
Do NOT load the full doctrine catalog. The profile scopes what matters.
After adopting the profile, load charter context scoped to the action the user wants to perform:
spec-kitty charter context --action implement --json
If the user hasn't named an action, infer it from the profile's
canonical_verbs:
| Profile | Canonical verbs | Default action | |---|---|---| | architect | design, evaluate, decide, model, specify | specify | | planner | plan, prioritize, decompose, schedule | plan | | implementer | implement, fix, refactor, test, debug | implement | | reviewer | review, approve, reject, assess | review | | researcher | research, investigate, evaluate, synthesize | specify | | curator | curate, validate, update, reconcile | review | | designer | design, prototype, sketch, iterate | specify |
When work falls outside your boundaries, name the appropriate role:
"This requires implementation work. That's in Implementer Ivan's scope —
I can hand off my architectural notes for them to execute."
The profile's collaboration section defines:
handoff_to — roles you delegate work tohandoff_from — roles that delegate to youworks_with — roles you collaborate with in parallelWhen you need guidance mid-session, pull specific tactics or directives relevant to your current task — don't reload the full context:
# Need guidance on a design decision?
tactic = service.tactics.get("adr-drafting-workflow")
# Need to check a quality gate?
directive = service.directives.get("DIRECTIVE_030")
The profile's mode_defaults lists the working modes this role supports.
If the user's request maps to a specific mode, acknowledge it:
for mode in profile.mode_defaults:
# mode.mode → "analysis", "design", "review", etc.
# mode.description → what this mode is for
# mode.use_case → when to activate it
pass
To persist the profile for the current tool so it loads automatically on next session, start an ad-hoc specialist session via the slash command:
/spec-kitty.profile-context <profile-id>
This anchors the named profile as the active advisory context for the tool
so it is available to the agent on subsequent turns. For a single
profile-governed answer without persisting context, use spec-kitty ask
or spec-kitty advise (see Step 1).
# List profiles
spec-kitty agent profile list
# Inspect a profile (add --all for non-activated abstract base profiles)
spec-kitty agent profile show architect
spec-kitty agent profile show architect --all
# One-shot profile-governed invocation
spec-kitty ask architect "<request>"
spec-kitty advise "<request>" --profile architect
# Persist a profile as the tool's advisory context (slash command)
# /spec-kitty.profile-context architect
from doctrine.agent_profiles import AgentProfileRepository
from doctrine.service import DoctrineService
# Load profile
repo = AgentProfileRepository()
profile = repo.resolve_profile("architect")
# Read identity
profile.initialization_declaration
profile.specialization.primary_focus
profile.specialization.avoidance_boundary
# Load scoped doctrine
service = DoctrineService(shipped_root, project_root)
for ref in profile.directive_references:
service.directives.get(f"DIRECTIVE_{ref.code}")
# Check boundaries before acting
if task_type in profile.specialization.avoidance_boundary:
suggest_handoff(profile.collaboration.handoff_to)
tools
Operate Spec Kitty tracker workflows, tracker service discovery, binding, hosted routing, and tracker recovery.
tools
Operate Spec Kitty team sync, hosted SaaS sync, offline queue, diagnostics, and recovery flows.
tools
Operate Spec Kitty connector integrations and route connector work across tracker, sync, SaaS, and external services.
tools
Handle Spec Kitty team authentication, hosted credentials, account selection, and auth-related recovery.