agentleFS
Microsoft AzureKnown publisherAzure/missionlz/.github/skills/speckit-constitution/SKILL.md

speckit-constitution

Skill296 starsChanged 3 days agoMITView on GitHub

Create or update the project constitution from interactive or provided principle inputs.

We split this skill into the rules it gives an agent

29 rules. 10 are common, 5 are distinctive, and 14 are very specific to this project.

  • 10

    Common

    Most of the 115 edited versions we read keep these.

  • 5

    Distinctive

    This author's own choices. Worth a look.

  • 14

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    If the input includes feature implementation, code generation, refactoring, building, or deployment requests, you MUST NOT execute them.

    line 26
  2. Distinctive:

    If it is unclear whether an instruction is constitution content, ask for clarification before making changes.

    line 31
  3. Very specific:

    After completing the constitution update, include a Next Actions section for each deferred intent.

    line 33
  4. Very specific:

    If there are no non-governance intents, omit the Next Actions section.

    line 36
  5. Very specific:

    Check if .specify/extensions.yml exists in the project root.

    line 41
  6. Very specific:

    If it exists, read it and look for entries under the hooks.before_constitution key

    line 42
  7. Very specific:

    If the YAML cannot be parsed or is invalid, do not skip silently: tell the user that .specify/extensions.yml could not be read (include the …

    line 43
  8. Very specific:

    If the hook has no condition field, or it is null/empty, treat the hook as executable

    line 46
  9. Very specific:

    If the hook defines a non-empty condition, skip the hook and leave condition evaluation to the HookExecutor implementation

    line 47
  10. Very specific:

    When constructing command invocations from hook command names, replace dots (.) with hyphens (-).

    line 48
  11. Very specific:

    If no hooks are registered or .specify/extensions.yml does not exist, skip silently

    line 72
  12. Common:

    Follow this execution flow:

    line 80
  13. Very specific:

    Run .specify/scripts/bash/resolve-template.sh constitution-template --json from the repository root and parse TEMPLATE_CONTENT as the …

    line 82
  14. Distinctive:

    If it fails, stop and report the resolution error.

    line 85
  15. Very specific:

    If .specify/memory/constitution.md exists, load it as the source of current project-specific values and amendments.

    line 87
  16. Distinctive:

    If it does not exist, use the resolved template as the initial document.

    line 90
  17. Distinctive:

    Do not write back to any versioned template layer.

    line 91
  18. Common:

    If user input (conversation) supplies a value, use it.

    line 96
  19. Common:

    If version bump type ambiguous, propose reasoning before finalizing.

    line 103
  20. Common:

    Ensure each Principle section: succinct name line, paragraph (or bullet list) capturing non‑negotiable rules, explicit rationale if not …

    line 108
  21. Common:

    Ensure Governance section lists amendment procedure, versioning policy, and compliance review expectations.

    line 109
  22. Common:

    Follow-up TODOs if any placeholders intentionally deferred.

    line 118
  23. Common:

    No remaining unexplained bracket tokens.

    line 121
  24. Very specific:

    Write the completed constitution back to .specify/memory/constitution.md (overwrite).

    line 126
  25. Common:

    Use Markdown headings exactly as in the template (do not demote/promote levels).

    line 136
  26. Common:

    Keep a single blank line between sections.

    line 138
  27. Common:

    If the user supplies partial updates (e.g., only one principle revision), still perform validation and version decision steps.

    line 141
  28. Very specific:

    If critical info missing (e.g., ratification date truly unknown), insert TODO(<FIELD_NAME>): explanation and include in the Sync Impact …

    line 143
  29. Very specific:

    Write only .specify/memory/constitution.md.

    line 145

“Common” is measured: kept by at least 6 in 10 of the 115 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

User Input

$ARGUMENTS

You MUST consider the user input before proceeding (if not empty).

Scope Guard

This command's own work is limited to updating the project constitution itself. Dependent templates and commands read the constitution at runtime and are not modified here.

  • Classify every part of the user input as either constitution content or a separate, non-governance intent.
  • If the input includes feature implementation, code generation, refactoring, building, or deployment requests, you MUST NOT execute them. Extract them as deferred intents instead.
  • You MUST NOT create, modify, or delete application source files, feature routes, components, tests, deployment files, or other artifacts unrelated to the constitution workflow.
  • If it is unclear whether an instruction is constitution content, ask for clarification before making changes.
  • After completing the constitution update, include a Next Actions section for each deferred intent. List the original intent and suggest the appropriate follow-up Spec Kit command, such as /speckit-specify, without invoking it.
  • If there are no non-governance intents, omit the Next Actions section.

Pre-Execution Checks

Check for extension hooks (before constitution update):

  • Check if .specify/extensions.yml exists in the project root.
  • If it exists, read it and look for entries under the hooks.before_constitution key
  • If the YAML cannot be parsed or is invalid, do not skip silently: tell the user that .specify/extensions.yml could not be read (include the parser error) and that no hooks were checked, including any mandatory (optional: false) hooks registered there, then continue normally
  • Filter out hooks where enabled is explicitly false. Treat hooks without an enabled field as enabled by default.
  • For each remaining hook, do not attempt to interpret or evaluate hook condition expressions:
    • If the hook has no condition field, or it is null/empty, treat the hook as executable
    • If the hook defines a non-empty condition, skip the hook and leave condition evaluation to the HookExecutor implementation
  • When constructing command invocations from hook command names, replace dots (.) with hyphens (-). For example, speckit.git.commit → /speckit-git-commit.
  • For each executable hook, output the following based on its optional flag:
    • Optional hook (optional: true):
      ## Extension Hooks
      
      **Optional Pre-Hook**: {extension}
      Command: `/{command}`
      Description: {description}
      
      Prompt: {prompt}
      To execute: `/{command}`
    • Mandatory hook (optional: false):
      ## Extension Hooks
      
      **Automatic Pre-Hook**: {extension}
      Executing: `/{command}`
      EXECUTE_COMMAND: {command}
      
      Wait for the result of the hook command before proceeding to the Outline.
      After emitting the block above you MUST actually invoke the hook and wait for it to finish before continuing. Run it the same way you would run the command yourself in this agent/session (the invocation may differ from the literal {command} id shown above, e.g. a skills-mode agent runs it as /skill:speckit-... or $speckit-...). Emitting the block alone does not run the hook.
  • If no hooks are registered or .specify/extensions.yml does not exist, skip silently

Outline

You are updating the project constitution at .specify/memory/constitution.md. The active constitution scaffold is resolved at command time from constitution-template through the Spec Kit preset/template resolution stack.

Follow this execution flow:

  1. Run .specify/scripts/bash/resolve-template.sh constitution-template --json from the repository root and parse TEMPLATE_CONTENT as the active template.
    • The shared resolver applies project overrides, composing preset layers, and extension layers before the core template fallback. It MUST succeed before continuing.
    • If it fails, stop and report the resolution error; do not continue with only one contributing template layer.
    • If .specify/memory/constitution.md exists, load it as the source of current project-specific values and amendments. Preserve information that is still applicable when applying the newly resolved scaffold.
    • If it does not exist, use the resolved template as the initial document.
    • Do not write back to any versioned template layer.
    • Identify every placeholder token of the form [ALL_CAPS_IDENTIFIER]. IMPORTANT: The user might require less or more principles than the ones used in the template. If a number is specified, respect that - follow the general template. You will update the doc accordingly.
  2. Collect/derive values for placeholders:
    • If user input (conversation) supplies a value, use it.
    • Otherwise infer from existing repo context (README, docs, prior constitution versions if embedded).
    • For governance dates: RATIFICATION_DATE is the original adoption date (if unknown ask or mark TODO), LAST_AMENDED_DATE is today if changes are made, otherwise keep previous.
    • CONSTITUTION_VERSION must increment according to semantic versioning rules:
      • MAJOR: Backward incompatible governance/principle removals or redefinitions.
      • MINOR: New principle/section added or materially expanded guidance.
      • PATCH: Clarifications, wording, typo fixes, non-semantic refinements.
    • If version bump type ambiguous, propose reasoning before finalizing.
  3. Draft the updated constitution content using the resolved template as the required structure:
    • Replace every placeholder with concrete text (no bracketed tokens left except intentionally retained template slots that the project has chosen not to define yet—explicitly justify any left).
    • Preserve heading hierarchy and comments can be removed once replaced unless they still add clarifying guidance.
    • Ensure each Principle section: succinct name line, paragraph (or bullet list) capturing non‑negotiable rules, explicit rationale if not obvious.
    • Ensure Governance section lists amendment procedure, versioning policy, and compliance review expectations.
  4. Produce a Sync Impact Report as an HTML comment at the top of the constitution file after update. This report is temporary scratch material for human review of the amendment, not governance content; it is expected to be removed before the amended constitution file is committed.
    • Version change: old → new
    • List of modified principles (old title → new title if renamed)
    • Added sections
    • Removed sections
    • Follow-up TODOs if any placeholders intentionally deferred.
  5. Validation before final output:
    • No remaining unexplained bracket tokens.
    • Version line matches report.
    • Dates ISO format YYYY-MM-DD.
    • Principles are declarative, testable, and free of vague language ("should" → replace with MUST/SHOULD rationale where appropriate).
  6. Write the completed constitution back to .specify/memory/constitution.md (overwrite).
  7. Output a final summary to the user with:
    • New version and bump rationale.
    • Any TODO placeholders or deferred items requiring manual follow-up.
    • Suggested commit message (e.g., docs: amend constitution to vX.Y.Z (principle additions + governance update)).
    • A Next Actions section for any deferred non-governance intents.

Formatting & Style Requirements:

  • Use Markdown headings exactly as in the template (do not demote/promote levels).
  • Wrap long rationale lines to keep readability (<100 chars ideally) but do not hard enforce with awkward breaks.
  • Keep a single blank line between sections.
  • Avoid trailing whitespace.

If the user supplies partial updates (e.g., only one principle revision), still perform validation and version decision steps.

If critical info missing (e.g., ratification date truly unknown), insert TODO(<FIELD_NAME>): explanation and include in the Sync Impact Report under deferred items.

Write only .specify/memory/constitution.md; do not create or modify template source files.

Post-Execution Checks

Check for extension hooks (after constitution update): Check if .specify/extensions.yml exists in the project root.

  • If it exists, read it and look for entries under the hooks.after_constitution key
  • If the YAML cannot be parsed or is invalid, do not skip silently: tell the user that .specify/extensions.yml could not be read (include the parser error) and that no hooks were checked, including any mandatory (optional: false) hooks registered there, then continue normally
  • Filter out hooks where enabled is explicitly false. Treat hooks without an enabled field as enabled by default.
  • For each remaining hook, do not attempt to interpret or evaluate hook condition expressions:
    • If the hook has no condition field, or it is null/empty, treat the hook as executable
    • If the hook defines a non-empty condition, skip the hook and leave condition evaluation to the HookExecutor implementation
  • When constructing command invocations from hook command names, replace dots (.) with hyphens (-). For example, speckit.git.commit → /speckit-git-commit.
  • For each executable hook, output the following based on its optional flag:
    • Optional hook (optional: true):
      ## Extension Hooks
      
      **Optional Hook**: {extension}
      Command: `/{command}`
      Description: {description}
      
      Prompt: {prompt}
      To execute: `/{command}`
    • Mandatory hook (optional: false):
      ## Extension Hooks
      
      **Automatic Hook**: {extension}
      Executing: `/{command}`
      EXECUTE_COMMAND: {command}
      After emitting the block above you MUST actually invoke the hook and wait for it to finish before continuing. Run it the same way you would run the command yourself in this agent/session (the invocation may differ from the literal {command} id shown above, e.g. a skills-mode agent runs it as /skill:speckit-... or $speckit-...). Emitting the block alone does not run the hook.
  • If no hooks are registered or .specify/extensions.yml does not exist, skip silently

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.