Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
138 commits
Select commit Hold shift + click to select a range
e45201b
update env variables.
beaversd Aug 13, 2026
0077ae8
For Literature display, if authorName, use this, otherwise use author.
beaversd Aug 13, 2026
a56a198
wip
beaversd Aug 14, 2026
94b2d69
update
beaversd Aug 18, 2026
86eb582
Merge branch 'main' into curator-tool
beaversd Aug 18, 2026
6bb7086
Updates to enviornement and manual editing of the publication component.
beaversd Aug 19, 2026
f4d7922
feat(render): produce GIF and PowerPoint from the site's own renderer
adamjohnwright Aug 19, 2026
18162a5
update package.json with curator website script.
beaversd Aug 19, 2026
7f8d5de
feat(download): take GIF and PowerPoint from the render service
adamjohnwright Aug 20, 2026
9f1aa39
fix(render): draw the GIF at a size its labels can be read at
adamjohnwright Aug 20, 2026
ec7761b
fix(render): make a renderer change reach a browser that already has …
adamjohnwright Aug 20, 2026
0f13ce3
fix(ci): let knip see the render tooling, and make the export theme e…
adamjohnwright Aug 20, 2026
f66f6d0
refactor(render): read the container's dependencies from the root pac…
adamjohnwright Aug 20, 2026
28620c4
fix(render): illustrations export standalone, and drop the URL versio…
adamjohnwright Aug 20, 2026
e6264da
feat(export): make the animated SVG's timeline clickable (#141)
adamjohnwright Aug 20, 2026
4c59f99
feat(reacfoam): signify flagging with a border rather than a fill (#140)
adamjohnwright Aug 20, 2026
0f12416
refactor: make revealing the selected thing a directive (#137)
adamjohnwright Aug 20, 2026
5db7258
docs(curators): record what to check from this round
adamjohnwright Aug 20, 2026
94e3457
feat(idg): port the IDG protein-to-pathways search (/idg)
adamjohnwright Aug 20, 2026
e486406
fix(serve): say "rebuilding" instead of throwing ENOENT mid-build
adamjohnwright Aug 20, 2026
5e3b325
fix(idg): filter by functional interaction score, and show the distri…
adamjohnwright Aug 20, 2026
f029931
feat(idg): show Target Development Level, and accept lower-case symbols
adamjohnwright Aug 20, 2026
b0ffe16
feat(idg): add the portal's three plots, and match its defaults (#idg)
adamjohnwright Aug 20, 2026
a284d80
fix(idg): drop an unused type import
adamjohnwright Aug 20, 2026
3bbf54e
test(idg): teach the e2e suite about the new shortcut and page
adamjohnwright Aug 20, 2026
d271486
feat(idg): expandable rows with the pathway's description and hierarchy
adamjohnwright Aug 20, 2026
a8d4588
feat(idg): list the interacting genes, with a CSV, and link out to Ph…
adamjohnwright Aug 20, 2026
4664a67
feat(idg): download the pathway list as a CSV
adamjohnwright Aug 20, 2026
c23ff37
fix(render): run the container's browser from a path its user can read
adamjohnwright Aug 20, 2026
2c7c231
test: start turning the release checklist into a suite
adamjohnwright Aug 20, 2026
41b0ec5
docs(testing): correct three rows the last commit claimed were covered
adamjohnwright Aug 20, 2026
8beb284
test: cover every top-level pathway and the interactor overlay
adamjohnwright Aug 20, 2026
87af84b
fix(diagram): let a reaction's input edges reach the reaction (R-HSA-…
adamjohnwright Aug 20, 2026
a4e1ea2
fix(analysis): make tissue enrichment reachable by the analysis service
adamjohnwright Aug 20, 2026
a03b401
feat(detail): a reaction's downloads live with its figure, drawn by o…
adamjohnwright Aug 20, 2026
b64efb0
fix(detail): the data exports read as a document, not as stray braces
adamjohnwright Aug 20, 2026
98a4a72
fix(idg): a pathway link opens with the interactors overlaid
adamjohnwright Aug 20, 2026
a699164
fix(download): the catalogue points at files that exist, in the relea…
adamjohnwright Aug 20, 2026
84b8f62
fix(icons): icons come from the release bucket, not from the dev backend
adamjohnwright Aug 20, 2026
c1bd727
test(analysis): what an analysis is for, not just that its wizard opens
adamjohnwright Aug 21, 2026
d651da6
fix(diagram): a node with no graph entry no longer blanks the whole d…
adamjohnwright Aug 21, 2026
0c0d063
test(detail): the contents of the panels, not just their presence
adamjohnwright Aug 21, 2026
27c503b
fix(content): a page that names a release gets the one we are serving
adamjohnwright Aug 21, 2026
dd35f6c
feat(news): import announcements from the current site, verbatim
adamjohnwright Aug 21, 2026
d1e2c83
build: stage content as part of the build, and check the PNG tiers di…
adamjohnwright Aug 21, 2026
54c7d36
feat(figures): take figures from the release bucket, falling back to …
adamjohnwright Aug 21, 2026
aeebe04
fix(figures): address figures outside the release, now that they are …
adamjohnwright Aug 21, 2026
0c08783
test: close the testing queue, and draw the pathway thumbnail with ou…
adamjohnwright Aug 21, 2026
009b64b
test(serve-prod): cover the server that actually serves beta
adamjohnwright Aug 21, 2026
0857e9e
build(deps): express 4.18.2 -> 4.22.2 (dependabot #134)
adamjohnwright Aug 21, 2026
f850352
build(deps-dev): playwright 1.58.2 -> 1.62.1, vitest 3.2.4 -> 3.2.7 (…
adamjohnwright Aug 21, 2026
666acfb
build(deps): Tina 3.12 and its CLI, which is where the criticals actu…
adamjohnwright Aug 21, 2026
22da00f
docs(curators): where to look on beta, and what a correct result look…
adamjohnwright Aug 21, 2026
00960cb
fix(detail): the frame fits its column, the charts fit their box, Bio…
adamjohnwright Aug 21, 2026
f5a48f3
test(homepage): don't make the suite depend on four university websites
adamjohnwright Aug 21, 2026
eded1b0
ci: shard the e2e suite, which outgrew a single runner
adamjohnwright Aug 21, 2026
f2e7df8
test: skip the reaction-diagram specs where the backend cannot serve one
adamjohnwright Aug 21, 2026
11ebf62
test: skip the icon-library check where the backend has no icon library
adamjohnwright Aug 21, 2026
aab13c4
test(diagrams): walk the top-level pathways three at a time, with roo…
adamjohnwright Aug 21, 2026
e4201f6
test: split the suite in two -- is the code right, is the release right
adamjohnwright Aug 21, 2026
cbd4024
docs(curators): BioPAX is one link, so stop describing two
adamjohnwright Aug 22, 2026
8900039
fix(download): one BioPAX in the browser's panel too, Level 3
adamjohnwright Aug 22, 2026
381a48b
docs: say what the 'newly added pathway' check actually asks
adamjohnwright Aug 22, 2026
a7e0c10
docs: audit both curator documents against reality
adamjohnwright Aug 22, 2026
e231efb
docs: DisGeNet is not being ported, and /tag/release is not a missing…
adamjohnwright Aug 22, 2026
e5680e6
docs: merge the duplicate curator document back into CURATOR-REPORT.md
adamjohnwright Aug 22, 2026
4d97e3e
docs(curators): a completeness pass over what we hand them
adamjohnwright Aug 22, 2026
0796f06
fix(release-calendar): cards that look clickable now are, and the res…
adamjohnwright Aug 22, 2026
115015d
test: narrow the href instead of asserting it
adamjohnwright Aug 22, 2026
7269669
Fixed the instance count at the top of the data-schema page.
beaversd Aug 31, 2026
2d845fd
Fix the count of instances shown.
beaversd Sep 2, 2026
203d0d8
Merge branch 'main' of https://github.com/reactome/WebsiteAngular int…
beaversd Sep 3, 2026
db99646
build fix.
beaversd Sep 3, 2026
8289afd
stash.
beaversd Sep 3, 2026
753ed42
feat(chat): point the homepage shortcut at the chatbot, and proxy it …
adamjohnwright Sep 2, 2026
c9efc88
fix(analysis): a PADOG result no longer blanks every view at once
adamjohnwright Sep 3, 2026
13a0a53
fix(analysis): show the same resource production does
adamjohnwright Sep 3, 2026
43752ba
fix(analysis): the diagram marks the same entities the table counts
adamjohnwright Sep 3, 2026
3585096
build: resync the lockfile so npm ci can install again
adamjohnwright Sep 4, 2026
631395d
test: a probe that cannot reach the backend is not proof the feature …
adamjohnwright Sep 4, 2026
5d9ada6
style: run prettier over the files the curator-tool merge left unform…
adamjohnwright Sep 4, 2026
cea8913
fix(config): never fall back to another deployment's services
adamjohnwright Sep 4, 2026
f4ca930
fix(env): the public build stops pointing at the curator host
adamjohnwright Sep 4, 2026
a906f03
fix(curator): the curator build names its own backend, and compiles a…
adamjohnwright Sep 4, 2026
4e166e1
fix(env): point every non-production environment back at dev, and say so
adamjohnwright Sep 4, 2026
243dc58
fix(env): development builds select development, and an unknown name …
adamjohnwright Sep 4, 2026
d7736e8
refactor(config): a deployment is one row, naming its backend and its UI
adamjohnwright Sep 4, 2026
a61383e
fix(config): the PathwayBrowser project stopped pointing at deleted f…
adamjohnwright Sep 4, 2026
96e1962
fix(env): a site talks to itself again, and one name means one deploy…
adamjohnwright Sep 4, 2026
ca113a0
docs: say why the public deployments resolve their own origin
adamjohnwright Sep 4, 2026
3f89d76
fix(analysis): tissue analysis works again on the sites that have a d…
adamjohnwright Sep 4, 2026
64198cb
feat(analytics): the whole site reports, and each deployment to its o…
adamjohnwright Sep 4, 2026
e8cbf66
fix(analytics): only reactome.org reports to Google
adamjohnwright Sep 4, 2026
d823baa
fix(env): the published artifact names beta, because a bucket has no …
adamjohnwright Sep 4, 2026
5b0a5fd
docs: say what a fresh clone needs to actually run
adamjohnwright Sep 4, 2026
580e395
fix(ehld): stop revealing an analysis box that cannot be labelled
adamjohnwright Sep 4, 2026
fd7f9a0
docs(export): say why a selector clause that matches nothing is kept
adamjohnwright Sep 4, 2026
9c8a1b9
fix(env): diagrams come from the bucket on every main deployment again
adamjohnwright Sep 4, 2026
0d82fcf
refactor(env): assets come from the bucket unless a deployment opts out
adamjohnwright Sep 4, 2026
2069e77
fix(test): a service that is not running is absent, a timeout still i…
adamjohnwright Sep 4, 2026
639e988
build: run CI's checks before the push, not after the email
adamjohnwright Sep 4, 2026
2d118e0
fix(test): the probe asks one question, not a list of status codes
adamjohnwright Sep 4, 2026
d85534b
docs: say where each build is published, and correct d823baa's evidence
adamjohnwright Sep 4, 2026
4bb10d6
feat(render): describe a diagram as shapes, for exporters that draw s…
adamjohnwright Sep 4, 2026
80dcc62
build: a typecheck that cannot report success by accident
adamjohnwright Sep 4, 2026
b1af460
feat(pptx): a slide made of shapes, not a picture of one
adamjohnwright Sep 4, 2026
2053c4f
fix(render): invalidate the cache the new PowerPoint export replaces
adamjohnwright Sep 4, 2026
f61a619
docs(render): say how the service is actually deployed
adamjohnwright Sep 4, 2026
4bec908
test(downloads): ask the slide whether it holds shapes
adamjohnwright Sep 4, 2026
79b5db4
docs(preflight): say what fast mode cannot tell you
adamjohnwright Sep 4, 2026
b326169
fix(pptx): draw inhibition as inhibition, not as activation (#169)
adamjohnwright Sep 4, 2026
f8ad272
fix(diagram): keep trivial molecules visible while something is flagg…
adamjohnwright Sep 4, 2026
14a200e
fix(analysis): say which component your data hit, so it can be read (…
adamjohnwright Sep 4, 2026
5eeef11
fix(routing): open the pathway a legacy news link points at (#172)
adamjohnwright Sep 4, 2026
4e332d0
chore(viewport): drop the compare-form scaffold that was never writte…
adamjohnwright Sep 5, 2026
8df040f
fix(pptx): draw the glyph bodies, not empty boxes (#176)
adamjohnwright Sep 9, 2026
2cfbb63
fix(pptx): clip a framed export once, so no shape can escape it (#177)
adamjohnwright Sep 9, 2026
c3c27ce
feat(downloads): say the file is being made, and never save a failure…
adamjohnwright Sep 9, 2026
9db6632
feat(downloads): the same feedback on the detail page's exports (#179)
adamjohnwright Sep 9, 2026
db08e6e
fix(downloads): give up eventually, and keep one implementation of th…
adamjohnwright Sep 9, 2026
a47c95f
fix(hierarchy): hold the tree's place when a deep sub-event is clicke…
adamjohnwright Sep 9, 2026
22bc993
fix(routing): open what the release announcement links to, on a stabl…
adamjohnwright Sep 9, 2026
550fbfb
fix(routing): let a reader come back from a legacy link (#183)
adamjohnwright Sep 9, 2026
6bb5cf7
fix(routing): let Back leave the pathway browser (#184)
adamjohnwright Sep 9, 2026
ce35363
fix(routing): decide "replace or add" from the URL, not from a flag (…
adamjohnwright Sep 9, 2026
eda9f58
fix(routing): ask the path whether this is a content page, not the wh…
adamjohnwright Sep 9, 2026
489cf1d
fix(ci): let the CMS guard allow the format the CMS actually writes (…
adamjohnwright Sep 10, 2026
3f2ce76
docs(e2e): say why the dbId fragment is still tested (#189)
adamjohnwright Sep 10, 2026
ccd4224
content(news): link pathways by stable id, not by dbId (#187)
adamjohnwright Sep 10, 2026
20435dc
fix(ci): judge a rename's source too, and correct the link counts (#190)
adamjohnwright Sep 10, 2026
25cccd9
chore: adopt Spec Kit, with a constitution that says what it cost (#192)
adamjohnwright Sep 10, 2026
9367c60
spec(interactors): confidence filtering and download (#193)
adamjohnwright Sep 10, 2026
dbb25c6
fix(routing): open what a legacy settings-only fragment asked for (#191)
adamjohnwright Sep 10, 2026
adb3f0b
test(downloads): make "working" a state the test cannot miss (#194)
adamjohnwright Sep 10, 2026
3ef125e
test(flagging): read an opacity only at the zoom it was asked for (#196)
adamjohnwright Sep 10, 2026
b2fdb91
chore: stop tracking generated content, and generate it before servin…
adamjohnwright Sep 10, 2026
c28bbac
chore: re-land two review follow-ups that missed their merges (#197)
adamjohnwright Sep 10, 2026
77bde8b
Merge main into the DeltaSignal branch, and put the UI behind a flag
adamjohnwright Sep 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
262 changes: 262 additions & 0 deletions .claude/skills/speckit-analyze/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,262 @@
---
name: "speckit-analyze"
description: "Perform a non-destructive cross-artifact consistency and quality analysis across spec.md, plan.md, and tasks.md after task generation."
argument-hint: "Optional focus areas for analysis"
compatibility: "Requires spec-kit project structure with .specify/ directory"
metadata:
author: "github-spec-kit"
source: "templates/commands/analyze.md"
user-invocable: true
disable-model-invocation: false
---


## User Input

```text
$ARGUMENTS
```

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

## Pre-Execution Checks

**Check for extension hooks (before analysis)**:
- Check if `.specify/extensions.yml` exists in the project root.
- If it exists, read it and look for entries under the `hooks.before_analyze` key
- If the YAML cannot be parsed or is invalid, skip hook checking silently and 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 Goal.
```
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

## Goal

Identify inconsistencies, duplications, ambiguities, and underspecified items across the three core artifacts (`spec.md`, `plan.md`, `tasks.md`) before implementation. This command MUST run only after `/speckit-tasks` has successfully produced a complete `tasks.md`.

## Operating Constraints

**STRICTLY READ-ONLY**: Do **not** modify any files. Output a structured analysis report. Offer an optional remediation plan (user must explicitly approve before any follow-up editing commands would be invoked manually).

**Constitution Authority**: The project constitution (`.specify/memory/constitution.md`) is **non-negotiable** within this analysis scope. Constitution conflicts are automatically CRITICAL and require adjustment of the spec, plan, or tasks—not dilution, reinterpretation, or silent ignoring of the principle. If a principle itself needs to change, that must occur in a separate, explicit constitution update outside `/speckit-analyze`.

## Execution Steps

### 1. Initialize Analysis Context

Run `.specify/scripts/bash/check-prerequisites.sh --json --require-spec --require-tasks --include-tasks` once from repo root and parse JSON for FEATURE_DIR and AVAILABLE_DOCS. Derive absolute paths:

- SPEC = FEATURE_DIR/spec.md
- PLAN = FEATURE_DIR/plan.md
- TASKS = FEATURE_DIR/tasks.md

Abort with an error message if any required file is missing (instruct the user to run missing prerequisite command).
For single quotes in args like "I'm Groot", use escape syntax: e.g 'I'\''m Groot' (or double-quote if possible: "I'm Groot").

### 2. Load Artifacts (Progressive Disclosure)

Load only the minimal necessary context from each artifact:

**From spec.md:**

- Overview/Context
- Functional Requirements
- Success Criteria (measurable outcomes — e.g., performance, security, availability, user success, business impact)
- User Stories
- Edge Cases (if present)

**From plan.md:**

- Architecture/stack choices
- Data Model references
- Phases
- Technical constraints

**From tasks.md:**

- Task IDs
- Descriptions
- Phase grouping
- Parallel markers [P]
- Referenced file paths

**From constitution:**

- Load `.specify/memory/constitution.md` for principle validation

### 3. Build Semantic Models

Create internal representations (do not include raw artifacts in output):

- **Requirements inventory**: For each Functional Requirement (FR-###) and Success Criterion (SC-###), record a stable key. Use the explicit FR-/SC- identifier as the primary key when present, and optionally also derive an imperative-phrase slug for readability (e.g., "User can upload file" → `user-can-upload-file`). Include only Success Criteria items that require buildable work (e.g., load-testing infrastructure, security audit tooling), and exclude post-launch outcome metrics and business KPIs (e.g., "Reduce support tickets by 50%").
- **User story/action inventory**: Discrete user actions with acceptance criteria
- **Task coverage mapping**: Map each task to one or more requirements or stories (inference by keyword / explicit reference patterns like IDs or key phrases)
- **Constitution rule set**: Extract principle names and MUST/SHOULD normative statements

### 4. Detection Passes (Token-Efficient Analysis)

Focus on high-signal findings. Limit to 50 findings total; aggregate remainder in overflow summary.

#### A. Duplication Detection

- Identify near-duplicate requirements
- Mark lower-quality phrasing for consolidation

#### B. Ambiguity Detection

- Flag vague adjectives (fast, scalable, secure, intuitive, robust) lacking measurable criteria
- Flag unresolved placeholders (TODO, TKTK, ???, `<placeholder>`, etc.)

#### C. Underspecification

- Requirements with verbs but missing object or measurable outcome
- User stories missing acceptance criteria alignment
- Tasks referencing files or components not defined in spec/plan

#### D. Constitution Alignment

- Any requirement or plan element conflicting with a MUST principle
- Missing mandated sections or quality gates from constitution

#### E. Coverage Gaps

- Requirements with zero associated tasks
- Tasks with no mapped requirement/story
- Success Criteria requiring buildable work (performance, security, availability) not reflected in tasks

#### F. Inconsistency

- Terminology drift (same concept named differently across files)
- Data entities referenced in plan but absent in spec (or vice versa)
- Task ordering contradictions (e.g., integration tasks before foundational setup tasks without dependency note)
- Conflicting requirements (e.g., one requires Next.js while other specifies Vue)

### 5. Severity Assignment

Use this heuristic to prioritize findings:

- **CRITICAL**: Violates constitution MUST, missing core spec artifact, or requirement with zero coverage that blocks baseline functionality
- **HIGH**: Duplicate or conflicting requirement, ambiguous security/performance attribute, untestable acceptance criterion
- **MEDIUM**: Terminology drift, missing non-functional task coverage, underspecified edge case
- **LOW**: Style/wording improvements, minor redundancy not affecting execution order

### 6. Produce Compact Analysis Report

Output a Markdown report (no file writes) with the following structure:

## Specification Analysis Report

| ID | Category | Severity | Location(s) | Summary | Recommendation |
|----|----------|----------|-------------|---------|----------------|
| A1 | Duplication | HIGH | spec.md:L120-134 | Two similar requirements ... | Merge phrasing; keep clearer version |

(Add one row per finding; generate stable IDs prefixed by category initial.)

**Coverage Summary Table:**

| Requirement Key | Has Task? | Task IDs | Notes |
|-----------------|-----------|----------|-------|

**Constitution Alignment Issues:** (if any)

**Unmapped Tasks:** (if any)

**Metrics:**

- Total Requirements
- Total Tasks
- Coverage % (requirements with >=1 task)
- Ambiguity Count
- Duplication Count
- Critical Issues Count

### 7. Provide Next Actions

At end of report, output a concise Next Actions block:

- If CRITICAL issues exist: Recommend resolving before `/speckit-implement`
- If only LOW/MEDIUM: User may proceed, but provide improvement suggestions
- Provide explicit command suggestions: e.g., "Run /speckit-specify with refinement", "Run /speckit-plan to adjust architecture", "Manually edit tasks.md to add coverage for 'performance-metrics'"

### 8. Offer Remediation

Ask the user: "Would you like me to suggest concrete remediation edits for the top N issues?" (Do NOT apply them automatically.)

### 9. Check for extension hooks

After reporting, check if `.specify/extensions.yml` exists in the project root.
- If it exists, read it and look for entries under the `hooks.after_analyze` key
- If the YAML cannot be parsed or is invalid, skip hook checking silently and 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

## Operating Principles

### Context Efficiency

- **Minimal high-signal tokens**: Focus on actionable findings, not exhaustive documentation
- **Progressive disclosure**: Load artifacts incrementally; don't dump all content into analysis
- **Token-efficient output**: Limit findings table to 50 rows; summarize overflow
- **Deterministic results**: Rerunning without changes should produce consistent IDs and counts

### Analysis Guidelines

- **NEVER modify files** (this is read-only analysis)
- **NEVER hallucinate missing sections** (if absent, report them accurately)
- **Prioritize constitution violations** (these are always CRITICAL)
- **Use examples over exhaustive rules** (cite specific instances, not generic patterns)
- **Report zero issues gracefully** (emit success report with coverage statistics)

## Context

$ARGUMENTS
Loading
Loading