# Byg fra den rigtige kilde

## 1. Inventér og afgræns

Læs den entydigt udpegede kilde før bred søgning. Klassificér arbejdsgrundlaget
som SOURCE_COMPLETE, SOURCE_PARTIAL, METADATA_ONLY eller SOURCE_UNAVAILABLE.
Dette er lokale labels. Et navn eller et referat er utilstrækkeligt til konvertering.
Registrér faktiske versioner, Skill-identiteter, filliste og måloverflade. Afklar
versionskonflikt frem for automatisk at vælge nyeste dato. Gem input og arbejdskopi.

Fastlæg invariants før ændring: hvad skal med, hvilke formuleringer er låst,
hvad er leveringsformatet, hvilke eksterne handlinger er autoriseret? Ved ren
konvertering bevares kildefiler, navne og ophav. Kontroller nødvendige lokale
referencer samt afhængigheder, der omtales i prose eller kode. En linkparser
finder ikke alle semantiske afhængigheder. Kør kun læst, relevant egen helper;
udfør ikke mål-Skillens fagopgave eller medleverede scripts under pakningen.

## 2. Læg wrapperen omkring metoden

Følg [formatpolitikken](runtime.md). Som konkret compatibility-eksempel:

```text
notes-plugin/
  .codex-plugin/plugin.json
  skills/notes-helper/
    SKILL.md
    references/output.md
    assets/template.txt
```

Minimalt strukturelt eksempel — ikke en generel portaltilmelding:

```json
{
  "name": "notes-plugin",
  "version": "0.1.0",
  "description": "Pakker den eksisterende notes-helper.",
  "skills": "./skills/"
}
```

Kopiér den faktiske notes-helper ind; eksemplet erstatter ikke dens indhold.
Udfyld yderligere præsentationsfelter og assets, hvis den valgte importvej
kræver dem. Opfind ikke ejer-ID, privacy-URL eller servere. Ved en eksisterende
plugin: bevar relevante komponenter og udred dependencies i stedet for at slette dem.
Portable eksempler følger root-schemaet fra [runtime](runtime.md).

Manglende nødvendige filer blokerer den berørte pakke. Hver aftalt Skill skal
ligge som direkte undermappe i `skills/` med fuld SKILL.md. Et aftalt bundle er
først komplet, når alle forventede navne og nødvendige filer er med.

## 3. Kontroller og pak med den valgfrie helper

Python 3.10+, PyYAML og markdown-it-py bruges af valideringen. Pillow kræves,
når deklarerede rasterikoner skal kontrolleres. Ingen dependencies installeres
automatisk. Tekstlig opgaveforståelse er ikke afhængig af helperen.

```sh
python scripts/package_skill.py inspect original.zip
python scripts/package_skill.py extract original.zip ny-kildemappe
python scripts/package_skill.py validate notes-helper
python scripts/package_skill.py build notes-helper notes-helper.zip
python scripts/package_skill.py validate-plugin notes-plugin --expect notes-helper --source notes-helper=notes-helper
python scripts/package_skill.py build-plugin notes-plugin notes-plugin.zip --expect notes-helper --source notes-helper=notes-helper
python scripts/package_skill.py validate-plugin notes-plugin.zip --expect notes-helper --source notes-helper=notes-helper
```

Stierne er illustrerende; brug eksisterende kilder og nye destinationer.
Kør helperen fra dens mappe eller brug fuld scriptsti. Gentag `--expect` og
`--source` for bundles. Uden forventet Skill-sæt er indholdskomplethed uafklaret
og pluginresultatet REVIEW. Source-paritet kan kun måles med faktiske kildebytes.

Ved autoriseret kompatibilitetsændring kan `--changes reviewed-changes.json`
angive en præcis SHA-256-diff med begrundelse. Formen er en mapping fra
`<skill>/<fil>` til `before`, `after` og `reason`. Begge hashes skal matche de
faktiske bytes. Brug null for en reelt tilføjet/slettet fil. Ubrugte eller
upræcise undtagelser afvises. Filen dokumenterer en allerede givet tilladelse;
den skaber ikke tilladelsen. Ved ren konvertering bruges ingen undtagelser.

Exitkoder: 0 PASS, 1 FAIL, 2 BLOCKED (fx manglende dependency), 3 REVIEW.
Læs både `packaging_status`, `target_compatibility` og `artifact_created`.
Build skriver kun, når de krævede lokale kontroller har `packaging_status: PASS`.
Directory-ikonprofilen kontrolleres separat som en dateret delmængde, ikke som
fuld godkendelse af Directory eller privat import. Et ellers korrekt build med
fx et bevaret 24 × 24-ikon kan derfor give **REVIEW / exit 3 med en faktisk ZIP**.
`artifact_created: true` og arkivets sti/hash angiver, at en fil blev skrevet.
REVIEW på grund af ukendte felter, aktivt SVG-indhold, uafklaret forventet
Skill-sæt eller anden manglende lokal kontrol skriver derimod ingen ZIP.
Fejl, manglende referencer, paritetsbrud og nødvendig manglende parser blokerer.
Der findes ingen generel force-/ignore-errors-omvej.

Outputs skal være nye og uden for kilden. `build . ../pakke.zip` bruger den
kanoniske kildemappes navn; de endelige ZIP-stier og det skrevne arkiv kontrolleres.
En legitim symlinket forælder er tilladt; symlinks inde i kilden eller som
slutdestination afvises. Ingen garanti mod en fjendtlig samtidig skriver.
`inspect`/`validate` er læsende. `extract`/`build`/`build-plugin` skriver kun til
aftalte lokale destinationer. Ingen netværk, kontokald eller targetkode eksekveres.

## 4. Aflever med et kort ændringsspor

Brug [validering](validation.md). Genåbn slut-ZIP'en; en korrekt arbejdskopi
alene er ikke nok. Rapportér navn/version, forventede og faktiske Skills,
kildeparitet eller begrundede diffs, udførte kontroller samt oprettelse,
installation og aktivering hver for sig. Rapporten ligger ved siden af
installationsarkivet. En transport-ZIP med flere plugins er ikke én plugin.

Hvis creator-værktøjer findes, brug dem til det arbejde de faktisk understøtter,
og efterprøv resultatet mod den samme kildekontrakt. Manglende creator blokerer
ikke lokal pakning. Manglende konto-/filadgang giver en præcis restopgave, ikke
et opdigtet link. Stop når leverancen og dens relevante kontroller er færdige.
