Data model: Upgrade and Windows drift

No new persisted entity. Two classifications change.

Command-skill file classification

Inputs: disk (SHA-256 of on-disk bytes), recorded (ManifestEntry.content_hash), canonical (SHA-256 of today's rendering), consent (ApplyConsent.overwrite_paths).

disk vs recordeddisk vs canonicalBeforeAfterWrite?
equalequalpresentpresentno
equaldifferentpresent/staleunchanged (install refreshes as today)as today
differentequaldrifted, consent_requiredpresent; recorded := canonicalmanifest only
differentdifferent, path not in consentdrifted, consent_requireddrifted, consent_required (reported)no
differentdifferent, path in consentdrifted, consent_required (write refused)overwritten with canonical; recorded := canonicalyes
no entryequaladoptedadoptedmanifest only
no entrydifferentpreservepreserveno

consent is populated only by CommandSkillsProvider.repair for statuses in STATE_DRIFTED, reached from doctor tool-surfaces --fix or an interactive upgrade "yes".

Planning-artifact staging classification

Inputs: oid_ref (object id of <ref>:<rel>, absent if the path is not in the ref), oid_work (git hash-object --stdin-paths of the working file, clean filter applied).

ConditionBeforeAfter
bytes equalcleanclean
bytes differ only by line endings Git normalizeschangedclean
real text change (any line ending)changedchanged
path absent in refchangedchanged
git error for this pathn/achanged (fail closed)