@ -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. |
| [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. |
| [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\". |
| [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. |
| [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. |
| [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. |
| [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.
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
# Lights Out
## Overview
## Overview
Lights Out delegates a long-running coding objective to `gnhf`, which loops a coding agent until a
Lights Out delegates a long-running coding objective to `nightshift`, which loops a coding agent
natural-language stop condition is met. Scout prepares and supervises the run; **gnhf executes it**.
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.
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
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.
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
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.
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)
$engineCommand=Resolve-NightshiftCommand
$gnhfCmd=Resolve-GnhfCommand
if(-not$engineCommand){
if(-not$gnhfCmd){
$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.'
$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)"
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'resolves to vendored by default'($resolved-and$resolved.Kind-eq'vendored')
Check'vendored version reported'($resolved-and$resolved.Version)
Check'vendored version reported'($resolved-and$resolved.Version)
$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'
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