CopilotAtelier.psd1

@{
    RootModule        = 'CopilotAtelier.psm1'

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

            ReleaseNotes = '## [3.0.0-preview0002] - 2026-08-01

### Added

- **New Skill `german-tax-research`** (2026-07-31). The `tax-researcher` agent had instructed itself to "load **german-tax-research**" since the day it was written, and no such Skill existed — every income tax session therefore ran on whatever the model happened to recall about the EStG and the AO. The Skill closes that dangling reference and carries the material that a multi-year `Einspruchsverfahren` produced. Three rules in it are the ones that repeatedly decided outcomes. **Four proof types, judged separately**: an invoice evidences the cost and nothing else, so payment, professional purpose or participation, and the absence of third-party reimbursement each need their own document, and a missing one is closed with a signed `Eigenbeleg` or the position is dropped — never carried silently into the letter. **Reconcile against the transmitted return, not the workbook**: a control table with transmitted, evidenced, difference, and treatment per position is the only instrument that catches an allocation key a spreadsheet quietly "improved" away from the one the tax office applied, a bank credit that is a net figure hiding a gross receipt plus a disbursement, and a byte-identical invoice claimed in two different years. **Disclose every difference in the point it belongs to**, including corrections against the taxpayer''s own interest, because `§ 153 Abs. 1 AO` obliges notification once an error is known and an examiner who sees a self-reported correction reads the rest of the package differently. The Skill also fixes the deadline arithmetic that is wrong in most self-prepared objections: notification is deemed on the **fourth** day after dispatch since the PostModG took effect on 1 January 2025, not the third, and both that day and the end of the one-month objection period shift over weekends and state public holidays under `§ 108 Abs. 3 AO`. [`scripts/Get-SteuerFrist.ps1`](Skills/german-tax-research/scripts/Get-SteuerFrist.ps1) computes it, selects the three- or four-day fiction from the dispatch date, and reports every shift it applied together with the holiday set of the state where the Finanzamt sits.

  Six references keep the body inside the progressive-disclosure budget: [`fristen-und-verfahren.md`](Skills/german-tax-research/references/fristen-und-verfahren.md) for notification, objection, AdV, estimation, surcharges, interest, limitation, and competence; [`vermietung-und-afa.md`](Skills/german-tax-research/references/vermietung-und-afa.md) for `Anlage V`, the AfA rates including the 5 % declining balance of `§ 7 Abs. 5a EStG`, the purchase-price split after BFH IX R 26/19, and the handling of a `§ 7i` certificate as an outstanding `Grundlagenbescheid`; [`werbungskosten-und-abzuege.md`](Skills/german-tax-research/references/werbungskosten-und-abzuege.md); [`belegaufforderung-antwort.md`](Skills/german-tax-research/references/belegaufforderung-antwort.md) with the end-to-end answer procedure, the residence and centre-of-life evidence order, and the dispatch channels that actually prove receipt; [`kennzahlen.md`](Skills/german-tax-research/references/kennzahlen.md) with amounts and filing deadlines per assessment period 2021 to 2026, including the `§ 36 EGAO` extensions that make the 2020 to 2024 dates non-obvious; and [`vorlagen.md`](Skills/german-tax-research/references/vorlagen.md) with the German letter templates. Cross-referenced with `evidence-package-assembly`, which builds the `Anlage` PDF this Skill decides the content of, and with `german-legal-research`, whose `DO NOT USE FOR` now names the new Skill for tax questions. Skill count 42 → 43.
- **New Skill `evidence-package-assembly`** (2026-07-30). Assembling an `Anlage` for an authority repeatedly hit the same three problems and none of them had a home in the Skill library. First, headless Microsoft Edge writes no PDF and still returns exit code 0 unless it is launched with `--headless=new`, a private `--user-data-dir`, and awaited as a process, so a Markdown-to-PDF pipeline appears to succeed while producing nothing; the Skill states the guard and ships [`scripts/Build-EvidencePackage.ps1`](Skills/evidence-package-assembly/scripts/Build-EvidencePackage.ps1), which throws when the output is absent. Second, deciding which sheets may be dropped from a bank statement or an official document has a reliable criterion that is not "topical relevance": a sheet carrying the source''s own `Seite X von N` numbering stays even when it shows nothing relevant, because its removal leaves a visible gap and invites the reproach of selective presentation, while a sheet outside that numbering — terms-and-conditions notices, technical trailer lines — can be dropped without trace. Third, redaction is the wrong default for statements, because breaking the running balance destroys more evidential value than the privacy gain is worth. [`scripts/merge-and-verify.py`](Skills/evidence-package-assembly/scripts/merge-and-verify.py) takes a JSON manifest, merges with pypdf, prints the page range of every part so the cover is filled from the build output rather than by hand, and reads the sources'' own page numbering back out of the assembled file to prove no sequence was broken. The Skill also collects the pandoc gotchas that only surface at render time: `--metadata title` duplicating the H1, single newlines collapsing a header block, pipe-table column widths coming from the dash counts in the separator row, and `17. April 2022` at the start of a line parsing as an ordered list.
- **New `subagent-dispatch` Skill** (2026-07-30). [`Skills/subagent-dispatch/SKILL.md`](Skills/subagent-dispatch/SKILL.md) closes the largest gap in the library: eleven Custom agents can delegate, and nothing documented how. Covers the model-tier table (transcription → cheapest, mechanical → cheap, integration → standard, design and broad final review → most capable, review scaled to diff risk, fix rounds one tier above the model that got stuck) with the rule that **an omitted model inherits the controller''s model**, usually the most expensive available, and the counter-intuitive economics that **turn count beats token price** — the cheapest models take two to three times the turns on multi-step work, so a mid tier is the floor for reviewers and for any subagent working from prose. Defines the five-part dispatch (placement line, brief path, interfaces from earlier work, resolved ambiguity, report contract) and bans pasted session history, since everything pasted stays resident in the controller context and is re-read every turn. Requires artifacts to change hands as files rather than inline text, forbids pre-judging a reviewer ("do not flag", "at most Minor"), and mandates a task ledger because conversation memory does not survive compaction and a controller that loses its place re-dispatches completed work. Adds a four-status report protocol where a subagent''s success claim is a claim and the diff is the evidence, and a five-round fix cap with model escalation at round four, scoped re-reviews, written adjudication at the cap, and escalation to the user for load-bearing findings. Skill count 40 → 41.

### Fixed

- **The release pipeline published to the Gallery without creating the release tag, which froze the next version** (2026-08-01). Run 30689416495 failed with `409 (A package with id ''CopilotAtelier'' and version ''3.0.0-preview0001'' already exists and cannot be modified.)`. The version is not computed from the commit count: [`GitVersion.yml`](GitVersion.yml) runs in `ContinuousDelivery` mode, where the pre-release number is **anchored on the last git tag** and advances by one for each new tag — which is why the sibling `ShellPilot` repository, with an identical configuration, carries `v0.2.0-preview0001` through `v0.2.0-preview0008` and has never collided. `Publish_Release_To_GitHub` creates that tag as part of the GitHub release, and in this repository it is skipped on every run: its condition is `-if ($GitHubToken -and (Get-Module -Name PowerShellForGitHub -ListAvailable))`, `PowerShellForGitHub` resolves into `output/RequiredModules` as a dependency of `Sampler.GitHubTasks`, so the empty half is `GitHubToken` — the repository secret was never added. `Publish_Module_To_gallery` has its own token and ran anyway, so the module shipped untagged and every later build recomputed the version it had already published. Proven in a throwaway clone: with the unchanged configuration, adding the missing `v3.0.0-preview0001` tag makes the next commit compute `3.0.0-preview0002`. The pipeline now runs a **Verify Release Secrets** step before `Publish Release` that fails the deploy job when either secret is absent, so a missing token stops the release instead of shipping an untaggable one, and [`tests/Workflows.Tests.ps1`](tests/Workflows.Tests.ps1) asserts that the guard precedes the publish step. The `GitHubToken` secret itself still has to be added to the repository.

- **The GitHub release was rejected because the changelog''s `[Unreleased]` section had grown past the API''s body limit** (2026-08-01). With the token in place, run 30702468950 got as far as creating `v3.0.0-preview0002` and then failed with `422 Validation Failed — body is too long (maximum is 125000 characters)`. Sampler builds the release body from `(Get-ChangelogData).Unreleased.RawData`, and that section stood at **143,697 characters**: version `2.0.0` shipped to the Gallery on 2026-07-29 but was never recorded, because `Create_ChangeLog_GitHub_PR` needs the same missing `GitHubToken` — so the identical secret gap that suppressed the tag also let `[Unreleased]` accumulate three releases'' worth of entries. Everything that `[Unreleased]` held at the `v2.0.0` tag now sits in a `2.0.0` section dated 2026-07-29 with its own compare link, leaving 15,441 characters of genuinely unreleased work. [`tests/QA/module.tests.ps1`](tests/QA/module.tests.ps1) now fails the build when `[Unreleased]` passes 100'

        }
    }
}