Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .specify/memory/constitution.md
Original file line number Diff line number Diff line change
Expand Up @@ -1041,7 +1041,7 @@ workspace family consists of:
| `parallel-autonomous-run-governance` | `v0.2.6` | `80` | isolated bounded campaigns plus optional schema-1.2 campaign intake gate |

`model-routing-governance` v0.1.4 at priority `61`,
`intake-authoring-governance` v0.3.4 at priority `64`,
`intake-authoring-governance` v0.3.5 at priority `64`,
`intake-review-governance` v0.2.3 at priority `65`, and
`intake-sequencing-governance` v0.2.6 at priority `66` are optional presets,
not part of the standard eight. Model Routing discovers harness capabilities
Expand Down Expand Up @@ -1131,7 +1131,7 @@ listed in the `github/spec-kit` community preset catalog since 2026-05-04;
`autonomous-run-governance` v0.2.2 was verified there on 2026-07-17.
The current standalone releases are `autonomous-run-governance` v0.4.4,
`parallel-autonomous-run-governance` v0.2.6, optional
`intake-authoring-governance` v0.3.4, optional
`intake-authoring-governance` v0.3.5, optional
`intake-review-governance` v0.2.3, and optional
`intake-sequencing-governance` v0.2.6. Registered Level-0, Level-1, and Level-2
repositories with Spec Kit SHOULD install all eight presets from the central
Expand Down
118 changes: 59 additions & 59 deletions .specify/presets/.registry
Original file line number Diff line number Diff line change
Expand Up @@ -347,65 +347,6 @@
],
"installed_at": "2026-09-27T20:30:51.677557+00:00"
},
"intake-authoring-governance": {
"version": "0.3.4",
"source": "local",
"manifest_hash": "sha256:3c934d29268fd284aa8641b491d6725cda54480c19065482dc7d270bf27f0186",
"enabled": true,
"priority": 64,
"registered_commands": {
"agy": [
"speckit.intake-create",
"speckit.intake-read",
"speckit.intake-update",
"speckit.intake-delete",
"speckit.intake-create-status"
],
"claude": [
"speckit.intake-create",
"speckit.intake-read",
"speckit.intake-update",
"speckit.intake-delete",
"speckit.intake-create-status"
],
"codex": [
"speckit.intake-create",
"speckit.intake-read",
"speckit.intake-update",
"speckit.intake-delete",
"speckit.intake-create-status"
],
"copilot": [
"speckit.intake-create",
"speckit.intake-read",
"speckit.intake-update",
"speckit.intake-delete",
"speckit.intake-create-status"
],
"opencode": [
"speckit.intake-create",
"speckit.intake-read",
"speckit.intake-update",
"speckit.intake-delete",
"speckit.intake-create-status"
],
"zed": [
"speckit.intake-create",
"speckit.intake-read",
"speckit.intake-update",
"speckit.intake-delete",
"speckit.intake-create-status"
]
},
"registered_skills": [
"speckit-intake-create",
"speckit-intake-read",
"speckit-intake-update",
"speckit-intake-delete",
"speckit-intake-create-status"
],
"installed_at": "2026-09-27T20:30:52.932864+00:00"
},
"intake-review-governance": {
"version": "0.2.3",
"source": "local",
Expand Down Expand Up @@ -679,6 +620,65 @@
"speckit-statistics-update"
],
"installed_at": "2026-09-27T20:30:58.426620+00:00"
},
"intake-authoring-governance": {
"version": "0.3.5",
"source": "local",
"manifest_hash": "sha256:74a5bd0afc28ab4b3a997b2831278dcd215171552cac9877095fd08176a4591f",
"enabled": true,
"priority": 64,
"registered_commands": {
"agy": [
"speckit.intake-create",
"speckit.intake-read",
"speckit.intake-update",
"speckit.intake-delete",
"speckit.intake-create-status"
],
"claude": [
"speckit.intake-create",
"speckit.intake-read",
"speckit.intake-update",
"speckit.intake-delete",
"speckit.intake-create-status"
],
"codex": [
"speckit.intake-create",
"speckit.intake-read",
"speckit.intake-update",
"speckit.intake-delete",
"speckit.intake-create-status"
],
"copilot": [
"speckit.intake-create",
"speckit.intake-read",
"speckit.intake-update",
"speckit.intake-delete",
"speckit.intake-create-status"
],
"opencode": [
"speckit.intake-create",
"speckit.intake-read",
"speckit.intake-update",
"speckit.intake-delete",
"speckit.intake-create-status"
],
"zed": [
"speckit.intake-create",
"speckit.intake-read",
"speckit.intake-update",
"speckit.intake-delete",
"speckit.intake-create-status"
]
},
"registered_skills": [
"speckit-intake-create",
"speckit-intake-read",
"speckit-intake-update",
"speckit-intake-delete",
"speckit-intake-create-status"
],
"installed_at": "2026-09-28T13:44:26.537631+00:00"
}
}
}
21 changes: 13 additions & 8 deletions .specify/presets/intake-authoring-governance/README.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
# Intake Authoring Governance Preset

Aktuelle Version / Current version: **0.3.4**. Dieser Patch schliesst physische
Collection-Aliase und unbekannte Lifecycle-Zustaende aus. Authoring prueft auch
bestehende Receipt-Ziele und Quellen vor dem Lesen gegen die Repository-Grenze.

This patch rejects physical collection aliases and unknown lifecycle states.
Authoring also checks existing receipt targets and sources for repository
containment before reading. Earlier feature versions below describe history.
Aktuelle Version / Current version: **0.3.5**. Dieser Patch veroeffentlicht die
Korrektur fuer Receipts der eigenen Generatorversion. Beide Validatoren
akzeptieren die aktuelle Vorlage und bekannte Schema-2-Generatoren, darunter
0.3.4; unbekannte Versionen und unzulaessige Schema-Kombinationen bleiben gesperrt.

This patch publishes current-generator receipt compatibility. Both validators
accept the shipped template and known schema-2 generators, including 0.3.4,
while rejecting unknown versions and invalid schema/version combinations.
Earlier physical-boundary and lifecycle hardening remains unchanged.
See [generator compatibility](docs/generator-version-compatibility.md).
See [boundary hardening](docs/lifecycle-boundary-hardening.md).

Optional, stackable intake-authoring governance for GitHub Spec Kit. Version
Expand Down Expand Up @@ -64,7 +67,7 @@ and freshness without writing.*

```bash
specify preset add \
--from https://github.com/hindermath/spec-kit-preset-intake-authoring-governance/archive/refs/tags/v0.3.4.zip \
--from https://github.com/hindermath/spec-kit-preset-intake-authoring-governance/archive/refs/tags/v0.3.5.zip \
--priority 64
specify preset list
specify preset info intake-authoring-governance
Expand Down Expand Up @@ -448,6 +451,8 @@ files or granting repair authority.*

Pruefnachweis und Release-Grenzen / Validation and release boundaries: [Lifecycle evidence](docs/completed-series-lifecycle.md).

Generator-Kompatibilitaet / Generator compatibility: [Current release validation](docs/generator-version-compatibility.md).

## Historische Authoring-Receipts / Historical Authoring Receipts

Fehlt der urspruengliche aktive Zielpfad, prueft der Receipt-Validator die
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Generatorversion und Receipt-Pruefung / Generator version and receipt validation

Die bisherige Schema-2-Allowlist endete bei 0.3.2 und wies damit neue Receipts
der eigenen 0.3.4-Vorlage zurueck. Beide Wrapper akzeptieren jetzt die bekannten
Schema-2-Generatoren einschliesslich 0.3.3/0.3.4 sowie die konkrete Version aus
der eigenen `preset.yml`. Unbekannte fremde Versionen bleiben ungueltig; die
engen Regeln fuer Schema 1.0 und 1.1 bleiben erhalten.

Version 0.3.5 veroeffentlicht die Korrektur aus PR #9. Die Lifecycle-Suite
prueft vollstaendige Receipts aus der ausgelieferten Vorlage in LF, CRLF und
UTF-8 mit BOM, unveraenderte Eingabe-Hashes, bekannte Generatoren 0.3.3/0.3.4,
enge Schema-1-Grenzen und die Ablehnung von 99.0.0. Bestehende Archiv-, Quellen-,
Transaktions- und Shell-Paritaetstests bleiben verbindlich. Existierende Tags
und ZIPs bleiben unveraendert. Beim Verbraucher-Upgrade werden dokumentierte
Backports gegen das neue Paket abgeglichen; historische Receipts bleiben erhalten.

The prior schema-2 allowlist stopped at 0.3.2 and rejected receipts generated
from its own 0.3.4 template. Both wrappers now accept known schema-2 generators,
including 0.3.3/0.3.4, plus the exact version of their own preset metadata.
Unknown external versions remain invalid; schema-1.0/1.1 restrictions remain.
Version 0.3.5 publishes PR #9. Lifecycle tests exercise complete receipts from
the shipped template with LF, CRLF and UTF-8 BOM, unchanged input hashes,
known 0.3.3/0.3.4 generators, strict legacy-schema boundaries, and rejection of
99.0.0, alongside existing archive, source, transaction and shell-parity cases.
Existing tags/ZIPs are immutable. Consumer upgrades reconcile documented
backports against the new package without rewriting historical receipts.

Documentation Impact: UpdateRequired. Owner: Maintainer. Leser / audience:
Preset-Maintainer und Integratoren / preset maintainers and integrators.
Kanonische Quelle / canonical source: beide Receipt-Wrapper / both receipt
wrappers. Navigation: README. Klasse / class: source-only technical evidence.
DE/EN in dieser Datei / in this file. Home-Sync: keiner / none. Re-Evaluation:
naechster Release, Schemawechsel oder neuer Generator / next release, schema
change or new generator. Validation: macOS, Bash and PowerShell parity;
native platform evidence is attached to the source PR.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
.TH VALIDATE-INTAKE-AUTHORING-ARTIFACT 1 "July 2026" "intake-authoring-governance 0.3.4"
.TH VALIDATE-INTAKE-AUTHORING-ARTIFACT 1 "September 2026" "intake-authoring-governance 0.3.5"
.SH NAME
validate-intake-authoring-artifact \- validate intake series, operations, and tombstones
.SH SYNOPSIS
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
.TH VALIDATE-INTAKE-AUTHORING-RECEIPT 1 "July 2026" "intake-authoring-governance 0.3.4"
.TH VALIDATE-INTAKE-AUTHORING-RECEIPT 1 "September 2026" "intake-authoring-governance 0.3.5"
.SH NAME
validate-intake-authoring-receipt \- validate intake source and output provenance read-only
.SH SYNOPSIS
Expand Down
2 changes: 1 addition & 1 deletion .specify/presets/intake-authoring-governance/preset.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ schema_version: "1.0"
preset:
id: "intake-authoring-governance"
name: "Intake Authoring Governance"
version: "0.3.4"
version: "0.3.5"
description: "Governs traceable intake CRUD, language-aware requirements collections, bounded public HTTPS sources, and explicitly approved single or series authoring."
author: "Thorsten Hindermann"
repository: "https://github.com/hindermath/spec-kit-preset-intake-authoring-governance"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -229,10 +229,17 @@ function Test-IntakeAuthoringReceipt {
} elseif ($SchemaVersion -eq '1.1') {
@('0.1.1')
} elseif ($SchemaVersion -eq '2.0') {
@('0.2.0', '0.2.1', '0.3.0', '0.3.1', '0.3.2')
@('0.2.0', '0.2.1', '0.3.0', '0.3.1', '0.3.2', '0.3.3', '0.3.4')
} else {
@()
})
# DE: Eigene Schema-2-Vorlagen bleiben nach Patch-Releases gueltig.
# EN: Keep this release's schema-2 templates valid after patch releases.
$PresetMetadata = Join-Path (Split-Path -Parent $PSScriptRoot) 'preset.yml'
if ($SchemaVersion -eq '2.0' -and (Test-Path -LiteralPath $PresetMetadata -PathType Leaf)) {
$VersionMatch = [regex]::Match((Get-Content -LiteralPath $PresetMetadata -Raw), '(?m)^\s+version:\s*"?([0-9]+\.[0-9]+\.[0-9]+)"?\s*$')
if ($VersionMatch.Success) { $AcceptedGenerators += $VersionMatch.Groups[1].Value }
}
if ($AcceptedGenerators.Count -gt 0 -and $GeneratorVersion -notin $AcceptedGenerators) {
$Errors.Add("generator.version is not accepted for schema $SchemaVersion")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,8 +161,16 @@ generator_version = required_text(generator, "version", "generator")
accepted_generators = {
"1.0": {"0.1.0"},
"1.1": {"0.1.1"},
"2.0": {"0.2.0", "0.2.1", "0.3.0", "0.3.1", "0.3.2"},
"2.0": {"0.2.0", "0.2.1", "0.3.0", "0.3.1", "0.3.2", "0.3.3", "0.3.4"},
}.get(schema_version, set())
# DE: Das eigene Release muss seine Schema-2-Vorlage akzeptieren; keine fremden Versionen.
# EN: Accept this release's schema-2 template without accepting arbitrary versions.
preset_metadata = Path(sys.argv[3]).parent / "preset.yml"
if schema_version == "2.0" and preset_metadata.is_file():
match = re.search(r'^\s+version:\s*"?([0-9]+\.[0-9]+\.[0-9]+)"?\s*$',
preset_metadata.read_text(encoding="utf-8"), re.MULTILINE)
if match:
accepted_generators.add(match.group(1))
if accepted_generators and generator_version not in accepted_generators:
errors.append(
f"generator.version must be one of {sorted(accepted_generators)} "
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,19 @@
# Field Validation Summary

Version: `0.3.4`
Version: `0.3.5`

## Patch-Pruefgrenze / Patch Validation Boundary

Die neue Regression prueft vollstaendige Receipts aus der ausgelieferten
Vorlage, bekannte Generatoren einschliesslich 0.3.4 und die Ablehnung
unbekannter Versionen sowie falscher Schema-Zuordnungen. Native Ergebnisse
werden am exakten Release-PR-Head gebunden. Die untenstehenden Feld- und
Kompositionsnachweise sind historisch und behaupten keinen neuen Flottenlauf.

The new regression validates complete receipts from the shipped template,
known generators including 0.3.4, unknown-version rejection, and invalid schema
bindings. Native results bind the exact release PR head. Field and composition
evidence below is historical and does not claim a new fleet run.

## Package Validation / Paketvalidierung

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"intakeId": "00000000-0000-0000-0000-000000000000",
"generator": {
"preset": "intake-authoring-governance",
"version": "0.3.4"
"version": "0.3.5"
},
"createdAt": "1970-01-01T00:00:00Z",
"operation": {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,17 @@ function Get-HBHash([string]$Path) {
$Text = $Utf8.GetString($Bytes, $Offset, $Bytes.Length - $Offset).Replace("`r`n", "`n").Replace("`r", "`n")
return [Convert]::ToHexString([Security.Cryptography.SHA256]::HashData($Utf8.GetBytes($Text))).ToLowerInvariant()
}
function Invoke-HBPair([string]$Kind, [string]$Path, [string]$Repo, [int]$Expected, [string]$Case) {
function Invoke-HBPair([string]$Kind, [string]$Path, [string]$Repo, [int]$Expected, [string]$Case, [string]$ExpectedError = '') {
$Stem = if ($Kind -eq 'Receipt') { 'validate-intake-authoring-receipt' } else { 'validate-intake-authoring-artifact' }
$PowerShellArgs = if ($Kind -eq 'Receipt') { @('-Receipt', $Path, '-Repo', $Repo) } else { @('-Artifact', $Path, '-Repo', $Repo) }
$Output = & pwsh -NoProfile -File (Join-Path $PresetRoot "scripts/${Stem}.ps1") @PowerShellArgs 2>&1
if ($LASTEXITCODE -ne $Expected) { throw "${Case}: PowerShell expected $Expected, got ${LASTEXITCODE}: $($Output -join ' | ')" }
if ($ExpectedError -and -not ($Output -join ' | ').Contains($ExpectedError)) { throw "${Case}: PowerShell missing expected diagnostic ${ExpectedError}" }
if (Get-Command bash -ErrorAction SilentlyContinue) {
$BashArgs = if ($Kind -eq 'Receipt') { @('--receipt', $Path, '--repo', $Repo) } else { @('--artifact', $Path, '--repo', $Repo) }
$Output = & bash (Join-Path $PresetRoot "scripts/${Stem}.sh") @BashArgs 2>&1
if ($LASTEXITCODE -ne $Expected) { throw "${Case}: Bash expected $Expected, got ${LASTEXITCODE}: $($Output -join ' | ')" }
if ($ExpectedError -and -not ($Output -join ' | ').Contains($ExpectedError)) { throw "${Case}: Bash missing expected diagnostic ${ExpectedError}" }
}
}
function New-HBIntake([string]$Path) {
Expand Down Expand Up @@ -130,6 +132,50 @@ try {
}
Write-HBText $ReceiptPath ($Receipt | ConvertTo-Json -Depth 30)
Invoke-HBPair Receipt $ReceiptPath $Root 0 'schema 2 URL receipt'
$CurrentVersion = [regex]::Match((Get-Content (Join-Path $PresetRoot 'preset.yml') -Raw), '(?m)^\s+version:\s*"?([^"\s]+)').Groups[1].Value
if (-not $CurrentVersion) { throw 'Missing current preset version' }
$OriginalVersion = $Receipt.generator.version
$Receipt.generator.version = $CurrentVersion
Write-HBText $ReceiptPath ($Receipt | ConvertTo-Json -Depth 20)
Invoke-HBPair Receipt $ReceiptPath $Root 0 'current release generator'
# DE: Die echte Paketvorlage verwenden; reine Versionsparitaet reicht nicht.
# EN: Exercise the shipped template; version equality alone is insufficient.
$ShippedReceipt = Get-Content (Join-Path $PresetRoot 'templates/intake-authoring-receipt-template.json') -Raw | ConvertFrom-Json -AsHashtable
foreach ($Key in $Receipt.Keys) {
if ($Key -notin @('generator', 'schemaVersion')) { $ShippedReceipt[$Key] = $Receipt[$Key] }
}
if ($ShippedReceipt.generator.version -ne $CurrentVersion -or $ShippedReceipt.schemaVersion -ne '2.0') {
throw 'Shipped receipt template does not bind the current schema-2 release'
}
foreach ($EncodingCase in @('LF', 'CRLF', 'BOM')) {
$TemplateJson = ($ShippedReceipt | ConvertTo-Json -Depth 30).Replace("`r`n", "`n").Replace("`r", "`n")
if ($EncodingCase -eq 'CRLF') { $TemplateJson = $TemplateJson.Replace("`n", "`r`n") }
[IO.File]::WriteAllText($ReceiptPath, $TemplateJson, [Text.UTF8Encoding]::new($EncodingCase -eq 'BOM'))
$BeforeReceipt = (Get-FileHash -LiteralPath $ReceiptPath -Algorithm SHA256).Hash
$BeforeTarget = (Get-FileHash -LiteralPath $Target -Algorithm SHA256).Hash
Invoke-HBPair Receipt $ReceiptPath $Root 0 "shipped template ${EncodingCase}"
if ((Get-FileHash -LiteralPath $ReceiptPath -Algorithm SHA256).Hash -ne $BeforeReceipt -or
(Get-FileHash -LiteralPath $Target -Algorithm SHA256).Hash -ne $BeforeTarget) {
throw 'Receipt validation changed input bytes'
}
}
foreach ($LegacyGenerator in @('0.3.3', '0.3.4')) {
$Receipt.generator.version = $LegacyGenerator
Write-HBText $ReceiptPath ($Receipt | ConvertTo-Json -Depth 20)
Invoke-HBPair Receipt $ReceiptPath $Root 0 "known schema-2 generator ${LegacyGenerator}"
}
$Receipt.generator.version = $CurrentVersion
foreach ($LegacySchema in @('1.0', '1.1')) {
$Receipt.schemaVersion = $LegacySchema
Write-HBText $ReceiptPath ($Receipt | ConvertTo-Json -Depth 20)
Invoke-HBPair Receipt $ReceiptPath $Root 2 "current generator with legacy schema ${LegacySchema}" 'generator.version'
}
$Receipt.schemaVersion = '2.0'
$Receipt.generator.version = '99.0.0'
Write-HBText $ReceiptPath ($Receipt | ConvertTo-Json -Depth 20)
Invoke-HBPair Receipt $ReceiptPath $Root 2 'unknown generator version' 'generator.version'
$Receipt.generator.version = $OriginalVersion
Write-HBText $ReceiptPath ($Receipt | ConvertTo-Json -Depth 20)
$ArchiveRelative = 'requirements/archive/url-source.001-completed.md'
$ConfigPath = Join-Path $Root 'requirements/intake-governance-config.json'
$ManifestPath = Join-Path $Root 'requirements/series.json'
Expand Down
Loading