.vscode — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited .vscode (MCP Server) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
An MCP (Model Context Protocol) server that connects AI coding agents and assistants to PreSonus StudioLive III series mixers over the local network.
Exposes live mixer context — channel names, mute/solo/fader state, Fat Channel compressor/EQ models, meter activity, and scene information — as MCP resources and tools so that AI agents can read, reason about, and assist with live sound engineering without touching hardware autonomously.
Current status: Field-ready backend (v1.0). The MCP server exposes 10 resources + 33 read-only tools (+ 7 write tools when controlEnabled: true). Empirically validated on StudioLive 32SC firmware 3.3.0.109659, covering v0.1–v1.0 milestones.The MCP server gives an AI agent these capabilities:
| Capability | How |
|---|---|
| Discover mixers on the network | discover_mixers tool |
| Verify FOH vs. stagebox identity | validate_mixer_identity tool |
| Refresh state cache on demand | refresh_mixer_state tool |
| Read channel names, mute, solo, fader, pan, color, Fat Channel models | presonus://mixer/{id}/channels resource |
| Read per-channel Fat Channel DSP state (EQ, comp, gate, limiter) | get_fat_channel tool / presonus://mixer/{id}/fat-channel/{id} resource |
| Validate Fat Channel settings for a source type | validate_fat_channel_for_source tool |
| Know mixer capacity (inputs, aux mixes, FX buses, stagebox) | get_mixer_capabilities tool |
| Validate rider capacity requirements | check_required_setup tool |
| Validate expected channel names, phantom, mute | validate_channel_setup tool |
| Validate an agent-provided input list against the mixer | validate_input_list_against_mixer tool |
| Validate a patch sheet for conflicts and range issues | validate_patch_sheet tool |
| Render a structured patch sheet for human printing | render_patch_sheet_data tool |
| Monitor signal activity (silent / active / hot / clipping) | presonus://mixer/{id}/meters/summary resource |
| Know which project and scene are loaded | presonus://mixer/{id}/scene/current resource |
| Diagnose a single channel (mute, fader, gate, signal) | diagnose_channel tool |
| Run a line-check step and observe meter results | analyze_line_check_step tool |
| Detect possible patch swaps during line check | detect_possible_patch_swap tool |
| Diagnose no-signal routing causes | diagnose_no_signal_routing tool |
| Inspect observable routing (AUX/FX/sub/main sends) | get_routing_graph tool / presonus://mixer/{id}/routing resource |
| Validate input routing (Layer A: name, meter, mute) | validate_input_routing tool |
| Validate stagebox connection | validate_stagebox_routing tool |
| Inspect output patch router (source index) | presonus://mixer/{id}/routing/outputs resource |
| Inspect AUX mixes (master, sends, levels) | get_aux_mix tool / presonus://mixer/{id}/auxes resource |
| Validate monitor send requirements | validate_monitor_requirements tool |
| Find missing / muted / hot monitor sends | find_missing_monitor_sends, find_muted_monitor_sends, find_hot_monitor_sends tools |
| Full aux mix audit | validate_aux_mix tool |
| Inspect FX send routing | presonus://mixer/{id}/fx-sends resource |
| Inspect flat channel-to-aux routing graph | presonus://mixer/{id}/monitor-routing resource |
| Raw diagnostic state dump | presonus://mixer/{id}/raw/state resource |
| Propose and apply an EQ change (write-enabled only) | propose_eq_change + apply_change_set tools |
By default agents cannot change mixer parameters. Two write tools (propose_eq_change + apply_change_set) are available when controlEnabled: true — see ADR-006.
| Requirement | Details |
|---|---|
| Mixer | PreSonus StudioLive III series (16, 16R, 24R, 32SC, 32R) |
| Network | Mixer and MCP server host on the same LAN segment |
| Protocol | TCP port 53000 (UC Surface / Studio One Remote protocol) |
| Coexistence | UC Surface, QMix-UC, and this server can connect simultaneously |
| Internet | Not required |
git clone https://github.com/zarfld/presonus-studiolive-mcp.git
cd presonus-studiolive-mcp
pnpm install # installs all workspace packages + applies featherbear patch
pnpm build # compiles all 4 packagespnpm mcp:serverOr without a prior build, using tsx:
pnpm mcp:server:devThe server logs to stderr, connects to discovered mixers on startup, and accepts MCP requests on stdin/stdout.
Add to your MCP client config:
{
"mcpServers": {
"presonus-studiolive": {
"command": "node",
"args": ["<absolute-path>/packages/presonus-mcp-server/dist/index.js"]
}
}
}pnpm probe:dev discover # find mixers on your LAN
pnpm probe:dev dump-state -d <ip> # dump full state tree to captures/
pnpm probe:dev probe-fat-channel -d <ip> -c LINE:1 # inspect Fat Channel state for ch1This is a pnpm monorepo with four packages under packages/. Dependencies flow one way: domain ← adapter ← inspector | server.
@presonus-mcp/domainPure TypeScript/Zod schema library — the single source of truth for all data contracts.
MixerIdentitySchema — deviceId, serial, IP, port, role, controllableMixerChannelSchema — name, mute, solo, fader (dB/linear/raw), pan, color, compModelName, eqModelNameMeterSummarySchema — time-windowed channel activity classificationFatCompressorStateSchema / FatEqStateSchema — discriminated unions per modelCOMPRESSOR_MODEL_BY_CLASSID / EQ_MODEL_BY_CLASSID — full GUID → model name maps for scene file decodingdecodeCompressorModel(value) / decodeEqModel(value) — live state float → model name helpersNo runtime dependency on featherbear or the MCP SDK.
@presonus-mcp/adapterHardware adapter wrapping @featherbear/presonus-studiolive-api. Manages connections, state, and meters.
discoverMixers({ timeoutMs? }) — UDP broadcast discoveryPresonusClientManager — connects/disconnects clients; provides getSnapshot(), getIdentity(), getSummarizer()flattenFeatherbearState() — converts featherbear's nested _data.internal.children.* tree to flat dot-notation keysPresonusMeterSummarizer — ring-buffer of raw uint16 meter packets → time-windowed MeterSummarymapRawStateToSnapshot() — translates flat state keys to normalized MixerSnapshotThe featherbear dependency is patched (patches/@[email protected]) to add UBJSON I (int16) and D (float64) type support missing from the original.
@presonus-mcp/inspectorProbe CLI binary (presonus-probe) for hardware reconnaissance during development. See Probe CLI.
@presonus-mcp/serverMCP server that wires the adapter to the MCP SDK over stdio transport. Registers 10 resources and 22 read-only tools at startup (+ 2 write tools when write-enabled). Runs background mixer discovery.
All 22 read-only tools are always registered. Two write tools (propose_eq_change, apply_change_set) are registered only when controlEnabled: true.
| Group | Tools |
|---|---|
| Discovery / identity | discover_mixers, refresh_mixer_state, validate_mixer_identity |
| Capabilities | get_mixer_capabilities, check_required_setup |
| Channel setup | validate_channel_setup, diagnose_channel |
| Input list / patch sheet | validate_input_list_against_mixer, validate_patch_sheet, render_patch_sheet_data |
| Fat Channel inspection | get_fat_channel, validate_fat_channel_for_source |
| Line check | analyze_line_check_step, detect_possible_patch_swap |
| Routing | get_routing_graph, validate_input_routing, validate_stagebox_routing, diagnose_no_signal_routing, get_input_routing\, `validate_avb_routing`\, validate_output_routing† |
| Monitor / aux | get_aux_mix, validate_monitor_requirements, find_missing_monitor_sends, find_muted_monitor_sends, find_hot_monitor_sends, validate_aux_mix |
| Write (gated) | propose_eq_change, apply_change_set |
\* Layer B stub — returns not_verifiable_with_current_adapter with probe instructions. † Layer B partial — source index known; source name requires probe.
#### discover_mixers
Trigger UDP discovery of StudioLive III mixers on the local network.
{ timeoutMs?: number } // discovery window in ms; default 5000
// → [{ deviceId, serial, model, firmware, role, ipAddress, port }]#### validate_mixer_identity
Verify a connected mixer matches expected serial and/or role before proceeding.
{ deviceId: string, expectedSerial?: string, expectedRole?: "FOH"|"STAGEBOX"|"MONITOR"|"UNKNOWN" }
// → { valid: boolean, reasons: string[] }#### validate_input_list_against_mixer
Validate an agent-provided input list against actual mixer state. Returns name mismatches, phantom mismatches, mute issues, and printable patch rows.
{
deviceId: string,
inputList: [{ inputNo: number, sourceName: string, phantomRequired: boolean, micPreference?: string, notes?: string }]
}
// → { status: "ok"|"warning"|"error", issues[], printablePatchRows[] }#### get_fat_channel
Return the Fat Channel DSP state (EQ, compressor, gate, limiter, HPF) for a single channel.
{ deviceId: string, channelId: string } // channelId e.g. "line.ch1"
// → ChannelFatState (eqModel, compModel, eqBands, comp, gate, limiter, hpfFrequencyHz)#### validate_fat_channel_for_source
Check Fat Channel settings against source-type expectations (HPF engaged, gate enabled, comp enabled, limiter enabled).
{ deviceId: string, channelId: string, sourceType: "vocal"|"kick"|"snare"|"bass"|... }
// → { checks: [{ check, passed, detail }], warnings: string[], parameterConfidence }#### presonus://mixers
All connected mixer identities.
#### presonus://mixer/{deviceId}/channels
Normalized channel list. Each channel includes:
{
id: string, // "line.ch1", "aux.ch3", "sub.ch1", …
selector: { type, channel },
name?: string, // label from mixer (e.g. "Kick In")
mute?: boolean,
solo?: boolean,
fader?: { db: number|null, linear: number|null },
pan?: number, // 0.0 left … 0.5 center … 1.0 right
linked?: boolean,
color?: string, // RGBA hex
// Fat Channel — decoded from live opt.compmodel / opt.eqmodel
compModelName?: string, // e.g. "FET", "BRIT_COMP", "FC_670"
eqModelName?: string // e.g. "STANDARD", "ALPINE_EQ_550", "SOLAR_69_EQ"
}#### presonus://mixer/{deviceId}/meters/summary
Time-windowed meter classification (last 10 seconds):
{
windowSec: number,
computedAt: string, // ISO 8601
silentChannels: string[], // channel ids with no signal
activeChannels: string[], // signal in normal range
hotChannels: string[], // approaching clip
clippingChannels: string[], // at or above clip threshold
noSignalButExpected: string[],
signalButUnexpected: string[]
}#### presonus://mixer/{deviceId}/scene/current
{
currentProject: string | null,
currentScene: string | null,
availableProjects: string[]
}#### presonus://mixer/{deviceId}/routing
Per-channel AUX/FX/subgroup/main-LR send routing. parameterConfidence: 'inferred' until AUX fader de-normalization is probe-confirmed.
#### presonus://mixer/{deviceId}/routing/outputs
Output patch router — source index known for each analog/AVB output; sourceName: null until probe confirms source → index mapping.
#### presonus://mixer/{deviceId}/auxes
All aux mixes: master level/mute + per-channel send levels. prePost: 'unknown' until hardware probing confirms.
#### presonus://mixer/{deviceId}/fx-sends
Per-channel FX bus send state.
#### presonus://mixer/{deviceId}/monitor-routing
Flattened channel-to-aux routing graph for monitor mix planning.
#### presonus://mixer/{deviceId}/fat-channel/{channelId}
Fat Channel DSP state for a single channel (EQ, compressor, gate, limiter, HPF, model names). Use get_fat_channel tool instead when querying programmatically.
#### presonus://mixer/{deviceId}/raw/state
Full raw state dump (pre-normalized flat dot-notation). For diagnostics and development only — do not use for agent reasoning logic.
Layer A / Layer B routing model: Layer A resources and tools return data directly observable from confirmed state keys. Layer B tools (get_input_routing,validate_avb_routing) returnnot_verifiable_with_current_adapterand include probe instructions — physical cable routing and AVB stream assignments cannot be verified by software alone.
presonus-probe is the hardware reconnaissance tool used during development. Run via pnpm probe:dev <command>.
| Command | Purpose |
|---|---|
discover | Find all StudioLive III mixers on the LAN; print serial/model/IP/role |
dump-state -d <ip> | Connect and dump full flat state tree as JSON to captures/ |
watch-events -d <ip> | Stream all featherbear data events as NDJSON |
watch-meters -d <ip> | Capture raw meter stream as NDJSON |
diff-state --before <f> --after <f> | Compare two state dumps; identify changed keys (workflow: change one control → dump-state → diff → name the key) |
probe-fat-channel -d <ip> -c <TYPE:N> | Dump all Fat Channel state keys for a channel (e.g. LINE:1) |
read-scene -d <ip> | List projects and scenes stored on the mixer |
Note: Scene file content (__classidGUIDs) is not accessible over the network API — it returns 0 bytes. Fat Channel model identity must be read from live state viaopt.compmodel.value/opt.eqmodel.value.
A VS Code / Copilot skill is included at .github/Skills/PresonusFatChannelSelection/SKILL.md.
It gives AI agents:
__classid GUID reference for all models (from classID_Mapping.md, empirically confirmed on 32SC firmware 3.3.0.109659)pnpm install # install + apply featherbear patch
pnpm build # compile all packages
pnpm build:watch # watch mode
pnpm clean # remove all dist/ and tsbuildinfo
pnpm test # unit tests (no hardware needed)
pnpm test:watch # watch mode
pnpm test:coverage # with coverage report
pnpm test:hil # hardware-in-loop tests (requires HIL_PRESONUS=1 + physical mixer)
pnpm typecheck # tsc dry-run
pnpm probe:dev discover # discover mixers
pnpm probe:dev dump-state -d <mixer-ip> # capture state
pnpm probe:dev probe-fat-channel -d <ip> -c LINE:1 # inspect channel
pnpm mcp:server:dev # run MCP server (tsx, no build needed)
pnpm mcp:server # run MCP server (compiled dist/)| Test type | Command | Requires hardware |
|---|---|---|
| Unit (schema/adapter logic) | pnpm test | No |
| HIL (hardware-in-loop) | pnpm test:hil | Yes — see below |
#### HIL test setup
HIL tests require a physical StudioLive III mixer on the local network. Set the following environment variables before running pnpm test:hil:
# Required
export HIL_PRESONUS=1 # enables HIL test suite
export HIL_PRESONUS_IP=<mixer-ip-address> # e.g. 192.168.1.50
export HIL_PRESONUS_SERIAL=<serial-number> # e.g. SD7E21010066
# Then run
pnpm test:hilOn Windows PowerShell:
$env:HIL_PRESONUS="1"
$env:HIL_PRESONUS_IP="<mixer-ip>"
$env:HIL_PRESONUS_SERIAL="<serial>"
pnpm test:hilUnit tests cover all domain schemas, decode functions, flattenFeatherbearState, and PresonusMeterSummarizer using captured fixture data from captures/.
All requirements, architecture decisions, and test cases are tracked as GitHub issues following this taxonomy:
| Prefix | Type | Example |
|---|---|---|
StR-NNN | Stakeholder requirement | #1–#4 |
REQ-F-* | Functional requirement | #15–#46 |
REQ-NF-* | Non-functional requirement | #21–#24 |
ADR-* | Architecture decision | #47 |
QA-SC-* | Quality attribute scenario | #25–#27, #49–#50 |
TEST-* | Verification test case | #51–#60, #80–#83 |
Issues are organized into milestones v0.1–v1.0. See the GitHub Issues tab for the full traceability register.
pnpm probe:dev dump-state -d <ip> before and after changing a control in UC Surfacepnpm probe:dev diff-state --before <before.json> --after <after.json> — identifies the changed keypackages/presonus-adapter/src/types.tsmapRawStateToSnapshot() or expose via rawExtraThree-layer architecture (ADR-002):
┌─────────────────────────────────────────┐
│ AI Agent / MCP Client │
│ (Claude Desktop, VS Code, custom) │
└────────────────┬────────────────────────┘
│ stdio (MCP protocol)
┌────────────────▼────────────────────────┐
│ @presonus-mcp/server │
│ 10 resources + 33 tools (read-only) │
└────────────────┬────────────────────────┘
│ internal API
┌────────────────▼────────────────────────┐
│ @presonus-mcp/adapter │
│ PresonusClientManager │
│ flattenFeatherbearState() │
│ PresonusMeterSummarizer │
└────────────────┬────────────────────────┘
│ TCP 53000 (UC Surface protocol)
┌────────────────▼────────────────────────┐
│ StudioLive III mixer │
│ (32SC, 32R, 24R, 16R, 16) │
└─────────────────────────────────────────┘Domain schemas (@presonus-mcp/domain) sit outside this stack and are imported by both adapter and server — never the other way round.
Key decisions:
@featherbear/presonus-studiolive-api v1.8.0 pinned + patched as hardware adapterProposedChangeSet + audit log + confirmation flow before being enabledpropose_eq_change + apply_change_set are available (write-enabled mode). Extended change-set framework (rename, mute, fader, aux send, comp/gate/limiter) planned.probe-routing diff --kind input-source/avb-stream). get_input_routing and validate_avb_routing return probe instructions.validate_output_routing knows source indices but not names; probe-diff with --kind bus-to-output needed.ShowInputSchema is a stub (rider analysis, channel template suggestions).__classid GUIDs not accessible over network; only live state model IDs available.*.hil.test.ts require a physical mixer.[Specify your license here]
This repository provides:
applyTo: patterns| Standard | Purpose | Coverage |
|---|---|---|
| ISO/IEC/IEEE 12207:2017 | Software life cycle processes | Complete lifecycle framework |
| ISO/IEC/IEEE 29148:2018 | Requirements engineering | Requirements elicitation, analysis, specification |
| IEEE 1016-2009 | Software design descriptions | Architecture and detailed design |
| ISO/IEC/IEEE 42010:2011 | Architecture description | Architecture views, viewpoints, concerns |
| IEEE 1012-2016 | Verification & validation | V&V planning, testing, reviews |
copilot-instructions-template/
├── .github/
│ ├── copilot-instructions.md # Root Copilot instructions
│ ├── workflows/ # CI/CD automation
│ └── ISSUE_TEMPLATE/ # Issue templates
│
├── 01-stakeholder-requirements/
│ ├── .github/copilot-instructions.md # Phase-specific instructions
│ ├── stakeholders/ # Stakeholder analysis
│ ├── business-context/ # Business needs
│ └── templates/ # Requirements templates
│
├── 02-requirements/
│ ├── .github/copilot-instructions.md
│ ├── functional/ # Functional requirements
│ ├── non-functional/ # Quality attributes
│ ├── use-cases/ # Use case specifications
│ └── user-stories/ # XP user stories
│
├── 03-architecture/
│ ├── .github/copilot-instructions.md
│ ├── decisions/ # ADRs (Architecture Decision Records)
│ ├── views/ # IEEE 42010 architecture views
│ ├── diagrams/ # C4, UML diagrams
│ └── constraints/ # Technical constraints
│
├── 04-design/
│ ├── .github/copilot-instructions.md
│ ├── components/ # Component designs
│ ├── interfaces/ # API specifications
│ ├── data-models/ # Data structures
│ └── patterns/ # Design patterns used
│
├── 05-implementation/
│ ├── .github/copilot-instructions.md
│ ├── src/ # Source code
│ ├── tests/ # Test-first XP tests
│ └── docs/ # Code documentation
│
├── 06-integration/
│ ├── .github/copilot-instructions.md
│ ├── integration-tests/ # Integration test suites
│ ├── ci-config/ # CI/CD configurations
│ └── deployment/ # Deployment scripts
│
├── 07-verification-validation/
│ ├── .github/copilot-instructions.md
│ ├── test-plans/ # IEEE 1012 test plans
│ ├── test-cases/ # Detailed test cases
│ ├── test-results/ # Test execution results
│ └── traceability/ # Requirements traceability
│
├── 08-transition/
│ ├── .github/copilot-instructions.md
│ ├── deployment-plans/ # Deployment strategies
│ ├── user-documentation/ # End-user guides
│ └── training-materials/ # Training resources
│
├── 09-operation-maintenance/
│ ├── .github/copilot-instructions.md
│ ├── monitoring/ # Operations monitoring
│ ├── incident-response/ # Incident management
│ └── maintenance-logs/ # Change logs
│
├── spec-kit-templates/
│ ├── requirements-spec.md # IEEE 29148 templates
│ ├── design-spec.md # IEEE 1016 templates
│ ├── architecture-spec.md # IEEE 42010 templates
│ ├── test-spec.md # IEEE 1012 templates
│ └── user-story-template.md # XP user story template
│
├── standards-compliance/
│ ├── checklists/ # Phase-specific checklists
│ ├── reviews/ # Review reports
│ └── metrics/ # Quality metrics
│
└── docs/
├── lifecycle-guide.md # Complete lifecycle guide
├── xp-practices.md # XP implementation guide
├── copilot-usage.md # How to use Copilot instructions
└── standards-reference.md # Standards quick reference# Create repository from this template on GitHub
# OR clone and customize
git clone https://github.com/YOUR_ORG/copilot-instructions-template.git my-new-project
cd my-new-project# Update project-specific information
# Edit .github/copilot-instructions.md with your project details
# Customize templates in spec-kit-templates/Start with Phase 01 and progress through each phase:
GitHub Copilot will automatically load phase-specific instructions based on the folder you're working in:
02-requirements/).github/copilot-instructions.md in that folderUse markdown specifications for AI-assisted development:
# Copy template for your feature
cp spec-kit-templates/requirements-spec.md 02-requirements/functional/feature-xyz.md
# Fill in the specification
# Use GitHub Copilot to generate code from specCopilot instructions use applyTo: patterns to target specific file types:
applyTo:
- "02-requirements/**/*.md"
- "02-requirements/**/use-cases/*.md"
- "02-requirements/**/user-stories/*.md"Each phase enforces relevant standards:
## Standards Compliance
- IEEE 29148:2018 - Requirements specification format
- Traceability matrix required
- Review checklist completion mandatory## XP Practices
- Write user stories in Given-When-Then format
- Maintain story point estimates
- Track velocityThis template uses GitHub Issues as the primary traceability mechanism for all requirements, architecture decisions, and test cases. All artifacts are tracked as issues with bidirectional links.
| Type | Label | Prefix | Description | Example |
|---|---|---|---|---|
| Stakeholder Requirement | type:stakeholder-requirement | StR- | Business needs and context | StR-001: User Authentication |
| Functional Requirement | type:requirement:functional | REQ-F- | System functional behavior | REQ-F-AUTH-001: Login with credentials |
| Non-Functional Requirement | type:requirement:non-functional | REQ-NF- | Quality attributes | REQ-NF-PERF-001: Response time < 200ms |
| Architecture Decision | type:architecture:decision | ADR- | Architectural choices | ADR-SECU-001: Use JWT authentication |
| Architecture Component | type:architecture:component | ARC-C- | Component specifications | ARC-C-AUTH-001: Authentication service |
| Quality Scenario | type:architecture:quality-scenario | QA-SC- | ATAM quality scenarios | QA-SC-PERF-001: Peak load scenario |
| Test Case | type:test | TEST- | Verification specifications | TEST-AUTH-LOGIN-001: Valid login test |
Additional labels:
phase:01-stakeholder-requirements, phase:02-requirements, etc.priority:critical, priority:high, priority:medium, priority:lowtest-type:unit, test-type:integration, test-type:e2e, test-type:acceptancestatus:draft, status:approved, status:implemented, status:verifiedAll issues must include traceability links:
## Traceability
- Traces to: #123 (parent StR issue)
- **Depends on**: #45, #67 (prerequisite requirements)
- **Verified by**: #89, #90 (test issues)
- **Implemented by**: #PR-15 (pull request)
- **Refined by**: #234, #235 (child requirements)Issue templates are available in .github/ISSUE_TEMPLATE/:
stakeholder-requirement.ymlfunctional-requirement.ymlnon-functional-requirement.ymlarchitecture-decision.ymlarchitecture-component.ymlquality-scenario.ymltest-case.yml#### 1. Create Stakeholder Requirement Issue
# Using GitHub CLI
gh issue create \
--title "StR-001: User Authentication" \
--label "type:stakeholder-requirement,phase:01-stakeholder-requirements,priority:critical" \
--body "$(cat issue-body.md)"#### 2. Create Functional Requirement from StR
## Traceability
- Traces to: #1 (StR-001: User Authentication)
## Description
System shall allow users to log in with username and password.
## Acceptance Criteria
- [ ] User can enter username and password
- [ ] System validates credentials
- [ ] User is redirected to dashboard on success
- [ ] Error message displayed on failure#### 3. Link Code to Issues
"""
User authentication service.
Implements: #2 (REQ-F-AUTH-001: User Login)
Architecture: #5 (ADR-SECU-001: JWT Authentication)
Verified by: #10 (TEST-AUTH-LOGIN-001)
See: https://github.com/org/repo/issues/2
"""
class AuthenticationService:
pass#### 4. Link Tests to Requirements
"""
Test user login functionality.
Verifies: #2 (REQ-F-AUTH-001: User Login)
Test Type: Integration
Priority: P0 (Critical)
"""
def test_user_login_success():
# Test implementation#### 5. Link Pull Requests
## Description
Implements user authentication feature
## Related Issues
Fixes #2
Implements #5
Part of #1
## Traceability
- **Requirements**: #2 (REQ-F-AUTH-001)
- **Design**: #5 (ADR-SECU-001)
- **Tests**: #10 (TEST-AUTH-LOGIN-001)Available in scripts/:
Example usage:
# Find requirements without tests
python scripts/trace_unlinked_requirements.py
# Validate traceability
python scripts/validate-traceability.py
# Generate traceability matrix
python scripts/generate-traceability-matrix.py --output-htmlGitHub Actions workflows validate traceability:
# .github/workflows/validate-traceability.yml
name: Validate Traceability
on: [pull_request]
jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Validate issue links
run: python scripts/validate-issue-traceability.py
- name: Check test coverage
run: python scripts/validate-trace-coverage.py
- name: Generate matrix
run: python scripts/generate-traceability-matrix.pyFixes #N, Implements #N, Part of #N# List all functional requirements
gh issue list --label "type:requirement:functional"
# Find requirements without tests
gh issue list --label "type:requirement:functional" --json number,title,labels \
| jq '.[] | select(.labels | map(.name) | contains(["status:verified"]) | not)'
# Show traceability for requirement #2
gh issue view 2 --json body | jq -r '.body' | grep -A 10 "## Traceability"
# List all open architecture decisions
gh issue list --label "type:architecture:decision" --state openEach phase includes:
XX-custom-phase/.github/copilot-instructions.mdspec-kit-templates/This template is designed to be:
[Specify your license here]
Ready to build standards-compliant software with AI assistance? Start with Phase 01!
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.