CopilotAtelier.psd1

@{
    RootModule        = 'CopilotAtelier.psm1'

    # Replaced at build time by GitVersion.
    ModuleVersion     = '4.0.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   = 'preview0008'

            ReleaseNotes = '## [4.0.0-preview0008] - 2026-08-25

### Added

- **Release-tag parity gate** (2026-08-25). Two releases shipped without a changelog section and nothing noticed, because the only thing that reads the release history is [`tests/PluginManifest.Tests.ps1`](tests/PluginManifest.Tests.ps1), and it reads the changelog rather than what was actually published. It now reads both. Every non-preview tag reachable from `HEAD` must have a matching `[x.y.z]` release section, so an unmerged rollover pull request turns `main` red instead of accumulating in silence. One exemption is load-bearing: a tag pointing at `HEAD` is skipped. On a tag push the `test` job runs before `deploy`, so at that instant the tag exists and its section cannot — `Create_ChangeLog_GitHub_PR` only runs after the release is published — and a strict gate would deadlock every release on itself. The exemption lapses the moment one commit lands on top, which is the earliest point at which the rollover *could* have been merged. Shown to reject before it was accepted: against the unfixed changelog the run was 8 passed, 3 failed, naming `v3.0.0` and `v3.1.0` and telling the reader which branch to merge; fixed, 12 of 12 pass. A companion assertion settles a question that had been left open — `plugin.json.version` is `major.minor.patch` and never a pre-release, because the field is committed, only moves on a release rollover, and is compared as an opaque string by plugin loaders, where `4.0.0-preview0007` sorts after `4.0.0` and would suppress the update to the real release.

- **README catalogue gate** (2026-08-24). `AGENTS.md` has required a *Available Skills* row in every Skill''s atomic change set since 2026-08-12, but nothing checked it, and the drift that accumulated in the meantime was invisible: 36 rows against 45 shipped Skills. [`tests/SkillCatalogue.Tests.ps1`](tests/SkillCatalogue.Tests.ps1) closes it in both directions — every shipped Skill has a row, every row names a Skill that still ships, and every row carries a description. It parses the `## Available Skills` section rather than the whole file, because README holds other tables whose first cell is bold too and a whole-file scan reads `**Agents**` and `**Instructions**` as Skills. A count assertion guards the parser itself, so a moved heading fails loudly instead of passing with zero cases. Shown to reject before it was accepted: with one row removed the run is 133 passed, 1 failed, naming `agent-evals has a catalogue row`; restored, 136 of 136 pass.

- **`brand-logo` Prompt** (2026-08-14). `brand-logo-system` answers "how do I build the asset set" but nothing started the conversation, and the first question an identity task needs — what should the mark actually show — is the one an agent is most likely to skip and guess. The Prompt front-loads it: search the repository for an existing mark first and, when one is found, ask only whether to keep, refine, or replace it rather than interviewing the user about a decision the repository already made; otherwise interview in two `vscode_askQuestions` clusters covering subject, visual treatment, character, colour source, wordmark split, and delivery target. Concepts are proposed as 256 px proofs before eleven assets are built from a guess, and the closing rules restate the two claims that cost time in practice: never invent an identity for a project that already has one, and never assert favicon legibility without a 16 px render.

- **`brand-logo-system` Skill** (2026-08-14). Producing a project identity had been done by hand twice, and both runs rediscovered the same three failures. A text substitution over `width=`/`height=` to resize an SVG also matches every nested `<use>` and `<rect>` and silently scales each one to the full canvas — the fix is to set the attributes on the root element only. The "transparent" assets in the shared logo library are opaque PNGs with a checkerboard painted into their pixels, measured at 0 % transparent pixels, so their transparency cannot be reused and must not be imitated. And a design board that asserts the mark "holds its silhouette" at favicon size is a claim, not a fact: the 16 px render of a detailed mark disproved it, which is why the renderer now takes an optional reduced favicon glyph and a caller-supplied scalability note. The Skill carries the eleven-slot library layout, the dark-mode-means-reversed convention, and a measured verification gate over count, naming, slot parity, canvas size, corner alpha, painted bounds, centring, and ink coverage at 32 and 16 px. [`scripts/Export-BrandLogoSet.ps1`](Skills/brand-logo-system/scripts/Export-BrandLogoSet.ps1) composes all eleven slots from one `.psd1` plus two or three glyph fragments, so a project''s only bespoke artwork is its glyph. Proven end to end against AutomatedLab, whose palette and gear-and-flask mark were recovered from the project''s own 2025 logo by pixel count rather than invented.

### Changed

- **`german-tax-research` reads the operative sentence and aggregates both directions** (2026-08-24). Two failure modes from real case work produce a confidently wrong number rather than a visible error, which is why neither shows up as a mistake until an examiner finds it. The first is classifying a document by its label: a title, subject line, filename, or category column is metadata someone else wrote for another purpose, and one session produced three counterexamples in a row — an e-mail headed `Your sessions at NIC Cloud Connect 2023` whose body read *have not been accepted*, a file named `240108 Überschussabrechnung` that was the December statement rather than a January one, and a `Zinsbescheinigung` column that looked like *sonstige Kosten* but held the `Tilgung`. The second is summing a transaction set with a sign filter, which makes the refund, reversal, credit note, or `Storno` structurally invisible — precisely the entry that changes the answer. A flight showing `1.725,05 €` in charges had cost `848,12 €` once the airline''s refund of one of two bookings three days later was counted. Both are now sections under the evidence rules, each with a matching entry in the stop-and-re-enter red-flag list. The frontmatter `description` is deliberately untouched, so the trigger surface is unchanged and no eval sweep is owed; the body stays inside the 500-line budget, and the Skill remains on the documented `SkillTriggerCoverage` uncovered baseline.

- **`brand-logo-system` covers integrating the assets into a project** (2026-08-14). The Skill produced a library set and stopped, so wiring the mark into a repository was improvised every time it came up. Step 5 now carries it, and carries the parts that are not guessable: a `<table>` cannot give the README a borderless two-column header because github.com draws a 1px border on every cell and its sanitiser strips the style that would remove it, so the mark is floated and closed with `<br clear="left">`; the wordmark replaces the `<h1>` rather than sitting above one, which is why `MD041` stays disabled for the file; a package `IconUri` must be a direct image URL, because a repository URL is accepted and then silently shows a placeholder. Integration asks which repository first — the library holds many projects and a session usually has several open, so "add the logo" names no target and a brand commit in the wrong project is noise its owner has to find and revert — and a project that is not the user''s to change gets a block to paste instead. The trigger queries said the opposite of the new boundary: "add an IconUri to the module manifest" was a negative pointing at `sampler-framework` and is now a positive, joined by header-layout, placeholder-icon, and social-preview positives, and by a screenshot-in-the-README negative that keeps `windows-gui-screenshot-capture` from being swallowed. The `brand-logo` Prompt gained the matching phase, and its delivery-target option no longer names a folder the Skill contradicts.

- **`AGENTS.md` states the atomic change set for a Skill and a Custom agent** (2026-08-12). A Customization is never one file, and a half-added one leaves the catalogue, the trigger coverage, and the changelog disagreeing with each other. The new *Atomic change sets* section names every artifact that has to move in the same commit for each, and tables which test catches which kind of drift — so the answer to "what else does this change need?" is in the house rules rather than in a reviewer''s memory.

- **`pester-patterns` split into a body plus two references** (2026-08-11). The body was 796 lines against the 500-line progressive-disclosure budget and had been carried on the `SkillFrontmatter` over-budget baseline rather than fixed. It is now 149 lines. What stayed is what an agent needs on *every* Pester run: pattern 0, run tests through the fully detached launcher, and pattern 14, helpers used inside `It` must live in `BeforeAll`. What moved is what it needs *sometimes* — patterns 1 to 3 into [`references/mocking-external-dependencies.md`](Skills/pester-patterns/references/mocking-external-dependencies.md) and patterns 4 to 13 into [`references/testing-powershell-constructs.md`](Skills/pester-patterns/references/testing-powershell-constructs.md), both one level deep, both keeping their original numbers so existing references still resolve. The frontmatter `description` is untouched, so the trigger surface is unchanged and no eval re-run is owed. Its baseline entry is removed in the same change, so the gate proves the fix rather than recording the intent; nine Skills remain baselined, `german-legal-research` at 780 lines the worst of them.

- **`.memory-bank/systemPatterns.md` curated from 106 lines to 86** (2026-08-11). It sat 4 lines under its 110-line budget and warned on every build, while the Decision index that must stay grows by a line per record. The repository tree at the top is what went: a changing inventory of the working tree, duplicating `techContext.md`''s module layout, deployment boundar'

        }
    }
}