CopilotAtelier.psd1

@{
    RootModule        = 'CopilotAtelier.psm1'

    # Replaced at build time by GitVersion.
    ModuleVersion     = '6.1.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 = @('Export-CopilotAtelierContributorProfile','Get-CopilotAtelierClientAdapter','Get-CopilotAtelierContributorProfile','Get-CopilotAtelierFootprint','Get-CopilotAtelierProfile','Get-CopilotAtelierSkillHealth','Get-CopilotAtelierVersion','Import-CopilotAtelierContributorProfile','Install-CopilotAtelier','Remove-CopilotAtelierContributorProfile','Set-CopilotAtelierContributorProfile','Test-CopilotAtelier','Uninstall-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   = 'preview0008'

            ReleaseNotes = '## [6.1.0-preview0008] - 2026-10-12

### Added

- Add the read-only [`Wait-DetachedResult.ps1`](skills/long-running-job-monitor/scripts/Wait-DetachedResult.ps1) for short detached Pester/build runs: bounded 500 ms checks, a measured result line and log tail, job exit `0`/`1` or timeout `124`, with async-only guidance in the monitor Skill and both execution Instructions.
- Add contributor calibration: every agent pitches answers and questions at your familiarity with each knowledge area (`new`, `familiar`, or `expert`; `familiar` until you say otherwise), and in `new` and `familiar` areas illustrates an abstract finding with a concrete example; every calculated or reconstructed result names its sources and method. Every technical question offers a recommended answer and a `not sure, you pick` option; a delegated answer becomes an assumption flagged for expert review, counts only when you write it yourself, and never authorizes an irreversible, destructive, or security-relevant action; a question that authorizes such an action comes without the option. A level changes wording and depth, never warnings, tests, or reviews, and is never written to a repository. See [How Much Explanation You Want](README.md#how-much-explanation-you-want).
- Add [`docs/SECURITY-REVIEW.md`](docs/SECURITY-REVIEW.md), the independent security review of contributor calibration with every finding, its severity, and its resolution.
- Add the `/simpler` and `/deeper` Prompts, which re-explain the last answer one familiarity level simpler or deeper and keep that level for its knowledge area for the rest of the session.
- Add the `contributor-profile` Skill and the commands `Get-`, `Set-`, `Export-`, `Import-`, and `Remove-CopilotAtelierContributorProfile`, which keep your familiarity levels in a private Contributor profile outside every repository, so a saved level shapes later sessions without being restated. The profile lives in the `contributor` folder of the Canonical target, which syncs through OneDrive, or under LocalApplicationData on a machine without one; Export and Import carry it across and merge entry by entry. Every write takes a lock, replaces the file atomically, previews with `-WhatIf`, and refuses any path inside a git working tree, also one reached through a junction or symbolic link; `Get-CopilotAtelierContributorProfile -WorkspacePath .` shows where the profile lives and what a workspace receives, with aliases masked. A write changes only an entry you chose: the one `-Contributor` names, the one whose alias matches your git address, or a new one, the first in the profile or, beside others, your own with `-NewContributor`. It never falls back to the only or the default entry, so on a shared account one person''s level cannot land in another person''s entry. Knowledge area names may start with a dot followed by a letter or a digit, such as `.NET`. `contributor-profile` is mandatory in every installation profile. See [contributor-profile](skills/contributor-profile/SKILL.md).
- Add saved familiarity levels to every session of a workspace that declares Knowledge areas under `## Knowledge areas` in `.memory-bank/projectbrief.md`: the SessionStart hook adds one data-only sentence with your levels for those areas in VS Code, the Copilot SDK host, and Copilot CLI, and a new PostToolUse hook, `Add-FamiliarityContext.ps1`, re-sends them on the first successful tool call after a compaction. Where the host runs no PreCompact hook, as for a manual or a background compaction in VS Code, it re-sends them on the first tool call after a turn ends, or 5 minutes after the last re-send; these re-sends stop once a session has received 12,000 characters of levels, about 3,000 tokens. That hook runs only on machines where a profile entry is on and rates an area, through `~/.copilot/hooks/contributor-profile.json`, and adds about one more hook launch to each successful tool call there, measured at 0.8 to 2 s depending on the machine and the host; the one call per turn that re-sends takes about 0.4 to 0.8 s longer, and in a workspace that declares areas, session start takes about 0.2 to 0.6 s longer. A registration written from an earlier release''s template is replaced with the current one at the next profile write. On a synced Canonical target, a registration record that OneDrive delivers before its file is reported as pending by `Get-CopilotAtelierContributorProfile` and left alone until both arrive; `Remove-CopilotAtelierContributorProfile -RegistrationOnly` clears one that never settles, and `Get-CopilotAtelierContributorProfile` lists possible conflict copies of the registration in the hooks folder. `/simpler` and `/deeper` offer to save a changed level, the `memory-bank` projectbrief template gains the optional section, and the PRE-FLIGHT line names the profile state as counts only. A saved level steers the model without binding it: a saved `expert` level does not reliably make replies terse, and after a compaction a plugin-only installation, which has no hook registration, and a reply that makes no tool call do not receive the levels again.

### Changed

- Make `Uninstall-CopilotAtelier` remove the contributor profile registration before any file and stop, naming the file, when it cannot: a `~/.copilot/hooks/contributor-profile.json` it did not create or that changed since, a registration record that OneDrive delivered before its file, or a profile lock another writer holds. Removing the hook scripts first would leave a registration that warns on every tool call, so Uninstall also holds the profile lock until the scripts are gone, and no profile write can register the hook in the meantime. A registration written from an earlier release''s template is still removed. The profile itself stays as personal content.
- Document where each host records hook evidence, the observed host versions, transcript limits, compaction differences, and safe read-only inspection. See [Reading hook evidence](com.github.copilot/hooks/README.md#reading-hook-evidence).
- Document that tool-hook `additionalContext` reaches the model inside the tool result in VS Code Local, the Copilot SDK agent host, and Copilot CLI, with version-scoped observations; it is data only, never an instruction or authorization. See [tool-output injection](skills/agent-security-review/SKILL.md#prompt-injection-via-tool-output-the-most-missed-check).
- Let `grill-me`, `software-architect`, and `gilb-requirements-engineering` accept `not sure, you pick`: the recommended answer, or for a numeric target a level derived from `Past`, `Record`, or a verified benchmark, is recorded as an assumption flagged for expert review instead of blocking the interview.
- Document in `agent-evals` that the Copilot backend''s content filter blocks some harmless eval prompts, why an embedded chat transcript makes it worse, and how to keep a comparison fair: situation as system context, `FinishReason` logged per call, retries, and arms compared only on cases complete in both. See [harness prerequisites](skills/agent-evals/SKILL.md#harness-prerequisites).
- Document in `agent-evals` that compared arms must run at the same time, because backend behavior drifts within hours, and that an LLM judge''s disagreement can expose a mislabelled reply, which justifies a label correction only for an objective error. See [micro-tests](skills/agent-evals/SKILL.md#micro-test-the-wording-first).

### Fixed

- Fix Pester assertion guidance that called `-BeTrue` / `-BeFalse` boolean checks: explain truthiness, use `Should -Be $true` / `$false` for expected values, and require `Should -BeOfType ([bool])` when coercion must not pass a non-boolean. See [the assertion pitfall](skills/pester-patterns/SKILL.md#assertion-pitfall-truthiness).
- Fix detached Pester templates that reported a test file which failed to load, or a run returning nothing, as passed: reject `Result -ne ''Passed''` and report the failed test, block, and container counts. See [Pester guidance](com.github.copilot/rules/pester.instructions.md).
- Deliver the SessionStart context to Copilot SDK (agent host) and Copilot CLI sessions. `Add-SessionContext` wrote it only under `hookSpecificOutput`, which those hosts ignore; it now also writes the top-level `additionalContext` they read.
- Keep the session clock when a Copilot SDK chat resumes. The runtime reruns the `SessionStart` hook with `source: resume` when it reloads a chat, and `Add-SessionContext` restarted the clock there, so the closing elapsed line and the turn count started over and the injected start time moved; it now keeps a readable clock of the same session.
- Keep the `long-running-job-monitor` heartbeat state readable while it is rewritten. `Start-JobHeartbeat.ps1` wrote the state file in place, so `-Stop`, `-TouchStatus`, or a wake read at the same moment could find it empty or cut off and fail; it now renames a complete file over it, also on Windows PowerShell 5.1.
- Stop the wording of a commit message from choosing the release version. `GitVersion.yml` raised it on words such as "major", "breaking", or "add" anywhere in a message, which is how review text made 6.0.0 a major release; now only the Conventional Commit type in the subject line (`feat:`, `fix:`, `perf:`, `!`), a line that starts with `BREAKING CHANGE:`, or a literal `+semver:` override raises it above the branch''s default increment.
- Send an authorized push to the user''s own terminal. The `PreToolUse` block message, `AGENTS.md`, and the hooks README told the agent to set `COPILOT_ATELIER_ALLOW_REMOTE=1` for the command, but each host starts the hook with its own environment, so a variable set in an agent terminal never reaches the guard. They now also warn never to persist the variable, for example with `setx`: every host started afterwards would run without the guard.
- Show the `PreToolUse` guard''s reason to the model in Copilot SDK chats on Windows. That host ran the cross-platform `command` launcher inside an outer PowerShell that report'

        }
    }
}