Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Development standards for the Nathan n8n-Jira agent automation system. Covers n8n workflows, Python patterns, and project conventions.
.claude/skills/aiskillstore-nathan-standards/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | -11% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 11% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 29% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 36% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 11% | 0% |
Standards and patterns for developing within the Nathan project - an n8n-Jira agent automation system.
Invoke this skill when:
Nathan follows a layered architecture:
textExternal Service (Jira) <-- n8n Workflows <-- Python Agent Service (credentials) (webhook calls)
Core Principle: n8n owns all external credentials. Python services call n8n webhooks with shared secret authentication.
For detailed workflow patterns, load references/n8n-workflow-patterns.md.
Every webhook workflow must follow this pattern:
textWebhook --> Validate Secret --> Operation --> Respond to Webhook | | | v v v Unauthorized Error Response Success Response Response (401) (500) (200)
json{ "id": "validate-secret", "name": "Validate Secret", "type": "n8n-nodes-base.if", "typeVersion": 2, "parameters": { "conditions": { "conditions": [{ "leftValue": "={{ $json.headers['x-n8n-secret'] }}", "rightValue": "={{ $env.N8N_WEBHOOK_SECRET }}", "operator": { "type": "string", "operation": "equals" } }] } } }
All responses must follow this shape:
json{ "success": true, "data": {...}, "status_code": 200, "error": null } { "success": false, "data": {}, "status_code": 500, "error": "message" }
In n8n expressions within JSON, escape properly:
| Wrong | Correct | |-------|---------| | .map(x => "${x}") | .map(x => '"' + x + '"') | | .join('\n') | .join('\\n') | | .replaceAll('\n', ' ') | .replaceAll('\\n', ' ') |
For detailed patterns, load references/python-patterns.md.
textnathan/ helpers/ # Shared utilities (workflow registry, etc.) workflows/ # n8n workflow JSON + registry.yaml per category templating/ # YAML-to-JSON template engine scripts/ # Standalone runnable scripts
python# Required imports pattern from __future__ import annotations from typing import Any from pathlib import Path import logging logger = logging.getLogger(__name__) # Type hints required, use T | None not Optional[T] async def trigger_workflow(url: str, params: dict[str, Any]) -> dict[str, Any]: ...
yaml# registry.yaml version: "1.0.0" description: "Registry description" commands: command_name: endpoint: /webhook/endpoint-path method: POST required_params: - param1 optional_params: - param2 description: What this command does example: param1: "value"
Use agent-os commands for feature development:
/shape-spec - Initialize and shape specification/write-spec - Write detailed spec document/create-tasks - Generate task list from spec/orchestrate-tasks - Delegate to subagentsSpecs live in agent-os/specs/[spec-name]/ with:
spec.md - Feature specificationtasks.md - Implementation tasks with checkboxesorchestration.yml - Subagent delegation configbashuv sync # Install dependencies uv run pytest # Run tests uv run pytest path/to/test.py -v # Single test file uvx ruff check . # Lint uvx ruff format . # Format docker compose -f docker-compose.n8n.yml up -d # Start n8n
| Variable | Purpose | |----------|---------| | N8N_WEBHOOK_SECRET | Shared secret for webhook auth | | N8N_API_KEY | n8n Public API key | | JIRA_DOMAIN | Jira Cloud domain | | JIRA_EMAIL | Jira account email | | JIRA_API_TOKEN | Jira API token |
| Type | Convention | Example | |------|------------|---------| | Workflow JSON | kebab-case.json | jira-get-ticket.json | | Python modules | snake_case.py | n8n_workflow_registry.py | | Test files | test_*.py | test_parser.py | | Registry | registry.yaml | per workflow category |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-13 | pass→pass | 6,968 | 2,871 | -59% | 1 | 1 | 0% | 1,077 | 1,549 | +44% | 0 | 0 | — |
case-01 | fail→pass | 27,166 | 10,155 | -63% | 1 | 1 | 0% | 4,048 | 3,595 | -11% | 0 | 0 | — |
case-02 | fail→pass | 14,266 | 9,319 | -35% | 1 | 1 | 0% | 2,851 | 3,156 | +11% | 0 | 0 | — |
case-07 | fail→pass | 7,700 | 2,287 | -70% | 1 | 1 | 0% | 1,230 | 1,589 | +29% | 0 | 0 | — |
case-03 | fail→pass | 25,670 | 8,977 | -65% | 1 | 1 | 0% | 2,225 | 3,016 | +36% | 0 | 0 | — |
case-04 | fail→pass | 9,042 | 3,773 | -58% | 1 | 1 | 0% | 1,678 | 1,856 | +11% | 0 | 0 | — |
case-05 | pass→pass | 13,378 | 5,346 | -60% | 1 | 1 | 0% | 2,214 | 2,059 | -7% | 0 | 0 | — |
case-06 | fail→pass | 14,869 | 6,000 | -60% | 1 | 1 | 0% | 2,240 | 2,227 | -1% | 0 | 0 | — |
case-08 | fail→pass | 11,665 | 1,917 | -84% | 1 | 1 | 0% | 1,935 | 1,589 | -18% | 0 | 0 | — |
case-09 | fail→pass | 9,380 | 2,529 | -73% | 1 | 1 | 0% | 1,717 | 1,653 | -4% | 0 | 0 | — |
case-10 | fail→pass | 7,238 | 2,590 | -64% | 1 | 1 | 0% | 1,407 | 1,633 | +16% | 0 | 0 | — |
case-11 | fail→pass | 3,461 | 1,732 | -50% | 1 | 1 | 0% | 528 | 1,466 | +178% | 0 | 0 | — |
case-12 | pass→pass | 5,575 | 1,897 | -66% | 1 | 1 | 0% | 952 | 1,514 | +59% | 0 | 0 | — |
case-14 | pass→pass | 7,322 | 1,270 | -83% | 1 | 1 | 0% | 1,210 | 1,406 | +16% | 0 | 0 | — |
case-15 | fail→pass | 8,912 | 1,973 | -78% | 1 | 1 | 0% | 1,570 | 1,573 | +0% | 0 | 0 | — |
case-16 | fail→pass | 8,400 | 2,023 | -76% | 1 | 1 | 0% | 1,330 | 1,551 | +17% | 0 | 0 | — |
case-17 | fail→pass | 10,103 | 2,805 | -72% | 1 | 1 | 0% | 1,742 | 1,661 | -5% | 0 | 0 | — |
case-18 | fail→pass | 9,506 | 1,737 | -82% | 1 | 1 | 0% | 1,560 | 1,523 | -2% | 0 | 0 | — |
case-19 | fail→fail | 12,585 | 3,215 | -74% | 1 | 1 | 0% | 2,260 | 1,763 | -22% | 0 | 0 | — |
case-20 | pass→pass | 5,528 | 6,363 | +15% | 1 | 1 | 0% | 1,004 | 2,325 | +132% | 0 | 0 | — |
case-21 | pass→pass | 5,376 | 4,978 | -7% | 1 | 1 | 0% | 894 | 2,104 | +135% | 0 | 0 | — |
case-22 | pass→pass | 7,402 | 6,305 | -15% | 1 | 1 | 0% | 1,356 | 2,245 | +66% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +64 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.