@ -25,7 +25,7 @@ Generated by `sync-skills.ps1`; do not edit manually.
| [get-meeting-transcript](get-meeting-transcript/SKILL.md) | Grab a Teams/Stream meeting transcript by driving a logged-in browser when the Graph download is blocked. Captures the underlying .vtt from network traffic, or scrapes the recap transcript pane. Accepts a Teams recap, Stream/SharePoint, or meet.microsoft.com URL, or a calendar reference it resolves to one. Saves .vtt + .md + the meeting chat into the Obsidian vault. Triggers: get transcript, scrape transcript, grab the transcript, meeting chat, transcript for my meeting. |
| [kb](kb/SKILL.md) | Vault-first recall. Search Daniel's Obsidian KB (D:\\Repos\\Obsidian) BEFORE WorkIQ/M365, Azure DevOps, IcM, or the browser. Use for any lookup: \"who is X\", \"what's my/his alias, SC-ALT, email, ID, manager, office\", \"what did we decide about X\", \"when did we meet about X\", \"what is <acronym>\", \"remind me\", \"do we know\", \"look it up\", \"check the KB\", plus anything about squads, Connects, RISE, meetings, daily notes, or people Daniel works with. |
| [kblinter](kblinter/SKILL.md) | Run the knowledge-base linter against the Obsidian vault at D:\\Repos\\Obsidian and surface the findings. Use whenever the user asks to lint, audit, or check the health of the vault/Second Brain. Triggers: /kblinter, \"lint the vault\", \"audit my notes\", \"check vault health\", \"run the kb linter\", \"find orphan notes\", \"find broken links in the vault\". |
| [lights-out](lights-out/SKILL.md) | Use when the user is going to bed, going away, or wants unattended overnight coding work; says "lights out", "run this overnight", "keep working while I sleep", or names gnhf; asks to check on, steer, or stop a running overnight job; asks "how did last night's run go", says "good morning", or wants a morning review of an agent run; or gives review findings on the results of an overnight run. |
| [lights-out](lights-out/SKILL.md) | Use when the user wants unattended overnight or away-from-keyboard coding work; says \"lights out\", \"nightshift\", \"run this overnight\", or \"keep working while I sleep\"; asks to launch, check, steer, or stop a running overnight job; wants a morning review; or gives follow-up findings on an overnight agent run. |
| [mslearn](mslearn/SKILL.md) | Query the live Microsoft Learn MCP for grounded, first-party docs, code samples, and full-page fetches across Azure, M365, .NET, and Power Platform. Use when the user asks what Microsoft says about X, needs an authoritative answer for a customer, wants current official guidance, looks for a code sample, or asks to cite or quote the docs. Triggers: ms learn, microsoft learn, learn docs, look it up on learn, cite the docs, official microsoft guidance, what do the docs say. |
| [oneonone-pokedex](oneonone-pokedex/SKILL.md) | IC-side companion for Daniel's recurring 1:1 with his manager - the mirror of the manager coaching-pokedex. Preps an agenda from the Obsidian vault, reflects on a recorded 1:1 with an honest self-scorecard of how Daniel showed up (never grading the manager), assigns a Pokemon for session energy, tracks trends, and writes notes back to the vault as Connect evidence. Private. Triggers: /1on1, /oneonone, 1:1, one on one, prep for my 1:1, reflect on my 1:1, manager sync. |
| [receiving-code-review](receiving-code-review/SKILL.md) | Handle incoming code review feedback with technical rigor instead of reflexive agreement - verify each claim, push back with evidence when a suggestion is wrong or does not apply, ask when feedback is unclear, and apply a YAGNI check before adding suggested professional features. Covers GitHub thread replies and implementation order. Triggers: here is the review feedback, address these comments, the reviewer said, respond to this PR comment, they want me to change. |
description: Use when the user is going to bed, going away, or wants unattended overnight coding work; says "lights out", "run this overnight", "keep working while I sleep", or names gnhf; asks to check on, steer, or stop a running overnight job; asks "how did last night's run go", says "good morning", or wants a morning review of an agent run; or gives review findings on the results of an overnight run.
name: "lights-out"
description: "Use when the user wants unattended overnight or away-from-keyboard coding work; says \"lights out\", \"nightshift\", \"run this overnight\", or \"keep working while I sleep\"; asks to launch, check, steer, or stop a running overnight job; wants a morning review; or gives follow-up findings on an overnight agent run."
---
# Lights Out
## Overview
Lights Out delegates a long-running coding objective to `gnhf`, which loops a coding agent until a
natural-language stop condition is met. Scout prepares and supervises the run; **gnhf executes it**.
Lights Out delegates a long-running coding objective to `nightshift`, which loops a coding agent
until a natural-language stop condition is met. Scout prepares and supervises the run;
**nightshift executes it**.
Core rule: **you orchestrate, gnhf implements.** Do not hand-edit files inside a scope a live gnhf
Core rule: **you orchestrate, nightshift implements.** Do not hand-edit files inside a scope a live
worker owns. If the work needs correcting, launch a new bounded run rather than taking over.
Second rule: **a stop condition being met is not acceptance.** "Stopped" only means the worker
stopped. Compare the result against the user's actual request and your own fresh verification.
## Why a wrapper instead of running gnhf directly
## Why a wrapper instead of running the engine directly
The Scout session that starts a night run is usually gone before it ends — the app gets closed, the
machine is left alone. So anything that must happen at exit cannot live in the conversation.
@ -25,13 +26,13 @@ machine is left alone. So anything that must happen at exit cannot live in the c
# 1. gnhf resolvable (vendored copy preferred over any global install)
$gnhfCmd=Resolve-GnhfCommand
if(-not$gnhfCmd){
$problems+="gnhf could not be resolved. Restore the vendored copy with: npm install gnhf --prefix `"$(Split-Path-Parent$PSScriptRoot)\vendor`" (uses the configured MS proxy registry; forcing registry.npmjs.org fails with a TLS error on this machine)"
$engineCommand=Resolve-NightshiftCommand
if(-not$engineCommand){
$problems+='Nightshift could not be resolved. Restore the complete vendored runtime from a working Lights Out copy, or use the separately stored maintenance archives described in SKILL.md. Do not install an unrelated published package.'
Check'vendored bundle has no analytics client or configuration'($bundle-notmatch'a\.kunchenguid\.com|NIGHTSHIFT_TELEMETRY|NIGHTSHIFT_UMAMI_HOST|NIGHTSHIFT_UMAMI_WEBSITE_ID|/api/send|initDefaultTelemetry|getDefaultTelemetry|createTelemetryClient')
}
$env:LIGHTS_OUT_NIGHTSHIFT=''
$resolved=Resolve-NightshiftCommandForTest
Check'resolves to vendored by default'($resolved-and$resolved.Kind-eq'vendored')
Check'vendored version reported'($resolved-and$resolved.Version)
$r4=(&$S-RepoPath"$sand\repo"-Prompt'tidy things up'-Agent'notarealagent')|ConvertFrom-Json
Check'missing agent CLI blocked'(-not$r4.ok)
Show'TEST 5: unknown agent CLI blocked'
$r5=(&$S-RepoPath"$sand\repo"-Prompt'tidy things up'-Agent'notarealagent')|ConvertFrom-Json
Check'missing agent CLI blocked'(-not$r5.ok)
Show'TEST 5: happy path with stubbed gnhf'
$env:LIGHTS_OUT_GNHF=(Join-Path$stub'gnhf.ps1')
Check'stub gnhf resolves via override'((Resolve-GnhfCommandForTest).Kind-eq'override')
$out=&$S-RepoPath"$sand\repo"-Prompt'reduce complexity in the widget helper'-Title'Reduce Complexity'-StopWhen'npm test passes and no unrelated files changed'-VerifyCommand'git --version'-MaxIterations5-Modecompanion-Agent'copilot'
Show'TEST 6: copied skill happy path with stubbed nightshift'
$copiedSkill=Join-Path$sand'skill copy with spaces'
Check'stub nightshift resolves via override'($resolvedOverride-and$resolvedOverride.Kind-eq'override')
$out=&$copiedStart-RepoPath"$sand\repo"-Prompt'reduce complexity in the widget helper'-Title'Reduce Complexity'-StopWhen'git --version exits 0 and no unrelated files changed'-VerifyCommand'git --version'-MaxIterations5-Modecompanion-Agent'copilot'
'export const widget = (x) => { if (true) { return x + 1; } };'|Set-Contentindex.js
gitadd-A
gitcommit-q-m'init'
Pop-Location
$unsuffixedRunId=Get-LightsOutRunId-Prompt'simplify widget in an unsuffixed worktree'
$outUnsuffixed=&$copiedStart-RepoPath$unsuffixedRepo-Prompt'simplify widget in an unsuffixed worktree'-Title'Unsuffixed Worktree'-StopWhen'worktree-local verification exits 0'-VerifyCommand$verifyWorktreeCommand-MaxIterations5-Modecompanion-Agent'copilot'-Worktree
'export const widget = (x) => { if (true) { return x + 1; } };'|Set-Contentindex.js
gitadd-A
gitcommit-q-m'init'
Pop-Location
$worktreeRunId=Get-LightsOutRunId-Prompt'simplify widget in a worktree'
Push-Location$worktreeRepo
gitbranch"nightshift/$worktreeRunId"
Pop-Location
$outWorktree=&$copiedStart-RepoPath$worktreeRepo-Prompt'simplify widget in a worktree'-Title'Worktree Finalize'-StopWhen'worktree-local verification exits 0'-VerifyCommand$verifyWorktreeCommand-MaxIterations5-Modecompanion-Agent'copilot'-Worktree
$outWorktreeAgain=&$copiedStart-RepoPath$worktreeRepo-Prompt'simplify widget in a worktree'-Title'Worktree Finalize Again'-StopWhen'worktree-local verification exits 0'-VerifyCommand$verifyWorktreeCommand-MaxIterations5-Modecompanion-Agent'copilot'-Worktree