CopilotAtelier.psd1
|
@{ RootModule = 'CopilotAtelier.psm1' # Replaced at build time by GitVersion. ModuleVersion = '3.2.0' GUID = '67bbef0b-f4de-4c1b-bb5a-b34104beb5b7' Author = 'raandree' CompanyName = 'raandree' Copyright = '(c) raandree. All rights reserved.' Description = 'Portable GitHub Copilot customization library. Ships custom agents, auto-applied instructions, on-demand skills, prompt templates, and lifecycle hooks, and installs them into the well-known ~/.copilot discovery folders that VS Code, the GitHub Copilot CLI, and Claude Code read.' PowerShellVersion = '5.1' FunctionsToExport = @('Get-CopilotAtelierVersion','Install-CopilotAtelier','Update-CopilotAtelier') CmdletsToExport = @() VariablesToExport = @() AliasesToExport = @() PrivateData = @{ PSData = @{ Tags = @( 'Copilot' 'GitHubCopilot' 'VSCode' 'Agents' 'Skills' 'Prompts' 'Instructions' 'Hooks' 'AI' 'Windows' 'Linux' 'MacOS' ) LicenseUri = 'https://github.com/raandree/CopilotAtelier/blob/main/LICENSE' ProjectUri = 'https://github.com/raandree/CopilotAtelier' IconUri = 'https://raw.githubusercontent.com/raandree/CopilotAtelier/main/assets/CA-glyph-on-light.png' Prerelease = 'preview0001' ReleaseNotes = '## [3.2.0-preview0001] - 2026-08-11 ### Added - **`long-running-job-monitor` gained an unprompted chat heartbeat** (2026-08-10). The Skill already prescribed a "~5-minute cadence" and [`Start-JobMonitor.ps1`](Skills/long-running-job-monitor/scripts/Start-JobMonitor.ps1) already sampled on one, but it sampled into a `.status` file nobody opened, so a job that ran for hours left the chat pane silent and a healthy job was indistinguishable from a dead one. The cadence was never the missing piece; **delivery** was. The Skill also asserted that the agent "cannot self-schedule a timer", which turned out to be false and was the reason nobody had tried. Measured during authoring: an async command started at `20:23:59 UTC` and completing at `20:26:59 UTC` produced an agent turn with **no user input at all**. A completion notification spawns a turn, and an async command does not block the chat, so a periodic report costs a request but never costs responsiveness. [`Start-JobHeartbeat.ps1`](Skills/long-running-job-monitor/scripts/Start-JobHeartbeat.ps1) arms one tick, waits, and emits a measured summary the agent renders as its status line. Three rules in it are load-bearing. **Run the timer in async mode and never through the detached launcher** — a fully detached process is invisible to the harness, emits no completion notification, and silently never wakes the agent, which is the exact opposite of the rule that governs the job and the sampling sidecar. **The state file stores metadata only**: it is re-read and acted on at every wake, so a probe scriptblock persisted there would be a durable local code-execution sink, and a regression test now fails if one ever appears. **Every reported value is measured rather than recalled** — the first smoke run reported `elapsed=120m` on a job that had just started, because `[datetime]::Parse` returns `Kind=Local` and the later conversion subtracted the local offset a second time; the session that produced this feature also opened four replies with a timestamp that was an hour wrong, which is the same failure in the model rather than in the code. The interval defaults to 10 minutes, is settable from the prompt, and follows a `1x, 1x, 2x, 3x, 6x` backoff ladder, capping an eight-hour job near nine wakes instead of 48; re-arming with the same interval does not restart the ladder, while a genuine retune does. A **sliding reset** redefines the cadence as "never more than N minutes without status" rather than "status on a fixed grid": any status line shown between ticks advances the anchor, so the pending tick reports `Redundant` and the agent re-arms for the remainder instead of repeating itself — during active conversation ticks never fire, because status is already flowing. Where no progress probe exists the verdict reads `status=WORKING(low-confidence: no progress evidence)`, because process liveness alone also describes a hung job, and unavailable fields read `n/a` rather than being invented. Chain integrity is the residual risk: each tick must arm the next, and one missed re-arm ends the heartbeat silently while the user still believes it is watching. Every status line therefore publishes its next due time, and [`references/heartbeat-protocol.md`](Skills/long-running-job-monitor/references/heartbeat-protocol.md) records the `Stop`-hook enforcement option — with the warning from the VS Code docs that a blocking `Stop` hook consumes credits and loops indefinitely unless `stop_hook_active` is checked and the block count capped — plus the batch pre-arm fallback if that hook proves unreliable. [`tests/LongRunningJobMonitor.Tests.ps1`](tests/LongRunningJobMonitor.Tests.ps1) adds 18 tests covering the ladder, the sliding reset, cancellation, the measured-elapsed regression, and the never-persist-a-probe guard. Live smoke testing found one defect and settled the open design question. The defect: there was no way to **cancel** an armed tick, so "stop watching" did not actually stop anything and every job completion cost a spurious wake. `-Stop` now cancels the pending tick, matching the recorded process start time before killing so a recycled process ID is never a target. The design question was whether a `Stop` hook can enforce the chain, and it can — a guarded one-shot hook returning `decision: "block"` forced a turn that would otherwise have ended, which removes the need for the batch pre-arm fallback. Verified live across a four-minute stand-in job: unprompted wakes at `21:21:58` and `21:23:12`, the ladder stepping `1m, 1m, 2m`, the sliding reset marking a tick `Redundant` with `0.61` minutes remaining after a mid-interval message, immediate completion reporting from the job''s own notification rather than a delayed tick, two concurrent jobs waking as independent turns nine seconds apart with no cross-contamination, and a separate process reconstructing `elapsed=45m` plus the ladder position from the state file alone. - **New Prompt `audit-case-file`** (2026-08-05). A drafting session accumulates conclusions, and over a long-running matter those conclusions migrate from summary to summary until they read like established fact. The empirical trigger was a single session on a live case file in which three assertions were checked against the primary corpus for the first time: one was refuted by a message the author had sent himself, one had been framed backwards by the assistant and was in truth the strongest argument available, and one was correct in substance but attackable in its wording against the exact phrase a third party had used. None of the three was careless. All three had survived because nobody had opened the source file since the claim was first written down. The Prompt exists to open them. Its load-bearing rule is that **the project memory is a finding aid and not evidence** — a claim resting only on the Memory Bank or on a prior work product counts as unsupported until traced to an unaltered primary document or a reproducible system value. The second rule is procedural and equally decisive: **run it in a fresh session**, because an agent that drafted the material carries its own conclusions in context and will confirm them, which is precisely the failure the audit exists to catch. Author and addressee are treated as part of every claim, since a quote attributed to the wrong person or a letter said to have been addressed to the reader when it went to someone else is a Blocker rather than a detail. Six error classes are hunted rather than awaited, each drawn from an observed failure: claims about one''s own earlier knowledge that the author''s own outbox refutes; misattribution; drifting figures, for which a value history is built and the one currently valid value named; reference periods that cut across each other, where the project''s period definition must be established rather than assumed; third-party system evidence held only as a screenshot or a link, since a link is not preservation; and asserted deadlines with no traceable source. Work is ordered by deadline — ready-to-send drafts with a running clock complete before the case file itself — so a slow audit cannot cost a dispatch date. The Prompt is read-only by construction: no edits, no wording suggestions, no dispatch, and "not found" is an explicit valid finding so a missing source cannot be papered over with an invented one. Built as a Prompt rather than a Skill because it is a deliberately invoked workflow with a fixed procedure and a single artefact, the direct analogue of [`peer-review.prompt.md`](Prompts/peer-review.prompt.md), and because a Skill covering claim-to-source verification would overlap [`citation-integrity`](Skills/citation-integrity/SKILL.md) and degrade auto-selection for both. It orchestrates `citation-integrity`, `devils-advocate-review`, and the severity labels of `code-review-and-quality` instead of restating them. Folder roles are derived from the Memory Bank routing table at run time rather than hard-coded, so the Prompt carries no project-specific paths, route names, or facts and applies to any matter that keeps primary sources apart from its own work products. Prompt count 10 → 11. - **New Skill `gilb-requirements-engineering`** (2026-08-04). Nothing in the library covered Tom and Kai Gilb''s method, and the nearest neighbour was not a substitute: [`grill-me`](Skills/grill-me/SKILL.md) is Brooks-derived and deliberately qualitative, so "the portal must be significantly faster" survives its twelve-category interview intact and reaches the Design Concept as prose. The new Skill is the counterpart that refuses it. Its single rule is that a quality requirement without a `Scale`, a `Meter`, and a numeric level is a wish with a noun in it, and the nine-step protocol enforces the consequences. **Sort every sentence into function, quality, resource, design, or condition and evict the design**, because a requirement that names a technology has pre-empted the decision it was supposed to inform. **State the benchmarks `Past`, `Record`, and `Trend` before any target**, since `Past` and `Goal` together define the 0–100 % span the Impact Estimation Table computes against, and a `Goal` written without a `Past` leaves the table uncomputable. **Keep `Fail` and `Survival` separate from `Goal`**, so a missed ambition stops reading like an incident and the signal survives. Every number carries a `Source` or an explicit `<TBD>`, because an invented benchmark is indistinguishable from a measured one six months later. Four references keep the body at 322 lines. [`planguage-keywords.md`](Skills/gilb-requirements-engineering/references/planguage-keywords.md) carries the keyword set, the `[qualifier]` syntax that collapses five copy-pasted requirements into one, and the eight specification errors that recur. [`impact-estimation.md`](Skills/gilb-requirements-engineering/references/impact-estimation.md) carries the table arithmetic and the 0.0–1.0 credibility scale, whose whole point is that a ' } } } |