backstage companion
by @nonlinear
Anti-drift protocol script. Ensures parity between docs and system. Triggers: 'bom dia PROJECT' / 'good morning PROJECT' (load project context with health ch...
clawhub install backstageπ About This Skill
name: backstage description: "Anti-drift protocol script. Ensures parity between docs and system. Triggers: 'bom dia PROJECT' / 'good morning PROJECT' (load project context with health checks)" type: public version: 1.0.2 status: production author: nonlinear license: MIT requires: - https://github.com/nonlinear/backstage dependencies: - bash - awk - sed - git
Backstage Skill
Nickname: backstage:
Objective: Universal project status management for AI-assisted development. Ensures documentation matches reality before every commit.
β οΈ Security Notice
This is an admin tool with elevated privileges:
$HOME/Documents/backstage/backstage/checks/global/)update backstage triggerIntended for:
Not recommended for:
Mitigations in place:
Use at your own risk. Review update-backstage.sh and checks.sh before running.
π΄ Why This Skill Exists (Anti-Drift)
Backstage-skill = ANTI-DRIFT:
WITHOUT IT: Work happens outside backstage β drift β broken trust β triple metabolic cost
WITH IT: "good morning X" β automatic context load β work inside boundaries β paridade maintained
The Metabolic Cost Problem:
Without backstage, delegation costs triple: 1. The work itself 2. Explicating methodology (ethics, preferences, protocols) 3. Defining WHERE that learning gets stored (VISION? SOUL? SKILL? memory?)
This is exhausting for the human.
Investment is worth it ONLY IF plateau is reached:
This skill enforces stabilization. Force context awareness (project/epic/design architecture) to prevent drift. 3x work becomes 1x work.
Policies & Checks Enforcement
Backstage-skill enforces ALL rules in checks/ (deterministic + interpretive, global + local).
Enforcement Model
flowchart TD
READ_CHK["Read checks/
global + local
[Deterministic .sh + Interpretive .md]"]
CONFLICT{Conflict?}
MERGE[Merge compatible rules]
LOCAL[Local wins]
AI["AI interprets .md checks
[Contextual enforcement]"]
SH["Bash executes .sh checks
[Deterministic validation]"]
AI_ACT[β
Enforce or discuss]
AI_AMBIG[β οΈ Ask user]
SH_OK[β
All checks pass]
SH_FAIL[β Checks failed]
REPORT["Report:
π Interpretive (always β
)
π Deterministic (β
/β)"]
READ_CHK --> CONFLICT
CONFLICT -->|No| MERGE
CONFLICT -->|Yes| LOCAL
MERGE --> AI
MERGE --> SH
LOCAL --> AI
LOCAL --> SH
AI -->|Clear| AI_ACT
AI -->|Ambiguous| AI_AMBIG
SH -->|Pass| SH_OK
SH -->|Fail| SH_FAIL
AI_ACT --> REPORT
AI_AMBIG --> REPORT
SH_OK --> REPORT
SH_FAIL --> REPORT
Two enforcement domains:
1. Checks (Interpretive)
- checks/global/*.md = Universal workflow rules
- checks/local/*.md = Project-specific overrides
- Enforced by: AI (reads markdown, interprets context, acts)
- Always pass: AI reads, understands, will act accordingly
2. Checks (Deterministic)
- checks/global/*.sh = Universal validation tests
- checks/local/*.sh = Project-specific tests
- Enforced by: Bash (executes shell scripts, exit codes)
- Pass or fail: β
(exit 0) or β (exit non-zero)
Polycentric governance:
Report format:
π Interpretive checks:
β
checks/global/branch-workflow.md (read)
β
checks/global/commit-style.md (read)
β
checks/local/dogfooding.md (read)π Checks (deterministic):
β
checks/global/navigation-block-readme.sh
β
checks/global/semver-changelog.sh
β checks/local/pre-merge-tasks.sh (incomplete tasks)
Self-contained: All prompts in SKILL.md (no external prompt files needed).
Mermaid Diagram Generation (Interpretive)
Purpose: Automatically generate + propagate ROADMAP diagram to all backstage files.
Workflow:
1. Parse ROADMAP.md (deterministic - SH):
parse-roadmap.sh backstage/ROADMAP.md
# Output: version|status_emoji|name
2. Read checks/ diagram rules (interpretive - AI):
- checks/global/navigation-block.md defines default format (linear graph, all epics, sequential)
- checks/local/*.md can override (gantt, flowchart, or diagram: none)
- Local wins on conflict
3. Generate mermaid (interpretive - AI): - Apply checks/ rules to parsed data - Create mermaid syntax matching specification - Example (default):
graph LR
A[ποΈ v0.1.0 Active Epic] --> B[π v0.2.0 Backlog Epic]
4. Propagate to all files (deterministic - SH):
- Insert after > π€ marker
- README.md, ROADMAP.md, CHANGELOG.md
- Remove old diagrams (anti-drift)
AI Prompt (when running backstage-start/end):
> Read checks/global/navigation-block.md and checks/local/*.md for diagram rules.
> Run parse-roadmap.sh to extract epics.
> Generate mermaid diagram following checks/ rules (prefer local over global).
> Insert diagram after navigation block (> π€) in all backstage files.
> If local checks say diagram: none, skip generation.
Tools:
parse-roadmap.sh - Extract version|status|name from ROADMAP.mdchecks/ - Diagram format rules (type, include/exclude logic, status mapping)Polycentric Governance (How It Works)
flowchart TD
GLOBAL_POL[checks/global/*.md
Universal rules]
LOCAL_POL[checks/local/*.md
Project-specific overrides]
GLOBAL_CHK[checks/global/*.sh
Universal tests]
LOCAL_CHK[checks/local/*.sh
Project-specific tests]
AI[AI reads checks/]
BASH[Bash executes checks/]
CONFLICT{Conflict?}
GLOBAL_POL --> AI
LOCAL_POL --> AI
GLOBAL_CHK --> BASH
LOCAL_CHK --> BASH
AI --> CONFLICT
CONFLICT -->|Yes| LOCAL_POL
CONFLICT -->|No| MERGE[Merge rules]
MERGE --> ACTION[Execute workflow]
LOCAL_POL --> ACTION
BASH --> ACTION
This skill enforces polycentric governance:
checks/**/*.md files (global + local)checks/**/*.sh files (global + local)Triggered by: "good morning", "good night", "backstage start/end", "update backstage"
Workflow Diagram
flowchart TD
START["Trigger 1οΈβ£
[SH]"]
MODE{"Session mode?"}
%% Common enforcement module
READ_POL["Read checks/
global + local
[AI interprets MD]"]
EXEC_CHK["Execute checks/
global + local
[Bash runs SH]"]
REPORT["Report 6οΈβ£
π Interpretive (β
)
π Checks (β
/β)"]
CHECKS_GATE{"All checks
passed?"}
%% Start Branch
START_BRANCH["Read README π€ block 2οΈβ£
[MD β AI]"]
START_FILES["Locate status files 3οΈβ£
[SH]"]
START_GIT["Check git branch 4οΈβ£
[SH]"]
START_WORK["Analyze changes 5οΈβ£
[SH]"]
START_FIX["π STOP: Fix issues
[AI + SH]"]
START_UPDATE["Update docs 7οΈβ£
[SH writes MD]"]
START_REPORT["Developer context 8οΈβ£
[AI reads MD]"]
START_PUSH["Push / Groom 9οΈβ£
[SH]"]
%% End Branch
END_FIXES["Add fixes to roadmap
[AI writes MD]"]
END_PUSH["Commit + push
[SH]"]
END_VICTORY["Victory lap π
[AI reads MD]"]
END_BODY["Body check βΈοΈ
[AI prompt]"]
END_CLOSE["Close VS Code π
[SH]"]
END_SILENT["[STAY SILENT]"]
%% Update Backstage Branch
UPDATE_DETECT["Find backstage/ folder
[SH]"]
UPDATE_CHECK_SYM{"Symlinked?"}
UPDATE_SKIP["β
Already auto-updates
[Report]"]
UPDATE_FETCH["Fetch upstream
[SH: git clone]"]
UPDATE_DIFF["Compare local vs upstream
[SH: diff]"]
UPDATE_UPTODATE{"Changes
found?"}
UPDATE_UPTODATE_SKIP["β
Already up to date
[Report]"]
UPDATE_CHANGELOG["Generate mini changelog
[AI reads diffs]"]
UPDATE_PROMPT{"User
approves?"}
UPDATE_ABORT["Aborted
[Report]"]
UPDATE_APPLY["rsync upstream β local
[SH]"]
UPDATE_REPORT["π Updated!
[Report changes]"]
%% Flow
START --> MODE
MODE -->|Start| START_BRANCH
START_BRANCH --> START_FILES
START_FILES --> START_GIT
START_GIT --> START_WORK
START_WORK --> READ_POL
START_WORK --> EXEC_CHK
READ_POL --> REPORT
EXEC_CHK --> REPORT
REPORT --> CHECKS_GATE
CHECKS_GATE -->|No, start mode| START_FIX
START_FIX --> READ_POL
CHECKS_GATE -->|Yes| START_UPDATE
START_UPDATE --> START_REPORT
START_REPORT --> START_PUSH
MODE -->|End| READ_POL
MODE -->|End| EXEC_CHK
CHECKS_GATE -->|No, end mode| END_FIXES
CHECKS_GATE -->|Yes| END_PUSH
END_FIXES --> END_VICTORY
END_PUSH --> END_VICTORY
END_VICTORY --> END_BODY
END_BODY --> END_CLOSE
END_CLOSE --> END_SILENT
MODE -->|Update| UPDATE_DETECT
UPDATE_DETECT --> UPDATE_CHECK_SYM
UPDATE_CHECK_SYM -->|Yes| UPDATE_SKIP
UPDATE_CHECK_SYM -->|No| UPDATE_FETCH
UPDATE_FETCH --> UPDATE_DIFF
UPDATE_DIFF --> UPDATE_UPTODATE
UPDATE_UPTODATE -->|No| UPDATE_UPTODATE_SKIP
UPDATE_UPTODATE -->|Yes| UPDATE_CHANGELOG
UPDATE_CHANGELOG --> UPDATE_PROMPT
UPDATE_PROMPT -->|No| UPDATE_ABORT
UPDATE_PROMPT -->|Yes| UPDATE_APPLY
UPDATE_APPLY --> UPDATE_REPORT
Domain labels:
Critical separation:
Notes:
1οΈβ£ Trigger: "backstage start", "vamos trabalhar no X", "whatsup" (start mode) OR "backstage end", "boa noite", "wrap up" (end mode)
backstage-start.sh OR backstage-end.sh2οΈβ£ Read README π€ block: Find navigation block between > π€ markers. Extract all status file paths (ROADMAP, CHANGELOG, checks/, checks/). This is ONLY source of truth for file locations.
backstage-start.sh::read_navigation_block()3οΈβ£ Locate status files: Use paths from π€ block. If missing, STOP and ask user where to create them. Check BOTH global (backstage/checks/global/, backstage/checks/global/) and local (backstage/checks/local/, backstage/checks/local/) for polycentric governance.
backstage-start.sh::locate_status_files()4οΈβ£ Check git branch: Run git branch --show-current. Determine work context.
backstage-start.sh::check_branch()5οΈβ£ Analyze changes:
git diff --name-status
git diff --stat
LAST_VERSION=$(grep -m1 "^## v" CHANGELOG.md | cut -d' ' -f2)
git log --oneline "${LAST_VERSION}..HEAD"
Categorize: patch/minor/major. Compare with ROADMAP. Match reality to plans.
backstage-start.sh::analyze_changes()6οΈβ£ Report - Policies + Checks:
Report format:
π Interpretive checks:
β
checks/global/branch-workflow.md (read)
β
checks/global/commit-style.md (read)
β
checks/local/dogfooding.md (read)π Checks (deterministic):
β
checks/global/navigation-block-readme.sh
β
checks/global/semver-changelog.sh
β checks/local/pre-merge-tasks.sh (incomplete tasks)
Policies always β : AI reads, interprets, will act accordingly
Checks can fail β: Exit code determines status
Mode behavior:
backstage-start.sh::report_enforcement()7οΈβ£ Update docs: If checks pass, auto-update ROADMAP (mark checkboxes) and CHANGELOG (add new entries at TOP, append-only). Bump version. Add navigation menu to all status files.
backstage-start.sh::update_docs()8οΈβ£ Developer context: Generate outcome-based summary (5 possible states: π Failed, β οΈ Mismatch, π§ Grooming, β Progress, π Complete). Show: When, What, Why, Status, Next.
backstage-start.sh::show_developer_context()9οΈβ£ Push / Groom: If checks passed, commit with appropriate message (progress/release). If grooming mode, just update ROADMAP priorities.
backstage-start.sh::prompt_push()Victory lap π: Brief reminder of achievements (3 main items max + stats). Keep it short.
backstage-end.sh::victory_lap()Body check βΈοΈ: Ask: Hungry? Thirsty? Tired? Need to stretch? What does body NEED right now?
backstage-end.sh::body_check()Close VS Code π: Run countdown + osascript -e 'quit app "Visual Studio Code"'. CRITICAL: Agent must NOT send ANY message after this or VS Code will prompt "unsaved changes".
backstage-end.sh::close_vscode()[STAY SILENT]: No reply after closing VS Code (prevents unsaved prompt).
π Update Backstage: "update backstage" trigger
*/backstage/ directorychecks/global/ is symlink β already auto-updates (skip)checks/global/ vs upstreamrsync --delete upstream β localupdate-backstage.shWhen to Use
Trigger patterns:
"Bom dia" / "Good morning" + PROJECT:
bom dia personal / good morning personalbom dia librarian / good morning librarian"Update backstage":
*/backstage/checks/global/ against official repochecks/global/ files from upstreamStart mode:
End mode:
"Update Backstage" Workflow
Trigger: update backstage (from any project using backstage protocol)
Purpose: Sync local checks/global/ with latest from upstream repo, show what's new.
How It Works
1. Detect project backstage folder:
# Search up from CWD for backstage/ folder
find . -type d -name "backstage" | grep -E "backstage$"
# Or read README π€ block for backstage location
2. Confirm upstream source:
# Check if checks/global/ is symlink (admin mode)
if [ -L "backstage/checks/global" ]; then
echo "β
Symlinked to upstream (auto-updates)"
exit 0
fi
# Otherwise, assume official repo
UPSTREAM="https://github.com/nonlinear/backstage"
echo "Upstream: $UPSTREAM"
echo "Confirm this is correct? (y/n)"
3. Fetch latest from upstream:
# Clone or pull latest
TMP_DIR=$(mktemp -d)
git clone --depth 1 "$UPSTREAM" "$TMP_DIR/backstage"
4. Compare local vs upstream:
# Diff local checks/global/ vs upstream
diff -qr backstage/checks/global/ "$TMP_DIR/backstage/backstage/checks/global/"
5. Generate mini changelog:
π¦ Backstage Updates Available:
NEW files (3):
- skill-publish-warning.sh (warns before merging unpublished skills)
- rebase-cadence.md (suggests rebase if branch >7 days old)
- epic-notes-orphan-detection.md (detects orphan epic notes)
CHANGED files (2):
- merge-to-main.md (added Step 0: skill publish check)
- epic-branch.sh (improved detection logic)
WHAT YOU GAIN:
Better skill publishing workflow, orphan detection, rebase reminders.
6. Prompt user:
Apply these updates? (y/n)
7. Update if confirmed:
# Copy upstream checks/global/ to local
rsync -av --delete "$TMP_DIR/backstage/backstage/checks/global/" backstage/checks/global/
# Cleanup
rm -rf "$TMP_DIR"
echo "β
Updated checks/global/ from upstream"
8. Report:
π Backstage updated!
Files changed: 5
- Added: skill-publish-warning.sh, rebase-cadence.md, epic-notes-orphan-detection.md
- Modified: merge-to-main.md, epic-branch.sh
Next: Run 'backstage start' to test new checks.
Edge Cases
Symlinked (admin mode):
checks/global/ is symlink β already auto-updatesNo changes:
Conflicts:
checks/local/ (overrides) before updatingNo internet:
Key Principles
1. README's π€ block = Single source of truth for file locations 2. Status files = AI prompts (checks/ = tests, checks/ = rules, ROADMAP = backlog, CHANGELOG = history) 3. Polycentric governance (global + local rules, local wins on conflict) 4. Checks must pass before commit (non-negotiable for start mode, soft fail for end mode) 5. CHANGELOG is append-only (never edit old entries, add NEW entry for corrections) 6. 5 possible outcomes (Failed, Mismatch, Grooming, Progress, Complete) 7. Documentation auto-syncs with reality (mark checkboxes, bump versions, move epics) 8. Body check at end (mental health + momentum preservation) 9. Silent after VS Code close (prevent unsaved prompt) 10. Works on ANY project (no hardcoded paths, reads README first)
The 5 States (Start Mode)
| State | When | Action | Can Push? | |---------------------|--------------|-------------------|-----------| | π Failed Checks | Tests fail | Fix issues | β NO | | β οΈ Docs Mismatch | Code β docs | Auto-update docs | β YES | | π§ Grooming | No changes | Plan next work | N/A | | β In Progress | Partial work | Update checkboxes | β YES | | π Version Complete | All done! | Move to CHANGELOG | β YES π |
Check Policy
From checks/:
The 3-Level System
Level 1: Personal (not tracked)
Level 2: Project-Specific (e.g., Librarian MCP)
Level 3: Meta-Workflow (this skill)
Reference Prompts
Original prompts (for future refinement):
backstage-start.prompt.md - Full start workflow specificationbackstage-close.prompt.md - Full end workflow specificationLocation: /Users/nfrota/Documents/nonlinear/.github/prompts/
Note: This SKILL.md is a DRAFT distillation of those prompts. Future refinements will improve diagram, add emoji notes, clarify steps. The original prompts contain ALL details.
TODO / Future Refinements
Created: 2026-02-12
Updated: 2026-02-18 (v1.0.0 - modular checks/checks)
Status: Documentation updated, scripts pending
Location: ~/Documents/backstage/skills/backstage/SKILL.md