From 338160899a77a2cf5fc0610c49b92d7d2cde3021 Mon Sep 17 00:00:00 2001 From: Thorsten Hindermann Date: Sun, 13 Sep 2026 02:22:57 +0200 Subject: [PATCH 1/3] fix: reconcile completed intake archives --- .../intake-authoring-governance/README.md | 11 +- .../man/validate-intake-governance-config.1 | 5 +- .../validate-intake-governance-config.py | 12 +- .../templates/field-validation-summary.md | 9 +- .../tests/test-intake-governance-config.ps1 | 63 +++++++-- .../man/validate-intake-governance-config.1 | 5 +- .../validate-intake-governance-config.py | 12 +- .../templates/agent-file-addendum.md | 7 +- .../intake-review-checklist-template.md | 2 +- .../intake-review-runbook-template.md | 5 +- .../tests/test-intake-governance-config.ps1 | 63 +++++++-- .../intake-sequencing-governance/README.md | 9 +- .../docs/field-validation-summary.md | 5 +- .../man/validate-intake-governance-config.1 | 5 +- .../validate-intake-governance-config.py | 12 +- .../templates/agent-file-addendum.md | 5 +- .../intake-series-checklist-template.md | 2 +- .../intake-series-runbook-template.md | 5 +- .../tests/test-intake-governance-config.ps1 | 63 +++++++-- Lastenheft_Abarbeitungsreihenfolge.md | 20 +-- ...38-example-portfolio-conformance-audit.md} | 0 ...osure.037-wave6-combined-delta-closure.md} | 0 ...e.043-documentation-publishing-closure.md} | 0 ...ge.040-constitution-governance-closure.md} | 0 ...-Closure.039-example-portfolio-closure.md} | 0 ...4-sandbox-secure-development-hardening.md} | 0 ...nce-Policy.041-source-reference-policy.md} | 0 ...orm-Model.042-transactional-form-model.md} | 0 .../intake-review-request.json | 62 ++++----- .../intake-review-result.json | 38 +++--- .../series/tui-vision-delivery/manifest.json | 46 +++---- .../series/tui-vision-delivery/operation.json | 58 +++++++-- .../series/tui-vision-delivery/order.md | 20 +-- .../series/tui-vision-delivery/receipt.json | 18 +-- .../render-requirements-intake-governance.mjs | 78 +++++++----- .../tuivision-exact.json | 70 +++++----- .../requirements-intake-alignment-tests.mjs | 40 ++++-- ...validate-requirements-intake-alignment.mjs | 115 +++++++---------- .../autonomous-run-state.json | 2 +- .../autonomous-run-state.json | 2 +- .../autonomous-run-state.json | 2 +- .../autonomous-run-state.json | 2 +- .../autonomous-run-state.json | 2 +- .../autonomous-run-state.json | 2 +- .../autonomous-run-state.json | 2 +- .../autonomous-run-state.json | 2 +- .../manifest.json | 120 ++++++++++++++++++ .../receipt.json | 32 +++++ 48 files changed, 696 insertions(+), 337 deletions(-) rename requirements/intakes/{active/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.md => archive/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.038-example-portfolio-conformance-audit.md} (100%) rename requirements/intakes/{active/Lastenheft_22_Wave6-Combined-Delta-Closure.md => archive/Lastenheft_22_Wave6-Combined-Delta-Closure.037-wave6-combined-delta-closure.md} (100%) rename requirements/intakes/{active/Lastenheft_23_Documentation-Publishing-Closure.md => archive/Lastenheft_23_Documentation-Publishing-Closure.043-documentation-publishing-closure.md} (100%) rename requirements/intakes/{active/Lastenheft_Constitution_Change.md => archive/Lastenheft_Constitution_Change.040-constitution-governance-closure.md} (100%) rename requirements/intakes/{active/Lastenheft_Example-Portfolio-Closure.md => archive/Lastenheft_Example-Portfolio-Closure.039-example-portfolio-closure.md} (100%) rename requirements/intakes/{active/Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.md => archive/Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.044-sandbox-secure-development-hardening.md} (100%) rename requirements/intakes/{active/Lastenheft_Source-Reference-Policy.md => archive/Lastenheft_Source-Reference-Policy.041-source-reference-policy.md} (100%) rename requirements/intakes/{active/Lastenheft_Transactional-Form-Model.md => archive/Lastenheft_Transactional-Form-Model.042-transactional-form-model.md} (100%) create mode 100644 specs/intake-series-archive/a73dda7c-163b-4530-97f2-fd9eea5e8986/3fff6099-cd3b-47c1-985b-c816300dd47a/manifest.json create mode 100644 specs/intake-series-archive/a73dda7c-163b-4530-97f2-fd9eea5e8986/3fff6099-cd3b-47c1-985b-c816300dd47a/receipt.json diff --git a/.specify/presets/intake-authoring-governance/README.md b/.specify/presets/intake-authoring-governance/README.md index f2191490..147349fa 100644 --- a/.specify/presets/intake-authoring-governance/README.md +++ b/.specify/presets/intake-authoring-governance/README.md @@ -328,9 +328,10 @@ die hashgebundene Zielmenge des Serienmanifests als aktiven Bestand. Beide Modi berechnen Bestandszahlen; handgepflegte Zaehler sind keine Evidence. Eine aktive Lieferserie hat genau ein `Eligible`-Ziel. Eine `Completed`-Serie -bewahrt ausschließlich abgeschlossene Mitglieder und hat kein `Eligible`-Ziel; -für Mitglieder über aktive und archivierte Ablagen hinweg gilt -`SeriesManifest`. +bewahrt ausschließlich abgeschlossene Mitglieder in der konfigurierten +Archiv-Collection und hat kein `Eligible`-Ziel. `SeriesManifest` erlaubt einer +laufenden Serie, aktive Ziele und bereits archivierte Vorgänger gemeinsam zu +referenzieren. *Version 0.3.0 describes requirements collections with schema 2.0. Documentation language is explicit and independent from implementation @@ -338,8 +339,8 @@ language and locale. Portable roles resolve localized names. Migration is authority-bound, hash-bound, and atomic. `Eligible` selects order but grants no implementation or remote authority. `DirectoryStrict` validates a dedicated active directory; `SeriesManifest` supports established flat or mixed layouts -without trusting manual counts. A completed Series preserves terminal members -without inventing an eligible candidate.* +without trusting manual counts. A completed Series preserves its members in +the configured archive collection without inventing an eligible candidate.* ## Status / Statuspruefung diff --git a/.specify/presets/intake-authoring-governance/docs/man/validate-intake-governance-config.1 b/.specify/presets/intake-authoring-governance/docs/man/validate-intake-governance-config.1 index e5cb803f..e896895c 100644 --- a/.specify/presets/intake-authoring-governance/docs/man/validate-intake-governance-config.1 +++ b/.specify/presets/intake-authoring-governance/docs/man/validate-intake-governance-config.1 @@ -18,8 +18,9 @@ repository. Configured collections report Aligned, MigrationRequired, NeedsClarification, or Blocked. Eligibility is an ordering result and grants no delivery authority. A completed non-empty series is Aligned only when every retained target is -Completed and no target is Eligible. SeriesManifest permits retained members -across active and archive collections. +Completed, stored in the configured archive collection, and no target is +Eligible. SeriesManifest permits an active series to reference active targets +and already archived predecessors together. .SH EXIT STATUS Zero means Aligned or a valid journal. One means migration or clarification is required. Two means blocked or invalid input. diff --git a/.specify/presets/intake-authoring-governance/scripts/validate-intake-governance-config.py b/.specify/presets/intake-authoring-governance/scripts/validate-intake-governance-config.py index 48bd9947..28e0ceb5 100644 --- a/.specify/presets/intake-authoring-governance/scripts/validate-intake-governance-config.py +++ b/.specify/presets/intake-authoring-governance/scripts/validate-intake-governance-config.py @@ -112,6 +112,7 @@ def validate_series_manifest( path: Path, repo: Path, active_dir: Path, + archive_dir: Path, pattern: str, inventory_mode: str, ) -> dict: @@ -126,6 +127,8 @@ def validate_series_manifest( for item in active_dir.iterdir() if item.is_file() and intake_name_matches(item.name, pattern) } + active_prefix = f"{active_dir.relative_to(repo).as_posix().rstrip('/')}/" + archive_prefix = f"{archive_dir.relative_to(repo).as_posix().rstrip('/')}/" target_paths: list[str] = [] target_statuses: dict[str, str] = {} eligible: list[str] = [] @@ -147,6 +150,12 @@ def validate_series_manifest( fail("RIG015", f"hash drift for {target_path}") status = required_text(target, "status", "RIG017") target_statuses[target_path] = status + if not target_path.startswith((active_prefix, archive_prefix)): + fail("RIG017", f"series target is outside active and archive collections: {target_path}") + if status == "Completed" and not target_path.startswith(archive_prefix): + fail("RIG017", f"Completed target must be stored in archive collection: {target_path}") + if status != "Completed" and target_path.startswith(archive_prefix): + fail("RIG017", f"non-completed target must not be stored in archive collection: {target_path}") if status == "Eligible": eligible.append(target_path) @@ -182,7 +191,7 @@ def validate_series_manifest( fail("RIG016", f"dependency {source} -> {target} contradicts order") return { - "activeIntakeCount": len(target_paths), + "activeIntakeCount": sum(target.startswith(active_prefix) for target in target_paths), "seriesTargetCount": len(target_paths), "eligibleCandidate": eligible[0] if eligible else "N/A", "dependencyCount": len(dependencies), @@ -296,6 +305,7 @@ def validate_config(data: dict, repo: Path) -> dict: repo / collections["seriesManifest"], repo, active_dir, + repo / collections["archive"], pattern, inventory_mode, ) diff --git a/.specify/presets/intake-authoring-governance/templates/field-validation-summary.md b/.specify/presets/intake-authoring-governance/templates/field-validation-summary.md index 4207bf5e..ca2fe58d 100644 --- a/.specify/presets/intake-authoring-governance/templates/field-validation-summary.md +++ b/.specify/presets/intake-authoring-governance/templates/field-validation-summary.md @@ -19,10 +19,11 @@ Version: `0.3.1` profiles passed with four portable roles, six collection paths, one canonical index, complete active inventory, current normalized hashes, one `Eligible` candidate for an active delivery series, and zero candidates for - a terminal `Completed` series retained through `SeriesManifest`. Schema 1.0, - ambiguous language, path traversal, duplicate collections, empty manifests, - hash drift, incomplete completed series, and multiple eligible candidates - failed with stable error classes. + a terminal `Completed` series whose members are retained in the configured + archive collection through `SeriesManifest`. Schema 1.0, ambiguous language, + path traversal, duplicate collections, empty manifests, hash drift, + Completed targets in the active collection, incomplete completed series, and + multiple eligible candidates failed with stable error classes. - Eleven-preset development stack: installation, `list`, `info`, `resolve`, disable, enable, remove, and reinstall passed with priorities `10` through `80` and Authoring at `64`. diff --git a/.specify/presets/intake-authoring-governance/tests/test-intake-governance-config.ps1 b/.specify/presets/intake-authoring-governance/tests/test-intake-governance-config.ps1 index 24ff1dbc..812091c0 100644 --- a/.specify/presets/intake-authoring-governance/tests/test-intake-governance-config.ps1 +++ b/.specify/presets/intake-authoring-governance/tests/test-intake-governance-config.ps1 @@ -5,7 +5,8 @@ Set-StrictMode -Version Latest $ErrorActionPreference = 'Stop' $PresetRoot = Split-Path -Parent (Split-Path -Parent $PSCommandPath) -$Validator = Join-Path $PresetRoot 'scripts/validate-intake-governance-config.py' +$BashValidator = Join-Path $PresetRoot 'scripts/validate-intake-governance-config.sh' +$PowerShellValidator = Join-Path $PresetRoot 'scripts/validate-intake-governance-config.ps1' $Root = Join-Path ([System.IO.Path]::GetTempPath()) ("intake-governance-" + [guid]::NewGuid()) New-Item -ItemType Directory -Path $Root | Out-Null @@ -26,13 +27,19 @@ function Get-NormalizedSha256 { function Invoke-Fixture { param([string]$Path, [int]$ExpectedExit, [string]$ExpectedText) - $Output = & python3 $Validator --config $Path --repo $Root --json 2>&1 - $Exit = $LASTEXITCODE - if ($Exit -ne $ExpectedExit) { - throw "Expected exit $ExpectedExit, got ${Exit}: $Output" - } - if (($Output -join "`n") -notmatch [regex]::Escape($ExpectedText)) { - throw "Expected '$ExpectedText': $Output" + $Runs = @( + @{ Name = 'Bash'; Output = @(& bash $BashValidator --config $Path --repo $Root --json 2>&1); Exit = $LASTEXITCODE }, + @{ Name = 'PowerShell'; Output = @(& pwsh -NoProfile -File $PowerShellValidator -Config $Path -Repo $Root -Json 2>&1); Exit = $LASTEXITCODE } + ) + foreach ($Run in $Runs) { + $Output = $Run.Output + $Exit = $Run.Exit + if ($Exit -ne $ExpectedExit) { + throw "$($Run.Name): expected exit $ExpectedExit, got ${Exit}: $Output" + } + if (($Output -join "`n") -notmatch [regex]::Escape($ExpectedText)) { + throw "$($Run.Name): expected '$ExpectedText': $Output" + } } } @@ -139,16 +146,46 @@ try { Set-Content -LiteralPath $ManifestPath -Encoding utf8NoBOM Invoke-Fixture (Write-JsonFixture 'completed-series.json' $ManifestInventory) 0 '"eligibleCandidate": "N/A"' - $CompletedWithEligible = $CompletedManifest.Clone() - $CompletedWithEligible.orderedTargets = @($CompletedManifest.orderedTargets[0].Clone()) - $CompletedWithEligible.orderedTargets[0].status = 'Eligible' + $CompletedInActive = $Manifest.Clone() + $CompletedInActive.status = 'Completed' + $CompletedInActive.orderedTargets = @($Manifest.orderedTargets[0].Clone()) + $CompletedInActive.orderedTargets[0].status = 'Completed' + $CompletedInActive | ConvertTo-Json -Depth 12 | + Set-Content -LiteralPath $ManifestPath -Encoding utf8NoBOM + Invoke-Fixture (Write-JsonFixture 'completed-in-active.json' $ManifestInventory) 2 ` + 'Completed target must be stored in archive collection' + + $MixedManifest = $Manifest.Clone() + $MixedManifest.orderedTargets = @( + $CompletedManifest.orderedTargets[0].Clone(), + $Manifest.orderedTargets[0].Clone() + ) + $MixedManifest.roots = @($MixedManifest.orderedTargets[0].path, $MixedManifest.orderedTargets[1].path) + $MixedManifest | ConvertTo-Json -Depth 12 | + Set-Content -LiteralPath $ManifestPath -Encoding utf8NoBOM + Invoke-Fixture (Write-JsonFixture 'mixed-active-series.json' $ManifestInventory) 0 ` + '"eligibleCandidate": "requirements/intakes/active/Lastenheft_Beispiel.md"' + + $EligibleInArchive = $MixedManifest.Clone() + $EligibleInArchive.orderedTargets = @($CompletedManifest.orderedTargets[0].Clone()) + $EligibleInArchive.orderedTargets[0].status = 'Eligible' + $EligibleInArchive.roots = @($EligibleInArchive.orderedTargets[0].path) + $EligibleInArchive | ConvertTo-Json -Depth 12 | + Set-Content -LiteralPath $ManifestPath -Encoding utf8NoBOM + Invoke-Fixture (Write-JsonFixture 'eligible-in-archive.json' $ManifestInventory) 2 ` + 'non-completed target must not be stored in archive collection' + + $CompletedWithEligible = $Manifest.Clone() + $CompletedWithEligible.status = 'Completed' + $CompletedWithEligible.orderedTargets = @($Manifest.orderedTargets[0].Clone()) $CompletedWithEligible | ConvertTo-Json -Depth 12 | Set-Content -LiteralPath $ManifestPath -Encoding utf8NoBOM Invoke-Fixture (Write-JsonFixture 'completed-with-eligible.json' $ManifestInventory) 2 ` 'Completed series must not contain an Eligible target' - $CompletedWithPending = $CompletedManifest.Clone() - $CompletedWithPending.orderedTargets = @($CompletedManifest.orderedTargets[0].Clone()) + $CompletedWithPending = $Manifest.Clone() + $CompletedWithPending.status = 'Completed' + $CompletedWithPending.orderedTargets = @($Manifest.orderedTargets[0].Clone()) $CompletedWithPending.orderedTargets[0].status = 'Pending' $CompletedWithPending | ConvertTo-Json -Depth 12 | Set-Content -LiteralPath $ManifestPath -Encoding utf8NoBOM diff --git a/.specify/presets/intake-review-governance/docs/man/validate-intake-governance-config.1 b/.specify/presets/intake-review-governance/docs/man/validate-intake-governance-config.1 index 059c7789..3145e050 100644 --- a/.specify/presets/intake-review-governance/docs/man/validate-intake-governance-config.1 +++ b/.specify/presets/intake-review-governance/docs/man/validate-intake-governance-config.1 @@ -18,8 +18,9 @@ repository. Configured collections report Aligned, MigrationRequired, NeedsClarification, or Blocked. Eligibility is an ordering result and grants no delivery authority. A completed non-empty series is Aligned only when every retained target is -Completed and no target is Eligible. SeriesManifest permits retained members -across active and archive collections. +Completed, stored in the configured archive collection, and no target is +Eligible. SeriesManifest permits an active series to reference active targets +and already archived predecessors together. .SH EXIT STATUS Zero means Aligned or a valid journal. One means migration or clarification is required. Two means blocked or invalid input. diff --git a/.specify/presets/intake-review-governance/scripts/validate-intake-governance-config.py b/.specify/presets/intake-review-governance/scripts/validate-intake-governance-config.py index 48bd9947..28e0ceb5 100644 --- a/.specify/presets/intake-review-governance/scripts/validate-intake-governance-config.py +++ b/.specify/presets/intake-review-governance/scripts/validate-intake-governance-config.py @@ -112,6 +112,7 @@ def validate_series_manifest( path: Path, repo: Path, active_dir: Path, + archive_dir: Path, pattern: str, inventory_mode: str, ) -> dict: @@ -126,6 +127,8 @@ def validate_series_manifest( for item in active_dir.iterdir() if item.is_file() and intake_name_matches(item.name, pattern) } + active_prefix = f"{active_dir.relative_to(repo).as_posix().rstrip('/')}/" + archive_prefix = f"{archive_dir.relative_to(repo).as_posix().rstrip('/')}/" target_paths: list[str] = [] target_statuses: dict[str, str] = {} eligible: list[str] = [] @@ -147,6 +150,12 @@ def validate_series_manifest( fail("RIG015", f"hash drift for {target_path}") status = required_text(target, "status", "RIG017") target_statuses[target_path] = status + if not target_path.startswith((active_prefix, archive_prefix)): + fail("RIG017", f"series target is outside active and archive collections: {target_path}") + if status == "Completed" and not target_path.startswith(archive_prefix): + fail("RIG017", f"Completed target must be stored in archive collection: {target_path}") + if status != "Completed" and target_path.startswith(archive_prefix): + fail("RIG017", f"non-completed target must not be stored in archive collection: {target_path}") if status == "Eligible": eligible.append(target_path) @@ -182,7 +191,7 @@ def validate_series_manifest( fail("RIG016", f"dependency {source} -> {target} contradicts order") return { - "activeIntakeCount": len(target_paths), + "activeIntakeCount": sum(target.startswith(active_prefix) for target in target_paths), "seriesTargetCount": len(target_paths), "eligibleCandidate": eligible[0] if eligible else "N/A", "dependencyCount": len(dependencies), @@ -296,6 +305,7 @@ def validate_config(data: dict, repo: Path) -> dict: repo / collections["seriesManifest"], repo, active_dir, + repo / collections["archive"], pattern, inventory_mode, ) diff --git a/.specify/presets/intake-review-governance/templates/agent-file-addendum.md b/.specify/presets/intake-review-governance/templates/agent-file-addendum.md index 1d4cb837..454614f5 100644 --- a/.specify/presets/intake-review-governance/templates/agent-file-addendum.md +++ b/.specify/presets/intake-review-governance/templates/agent-file-addendum.md @@ -15,6 +15,7 @@ Never infer a missing predecessor or silently accept request drift. When schema 2.0 is present, review explicit documentation language, naming profile, portable roles, resolved paths, hashes, receipts, references, and the Series lifecycle. An active delivery series has exactly one evidenced -`Eligible` candidate; a `Completed` series retains only terminal members and -has none. Implementation language and locale are not documentation-language -evidence. A Ready review grants neither implementation nor remote authority. +`Eligible` candidate; a `Completed` series retains only `Completed` members in +the configured archive collection and has none. Implementation language and +locale are not documentation-language evidence. A Ready review grants neither +implementation nor remote authority. diff --git a/.specify/presets/intake-review-governance/templates/intake-review-checklist-template.md b/.specify/presets/intake-review-governance/templates/intake-review-checklist-template.md index 5546d607..ead00815 100644 --- a/.specify/presets/intake-review-governance/templates/intake-review-checklist-template.md +++ b/.specify/presets/intake-review-governance/templates/intake-review-checklist-template.md @@ -24,7 +24,7 @@ index, bounded aliases, and computed inventory agree. - [ ] Every Series member occurs once with a current normalized SHA-256; an active delivery series has exactly one `Eligible` candidate, while a - `Completed` series retains only terminal members and has none. + `Completed` series retains only archived `Completed` members and has none. - [ ] IDs, order, dependency graph, handoffs, and future-scope boundaries are consistent. - [ ] Schema 1.1 binds the repository-relative request path and normalized SHA-256. - [ ] Every target occurs exactly once in `orderedTargetPaths`. diff --git a/.specify/presets/intake-review-governance/templates/intake-review-runbook-template.md b/.specify/presets/intake-review-governance/templates/intake-review-runbook-template.md index f6307a2b..a9ab503f 100644 --- a/.specify/presets/intake-review-governance/templates/intake-review-runbook-template.md +++ b/.specify/presets/intake-review-governance/templates/intake-review-runbook-template.md @@ -56,8 +56,9 @@ before semantic review. The explicit BCP-47 documentation language, naming profile, four portable roles, collection paths, bounded aliases, canonical index, current hashes, and Series inventory must agree. An active delivery series has exactly one evidenced `Eligible` candidate. A `Completed` series -retains only terminal members and has none. Eligibility selects the next intake -but grants no implementation or remote-delivery authority. +retains only `Completed` members in the configured archive collection and has +none. Eligibility selects the next intake but grants no implementation or +remote-delivery authority. ## Consumer Contract diff --git a/.specify/presets/intake-review-governance/tests/test-intake-governance-config.ps1 b/.specify/presets/intake-review-governance/tests/test-intake-governance-config.ps1 index 24ff1dbc..812091c0 100644 --- a/.specify/presets/intake-review-governance/tests/test-intake-governance-config.ps1 +++ b/.specify/presets/intake-review-governance/tests/test-intake-governance-config.ps1 @@ -5,7 +5,8 @@ Set-StrictMode -Version Latest $ErrorActionPreference = 'Stop' $PresetRoot = Split-Path -Parent (Split-Path -Parent $PSCommandPath) -$Validator = Join-Path $PresetRoot 'scripts/validate-intake-governance-config.py' +$BashValidator = Join-Path $PresetRoot 'scripts/validate-intake-governance-config.sh' +$PowerShellValidator = Join-Path $PresetRoot 'scripts/validate-intake-governance-config.ps1' $Root = Join-Path ([System.IO.Path]::GetTempPath()) ("intake-governance-" + [guid]::NewGuid()) New-Item -ItemType Directory -Path $Root | Out-Null @@ -26,13 +27,19 @@ function Get-NormalizedSha256 { function Invoke-Fixture { param([string]$Path, [int]$ExpectedExit, [string]$ExpectedText) - $Output = & python3 $Validator --config $Path --repo $Root --json 2>&1 - $Exit = $LASTEXITCODE - if ($Exit -ne $ExpectedExit) { - throw "Expected exit $ExpectedExit, got ${Exit}: $Output" - } - if (($Output -join "`n") -notmatch [regex]::Escape($ExpectedText)) { - throw "Expected '$ExpectedText': $Output" + $Runs = @( + @{ Name = 'Bash'; Output = @(& bash $BashValidator --config $Path --repo $Root --json 2>&1); Exit = $LASTEXITCODE }, + @{ Name = 'PowerShell'; Output = @(& pwsh -NoProfile -File $PowerShellValidator -Config $Path -Repo $Root -Json 2>&1); Exit = $LASTEXITCODE } + ) + foreach ($Run in $Runs) { + $Output = $Run.Output + $Exit = $Run.Exit + if ($Exit -ne $ExpectedExit) { + throw "$($Run.Name): expected exit $ExpectedExit, got ${Exit}: $Output" + } + if (($Output -join "`n") -notmatch [regex]::Escape($ExpectedText)) { + throw "$($Run.Name): expected '$ExpectedText': $Output" + } } } @@ -139,16 +146,46 @@ try { Set-Content -LiteralPath $ManifestPath -Encoding utf8NoBOM Invoke-Fixture (Write-JsonFixture 'completed-series.json' $ManifestInventory) 0 '"eligibleCandidate": "N/A"' - $CompletedWithEligible = $CompletedManifest.Clone() - $CompletedWithEligible.orderedTargets = @($CompletedManifest.orderedTargets[0].Clone()) - $CompletedWithEligible.orderedTargets[0].status = 'Eligible' + $CompletedInActive = $Manifest.Clone() + $CompletedInActive.status = 'Completed' + $CompletedInActive.orderedTargets = @($Manifest.orderedTargets[0].Clone()) + $CompletedInActive.orderedTargets[0].status = 'Completed' + $CompletedInActive | ConvertTo-Json -Depth 12 | + Set-Content -LiteralPath $ManifestPath -Encoding utf8NoBOM + Invoke-Fixture (Write-JsonFixture 'completed-in-active.json' $ManifestInventory) 2 ` + 'Completed target must be stored in archive collection' + + $MixedManifest = $Manifest.Clone() + $MixedManifest.orderedTargets = @( + $CompletedManifest.orderedTargets[0].Clone(), + $Manifest.orderedTargets[0].Clone() + ) + $MixedManifest.roots = @($MixedManifest.orderedTargets[0].path, $MixedManifest.orderedTargets[1].path) + $MixedManifest | ConvertTo-Json -Depth 12 | + Set-Content -LiteralPath $ManifestPath -Encoding utf8NoBOM + Invoke-Fixture (Write-JsonFixture 'mixed-active-series.json' $ManifestInventory) 0 ` + '"eligibleCandidate": "requirements/intakes/active/Lastenheft_Beispiel.md"' + + $EligibleInArchive = $MixedManifest.Clone() + $EligibleInArchive.orderedTargets = @($CompletedManifest.orderedTargets[0].Clone()) + $EligibleInArchive.orderedTargets[0].status = 'Eligible' + $EligibleInArchive.roots = @($EligibleInArchive.orderedTargets[0].path) + $EligibleInArchive | ConvertTo-Json -Depth 12 | + Set-Content -LiteralPath $ManifestPath -Encoding utf8NoBOM + Invoke-Fixture (Write-JsonFixture 'eligible-in-archive.json' $ManifestInventory) 2 ` + 'non-completed target must not be stored in archive collection' + + $CompletedWithEligible = $Manifest.Clone() + $CompletedWithEligible.status = 'Completed' + $CompletedWithEligible.orderedTargets = @($Manifest.orderedTargets[0].Clone()) $CompletedWithEligible | ConvertTo-Json -Depth 12 | Set-Content -LiteralPath $ManifestPath -Encoding utf8NoBOM Invoke-Fixture (Write-JsonFixture 'completed-with-eligible.json' $ManifestInventory) 2 ` 'Completed series must not contain an Eligible target' - $CompletedWithPending = $CompletedManifest.Clone() - $CompletedWithPending.orderedTargets = @($CompletedManifest.orderedTargets[0].Clone()) + $CompletedWithPending = $Manifest.Clone() + $CompletedWithPending.status = 'Completed' + $CompletedWithPending.orderedTargets = @($Manifest.orderedTargets[0].Clone()) $CompletedWithPending.orderedTargets[0].status = 'Pending' $CompletedWithPending | ConvertTo-Json -Depth 12 | Set-Content -LiteralPath $ManifestPath -Encoding utf8NoBOM diff --git a/.specify/presets/intake-sequencing-governance/README.md b/.specify/presets/intake-sequencing-governance/README.md index 2a47a5f9..f2eee668 100644 --- a/.specify/presets/intake-sequencing-governance/README.md +++ b/.specify/presets/intake-sequencing-governance/README.md @@ -100,10 +100,11 @@ requirements migration must finish before existing roots are released. Under schema 2.0, target paths are resolved from portable roles and collection paths. An active delivery series has exactly one explicit `Eligible` target; that state selects order only and grants no implementation or remote authority. A -`Completed` series preserves its terminal members and has no eligible target. +`Completed` series preserves its members in the configured archive collection +and has no eligible target. A valid `Idle` series has neither members nor an eligible target. *Eine aktive Lieferserie hat genau ein `Eligible`-Ziel. Eine abgeschlossene -Serie bewahrt ihre abgeschlossenen Mitglieder, hat aber kein ausführbares Ziel. -`Idle` bleibt ausschließlich der leere Zustand. Aus `Eligible` entstehen keine -Lieferrechte.* +Serie bewahrt ihre abgeschlossenen Mitglieder in der konfigurierten +Archiv-Collection, hat aber kein ausführbares Ziel. `Idle` bleibt ausschließlich +der leere Zustand. Aus `Eligible` entstehen keine Lieferrechte.* diff --git a/.specify/presets/intake-sequencing-governance/docs/field-validation-summary.md b/.specify/presets/intake-sequencing-governance/docs/field-validation-summary.md index 12f65459..589aff9d 100644 --- a/.specify/presets/intake-sequencing-governance/docs/field-validation-summary.md +++ b/.specify/presets/intake-sequencing-governance/docs/field-validation-summary.md @@ -5,8 +5,9 @@ Version `0.2.3` is validated with: - a synthetic three-target, one-root, two-edge series; - an explicit zero-target `Idle` series; - negative fixtures for `Idle` with content and non-idle without targets; -- a retained `Completed` series with zero eligible targets under - `SeriesManifest`, plus negative eligible and pending terminal fixtures; +- a retained `Completed` series with archived members and zero eligible targets + under `SeriesManifest`, plus negative active-Completed, archived-Eligible, + eligible, and pending terminal fixtures; - a nested Git repository whose canonical index is excluded from the parent uniqueness check, plus a blocking ordinary duplicate-directory fixture; - malformed path, type, binding, order, root, lifecycle, and hash fixtures; diff --git a/.specify/presets/intake-sequencing-governance/docs/man/validate-intake-governance-config.1 b/.specify/presets/intake-sequencing-governance/docs/man/validate-intake-governance-config.1 index cba3f94f..457a74b8 100644 --- a/.specify/presets/intake-sequencing-governance/docs/man/validate-intake-governance-config.1 +++ b/.specify/presets/intake-sequencing-governance/docs/man/validate-intake-governance-config.1 @@ -21,8 +21,9 @@ An Idle series is Aligned only when it contains no targets, roots, or dependencies and therefore has no eligible candidate. .PP A completed non-empty series is Aligned only when every retained target is -Completed and no target is Eligible. SeriesManifest permits retained members -across active and archive collections. +Completed, stored in the configured archive collection, and no target is +Eligible. SeriesManifest permits an active series to reference active targets +and already archived predecessors together. .PP Canonical-index uniqueness follows Git repository boundaries. An index in a nested Git checkout belongs to that checkout; an ordinary duplicate index diff --git a/.specify/presets/intake-sequencing-governance/scripts/validate-intake-governance-config.py b/.specify/presets/intake-sequencing-governance/scripts/validate-intake-governance-config.py index 82a1ae8a..1a84b28f 100644 --- a/.specify/presets/intake-sequencing-governance/scripts/validate-intake-governance-config.py +++ b/.specify/presets/intake-sequencing-governance/scripts/validate-intake-governance-config.py @@ -124,6 +124,7 @@ def validate_series_manifest( path: Path, repo: Path, active_dir: Path, + archive_dir: Path, pattern: str, inventory_mode: str, ) -> dict: @@ -149,6 +150,8 @@ def validate_series_manifest( for item in active_dir.iterdir() if item.is_file() and intake_name_matches(item.name, pattern) } + active_prefix = f"{active_dir.relative_to(repo).as_posix().rstrip('/')}/" + archive_prefix = f"{archive_dir.relative_to(repo).as_posix().rstrip('/')}/" target_paths: list[str] = [] target_statuses: dict[str, str] = {} eligible: list[str] = [] @@ -170,6 +173,12 @@ def validate_series_manifest( fail("RIG015", f"hash drift for {target_path}") status = required_text(target, "status", "RIG017") target_statuses[target_path] = status + if not target_path.startswith((active_prefix, archive_prefix)): + fail("RIG017", f"series target is outside active and archive collections: {target_path}") + if status == "Completed" and not target_path.startswith(archive_prefix): + fail("RIG017", f"Completed target must be stored in archive collection: {target_path}") + if status != "Completed" and target_path.startswith(archive_prefix): + fail("RIG017", f"non-completed target must not be stored in archive collection: {target_path}") if status == "Eligible": eligible.append(target_path) @@ -205,7 +214,7 @@ def validate_series_manifest( fail("RIG016", f"dependency {source} -> {target} contradicts order") return { - "activeIntakeCount": len(target_paths), + "activeIntakeCount": sum(target.startswith(active_prefix) for target in target_paths), "seriesTargetCount": len(target_paths), "eligibleCandidate": eligible[0] if eligible else "N/A", "dependencyCount": len(dependencies), @@ -319,6 +328,7 @@ def validate_config(data: dict, repo: Path) -> dict: repo / collections["seriesManifest"], repo, active_dir, + repo / collections["archive"], pattern, inventory_mode, ) diff --git a/.specify/presets/intake-sequencing-governance/templates/agent-file-addendum.md b/.specify/presets/intake-sequencing-governance/templates/agent-file-addendum.md index 58687569..f68d1e03 100644 --- a/.specify/presets/intake-sequencing-governance/templates/agent-file-addendum.md +++ b/.specify/presets/intake-sequencing-governance/templates/agent-file-addendum.md @@ -14,8 +14,9 @@ and applicable WCAG 2.2 AA. When schema 2.0 is configured, resolve target paths through portable roles and collection paths before validating order. `RequirementsGovernanceGate` is a binding predecessor. An active delivery series has exactly one evidenced -`Eligible` candidate; a `Completed` series retains only terminal members and -has none. Eligibility never grants implementation or remote authority. +`Eligible` candidate; a `Completed` series retains only `Completed` members in +the configured archive collection and has none. Eligibility never grants +implementation or remote authority. Represent a repository without an active intake as `Idle` with zero targets, roots, and dependencies. Do not create a placeholder intake. Explain the idle diff --git a/.specify/presets/intake-sequencing-governance/templates/intake-series-checklist-template.md b/.specify/presets/intake-sequencing-governance/templates/intake-series-checklist-template.md index e242a950..2464cded 100644 --- a/.specify/presets/intake-sequencing-governance/templates/intake-series-checklist-template.md +++ b/.specify/presets/intake-sequencing-governance/templates/intake-series-checklist-template.md @@ -10,7 +10,7 @@ must complete before the dependent intake becomes eligible. - [ ] An active delivery series has exactly one current `Eligible` target; eligibility grants no delivery authority. -- [ ] A `Completed` series retains only `Completed` targets and has no +- [ ] A `Completed` series retains only archived `Completed` targets and has no `Eligible` target. - [ ] An `Idle` series has zero targets, roots, dependencies, and eligible candidates. diff --git a/.specify/presets/intake-sequencing-governance/templates/intake-series-runbook-template.md b/.specify/presets/intake-sequencing-governance/templates/intake-series-runbook-template.md index ba9e75ec..e37e29e2 100644 --- a/.specify/presets/intake-sequencing-governance/templates/intake-series-runbook-template.md +++ b/.specify/presets/intake-sequencing-governance/templates/intake-series-runbook-template.md @@ -29,8 +29,9 @@ through `requirements/intake-governance-config.json`. Treat `RequirementsGovernanceGate` as a binding predecessor edge. Require exactly one evidenced `Eligible` target for an active delivery series, but never interpret eligibility as implementation, remote-delivery, bypass, or follow-on authority. -A `Completed` series retains its terminal members and requires zero eligible -targets. Use `SeriesManifest` when those members span active and archive roots. +A `Completed` series retains its terminal members in the configured archive +collection and requires zero eligible targets. Use `SeriesManifest` while an +active series spans active targets and already archived predecessors. If the repository has no active intake of its own, use `status: "Idle"` with empty `orderedTargets`, `roots`, and `dependencies`. Status and next must report diff --git a/.specify/presets/intake-sequencing-governance/tests/test-intake-governance-config.ps1 b/.specify/presets/intake-sequencing-governance/tests/test-intake-governance-config.ps1 index 07648ec0..6febccf9 100644 --- a/.specify/presets/intake-sequencing-governance/tests/test-intake-governance-config.ps1 +++ b/.specify/presets/intake-sequencing-governance/tests/test-intake-governance-config.ps1 @@ -5,7 +5,8 @@ Set-StrictMode -Version Latest $ErrorActionPreference = 'Stop' $PresetRoot = Split-Path -Parent (Split-Path -Parent $PSCommandPath) -$Validator = Join-Path $PresetRoot 'scripts/validate-intake-governance-config.py' +$BashValidator = Join-Path $PresetRoot 'scripts/validate-intake-governance-config.sh' +$PowerShellValidator = Join-Path $PresetRoot 'scripts/validate-intake-governance-config.ps1' $Root = Join-Path ([System.IO.Path]::GetTempPath()) ("intake-governance-" + [guid]::NewGuid()) New-Item -ItemType Directory -Path $Root | Out-Null @@ -26,13 +27,19 @@ function Get-NormalizedSha256 { function Invoke-Fixture { param([string]$Path, [int]$ExpectedExit, [string]$ExpectedText) - $Output = & python3 $Validator --config $Path --repo $Root --json 2>&1 - $Exit = $LASTEXITCODE - if ($Exit -ne $ExpectedExit) { - throw "Expected exit $ExpectedExit, got ${Exit}: $Output" - } - if (($Output -join "`n") -notmatch [regex]::Escape($ExpectedText)) { - throw "Expected '$ExpectedText': $Output" + $Runs = @( + @{ Name = 'Bash'; Output = @(& bash $BashValidator --config $Path --repo $Root --json 2>&1); Exit = $LASTEXITCODE }, + @{ Name = 'PowerShell'; Output = @(& pwsh -NoProfile -File $PowerShellValidator -Config $Path -Repo $Root -Json 2>&1); Exit = $LASTEXITCODE } + ) + foreach ($Run in $Runs) { + $Output = $Run.Output + $Exit = $Run.Exit + if ($Exit -ne $ExpectedExit) { + throw "$($Run.Name): expected exit $ExpectedExit, got ${Exit}: $Output" + } + if (($Output -join "`n") -notmatch [regex]::Escape($ExpectedText)) { + throw "$($Run.Name): expected '$ExpectedText': $Output" + } } } @@ -179,16 +186,46 @@ try { Set-Content -LiteralPath $ManifestPath -Encoding utf8NoBOM Invoke-Fixture (Write-JsonFixture 'completed-series.json' $ManifestInventory) 0 '"eligibleCandidate": "N/A"' - $CompletedWithEligible = $CompletedManifest.Clone() - $CompletedWithEligible.orderedTargets = @($CompletedManifest.orderedTargets[0].Clone()) - $CompletedWithEligible.orderedTargets[0].status = 'Eligible' + $CompletedInActive = $Manifest.Clone() + $CompletedInActive.status = 'Completed' + $CompletedInActive.orderedTargets = @($Manifest.orderedTargets[0].Clone()) + $CompletedInActive.orderedTargets[0].status = 'Completed' + $CompletedInActive | ConvertTo-Json -Depth 12 | + Set-Content -LiteralPath $ManifestPath -Encoding utf8NoBOM + Invoke-Fixture (Write-JsonFixture 'completed-in-active.json' $ManifestInventory) 2 ` + 'Completed target must be stored in archive collection' + + $MixedManifest = $Manifest.Clone() + $MixedManifest.orderedTargets = @( + $CompletedManifest.orderedTargets[0].Clone(), + $Manifest.orderedTargets[0].Clone() + ) + $MixedManifest.roots = @($MixedManifest.orderedTargets[0].path, $MixedManifest.orderedTargets[1].path) + $MixedManifest | ConvertTo-Json -Depth 12 | + Set-Content -LiteralPath $ManifestPath -Encoding utf8NoBOM + Invoke-Fixture (Write-JsonFixture 'mixed-active-series.json' $ManifestInventory) 0 ` + '"eligibleCandidate": "requirements/intakes/active/Lastenheft_Beispiel.md"' + + $EligibleInArchive = $MixedManifest.Clone() + $EligibleInArchive.orderedTargets = @($CompletedManifest.orderedTargets[0].Clone()) + $EligibleInArchive.orderedTargets[0].status = 'Eligible' + $EligibleInArchive.roots = @($EligibleInArchive.orderedTargets[0].path) + $EligibleInArchive | ConvertTo-Json -Depth 12 | + Set-Content -LiteralPath $ManifestPath -Encoding utf8NoBOM + Invoke-Fixture (Write-JsonFixture 'eligible-in-archive.json' $ManifestInventory) 2 ` + 'non-completed target must not be stored in archive collection' + + $CompletedWithEligible = $Manifest.Clone() + $CompletedWithEligible.status = 'Completed' + $CompletedWithEligible.orderedTargets = @($Manifest.orderedTargets[0].Clone()) $CompletedWithEligible | ConvertTo-Json -Depth 12 | Set-Content -LiteralPath $ManifestPath -Encoding utf8NoBOM Invoke-Fixture (Write-JsonFixture 'completed-with-eligible.json' $ManifestInventory) 2 ` 'Completed series must not contain an Eligible target' - $CompletedWithPending = $CompletedManifest.Clone() - $CompletedWithPending.orderedTargets = @($CompletedManifest.orderedTargets[0].Clone()) + $CompletedWithPending = $Manifest.Clone() + $CompletedWithPending.status = 'Completed' + $CompletedWithPending.orderedTargets = @($Manifest.orderedTargets[0].Clone()) $CompletedWithPending.orderedTargets[0].status = 'Pending' $CompletedWithPending | ConvertTo-Json -Depth 12 | Set-Content -LiteralPath $ManifestPath -Encoding utf8NoBOM diff --git a/Lastenheft_Abarbeitungsreihenfolge.md b/Lastenheft_Abarbeitungsreihenfolge.md index db28afd3..1dd56d82 100644 --- a/Lastenheft_Abarbeitungsreihenfolge.md +++ b/Lastenheft_Abarbeitungsreihenfolge.md @@ -9,20 +9,20 @@ T056-locked evidence. It does not start a feature run.* ## Verlinkter Ausführungsnachweis / Linked Execution Evidence -- Manifest SHA-256: `6c086db5c8ed9cd33e221210e68edd99546efb9acbe098d863fb18201ffb5ae9` -- Projektions-SHA-256: `ee742b9d641546faf154e1aa27a98b14029ada3d120892d4590449aaab65efb7` +- Manifest SHA-256: `268a3d3e37e279127f0fcfc099e7761df0443dc4c9625392a70441c619bdf894` +- Projektions-SHA-256: `d788797f3dd4cee8dfa2e5ebd619810be17fb63944b9dbbbf10c496dff8d1e3b` - Umfang: `10` Serienzuordnungen, `6` unveränderte Abhängigkeiten | Position | Intake | Status | Spec-Kit-Feature | Direkte eingehende Abhängigkeiten | |---:|---|---|---|---| -| 1 | [Lastenheft_22_Wave6-Combined-Delta-Closure.md](requirements/intakes/active/Lastenheft_22_Wave6-Combined-Delta-Closure.md) | `Completed` | [037-wave6-combined-delta-closure](specs/037-wave6-combined-delta-closure/) | — | -| 2 | [Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.md](requirements/intakes/active/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.md) | `Completed` | [038-example-portfolio-conformance-audit](specs/038-example-portfolio-conformance-audit/) | [Lastenheft_22_Wave6-Combined-Delta-Closure.md](requirements/intakes/active/Lastenheft_22_Wave6-Combined-Delta-Closure.md) · `HardCompletionGate` · binding=`true` | -| 3 | [Lastenheft_Example-Portfolio-Closure.md](requirements/intakes/active/Lastenheft_Example-Portfolio-Closure.md) | `Completed` | [039-example-portfolio-closure](specs/039-example-portfolio-closure/) | [Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.md](requirements/intakes/active/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.md) · `HardCompletionGate` · binding=`true` | -| 4 | [Lastenheft_Constitution_Change.md](requirements/intakes/active/Lastenheft_Constitution_Change.md) | `Completed` | [040-constitution-governance-closure](specs/040-constitution-governance-closure/) | — | -| 5 | [Lastenheft_Source-Reference-Policy.md](requirements/intakes/active/Lastenheft_Source-Reference-Policy.md) | `Completed` | [041-source-reference-policy](specs/041-source-reference-policy/) | [Lastenheft_Constitution_Change.md](requirements/intakes/active/Lastenheft_Constitution_Change.md) · `SharedWriterSerialization` · binding=`false` | -| 6 | [Lastenheft_Transactional-Form-Model.md](requirements/intakes/active/Lastenheft_Transactional-Form-Model.md) | `Completed` | [042-transactional-form-model](specs/042-transactional-form-model/) | [Lastenheft_Source-Reference-Policy.md](requirements/intakes/active/Lastenheft_Source-Reference-Policy.md) · `HardCompletionGate` · binding=`true`
[Lastenheft_Example-Portfolio-Closure.md](requirements/intakes/active/Lastenheft_Example-Portfolio-Closure.md) · `HardCompletionGate` · binding=`true` | -| 7 | [Lastenheft_23_Documentation-Publishing-Closure.md](requirements/intakes/active/Lastenheft_23_Documentation-Publishing-Closure.md) | `Completed` | [043-documentation-publishing-closure](specs/043-documentation-publishing-closure/) | [Lastenheft_Transactional-Form-Model.md](requirements/intakes/active/Lastenheft_Transactional-Form-Model.md) · `PreferredSerialOrder` · binding=`false` | -| 8 | [Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.md](requirements/intakes/active/Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.md) | `Completed` | [044-sandbox-secure-development-hardening](specs/044-sandbox-secure-development-hardening/) | — | +| 1 | [Lastenheft_22_Wave6-Combined-Delta-Closure.037-wave6-combined-delta-closure.md](requirements/intakes/archive/Lastenheft_22_Wave6-Combined-Delta-Closure.037-wave6-combined-delta-closure.md) | `Completed` | [037-wave6-combined-delta-closure](specs/037-wave6-combined-delta-closure/) | — | +| 2 | [Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.038-example-portfolio-conformance-audit.md](requirements/intakes/archive/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.038-example-portfolio-conformance-audit.md) | `Completed` | [038-example-portfolio-conformance-audit](specs/038-example-portfolio-conformance-audit/) | [Lastenheft_22_Wave6-Combined-Delta-Closure.037-wave6-combined-delta-closure.md](requirements/intakes/archive/Lastenheft_22_Wave6-Combined-Delta-Closure.037-wave6-combined-delta-closure.md) · `HardCompletionGate` · binding=`true` | +| 3 | [Lastenheft_Example-Portfolio-Closure.039-example-portfolio-closure.md](requirements/intakes/archive/Lastenheft_Example-Portfolio-Closure.039-example-portfolio-closure.md) | `Completed` | [039-example-portfolio-closure](specs/039-example-portfolio-closure/) | [Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.038-example-portfolio-conformance-audit.md](requirements/intakes/archive/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.038-example-portfolio-conformance-audit.md) · `HardCompletionGate` · binding=`true` | +| 4 | [Lastenheft_Constitution_Change.040-constitution-governance-closure.md](requirements/intakes/archive/Lastenheft_Constitution_Change.040-constitution-governance-closure.md) | `Completed` | [040-constitution-governance-closure](specs/040-constitution-governance-closure/) | — | +| 5 | [Lastenheft_Source-Reference-Policy.041-source-reference-policy.md](requirements/intakes/archive/Lastenheft_Source-Reference-Policy.041-source-reference-policy.md) | `Completed` | [041-source-reference-policy](specs/041-source-reference-policy/) | [Lastenheft_Constitution_Change.040-constitution-governance-closure.md](requirements/intakes/archive/Lastenheft_Constitution_Change.040-constitution-governance-closure.md) · `SharedWriterSerialization` · binding=`false` | +| 6 | [Lastenheft_Transactional-Form-Model.042-transactional-form-model.md](requirements/intakes/archive/Lastenheft_Transactional-Form-Model.042-transactional-form-model.md) | `Completed` | [042-transactional-form-model](specs/042-transactional-form-model/) | [Lastenheft_Source-Reference-Policy.041-source-reference-policy.md](requirements/intakes/archive/Lastenheft_Source-Reference-Policy.041-source-reference-policy.md) · `HardCompletionGate` · binding=`true`
[Lastenheft_Example-Portfolio-Closure.039-example-portfolio-closure.md](requirements/intakes/archive/Lastenheft_Example-Portfolio-Closure.039-example-portfolio-closure.md) · `HardCompletionGate` · binding=`true` | +| 7 | [Lastenheft_23_Documentation-Publishing-Closure.043-documentation-publishing-closure.md](requirements/intakes/archive/Lastenheft_23_Documentation-Publishing-Closure.043-documentation-publishing-closure.md) | `Completed` | [043-documentation-publishing-closure](specs/043-documentation-publishing-closure/) | [Lastenheft_Transactional-Form-Model.042-transactional-form-model.md](requirements/intakes/archive/Lastenheft_Transactional-Form-Model.042-transactional-form-model.md) · `PreferredSerialOrder` · binding=`false` | +| 8 | [Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.044-sandbox-secure-development-hardening.md](requirements/intakes/archive/Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.044-sandbox-secure-development-hardening.md) | `Completed` | [044-sandbox-secure-development-hardening](specs/044-sandbox-secure-development-hardening/) | — | | 9 | [Lastenheft_RL-SE-Checklist-Selbstpruefung.045-rl-se-checklist-self-review.md](requirements/intakes/archive/Lastenheft_RL-SE-Checklist-Selbstpruefung.045-rl-se-checklist-self-review.md) | `Completed` | [045-rl-se-checklist-self-review](specs/045-rl-se-checklist-self-review/) | — | | 10 | [Lastenheft_GSDB-Spec-Kit-Intensivpruefung.046-gsdb-spec-kit-intensive-review.md](requirements/intakes/archive/Lastenheft_GSDB-Spec-Kit-Intensivpruefung.046-gsdb-spec-kit-intensive-review.md) | `Completed` | [046-gsdb-spec-kit-intensive-review](specs/046-gsdb-spec-kit-intensive-review/) | — | diff --git a/requirements/intakes/active/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.md b/requirements/intakes/archive/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.038-example-portfolio-conformance-audit.md similarity index 100% rename from requirements/intakes/active/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.md rename to requirements/intakes/archive/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.038-example-portfolio-conformance-audit.md diff --git a/requirements/intakes/active/Lastenheft_22_Wave6-Combined-Delta-Closure.md b/requirements/intakes/archive/Lastenheft_22_Wave6-Combined-Delta-Closure.037-wave6-combined-delta-closure.md similarity index 100% rename from requirements/intakes/active/Lastenheft_22_Wave6-Combined-Delta-Closure.md rename to requirements/intakes/archive/Lastenheft_22_Wave6-Combined-Delta-Closure.037-wave6-combined-delta-closure.md diff --git a/requirements/intakes/active/Lastenheft_23_Documentation-Publishing-Closure.md b/requirements/intakes/archive/Lastenheft_23_Documentation-Publishing-Closure.043-documentation-publishing-closure.md similarity index 100% rename from requirements/intakes/active/Lastenheft_23_Documentation-Publishing-Closure.md rename to requirements/intakes/archive/Lastenheft_23_Documentation-Publishing-Closure.043-documentation-publishing-closure.md diff --git a/requirements/intakes/active/Lastenheft_Constitution_Change.md b/requirements/intakes/archive/Lastenheft_Constitution_Change.040-constitution-governance-closure.md similarity index 100% rename from requirements/intakes/active/Lastenheft_Constitution_Change.md rename to requirements/intakes/archive/Lastenheft_Constitution_Change.040-constitution-governance-closure.md diff --git a/requirements/intakes/active/Lastenheft_Example-Portfolio-Closure.md b/requirements/intakes/archive/Lastenheft_Example-Portfolio-Closure.039-example-portfolio-closure.md similarity index 100% rename from requirements/intakes/active/Lastenheft_Example-Portfolio-Closure.md rename to requirements/intakes/archive/Lastenheft_Example-Portfolio-Closure.039-example-portfolio-closure.md diff --git a/requirements/intakes/active/Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.md b/requirements/intakes/archive/Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.044-sandbox-secure-development-hardening.md similarity index 100% rename from requirements/intakes/active/Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.md rename to requirements/intakes/archive/Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.044-sandbox-secure-development-hardening.md diff --git a/requirements/intakes/active/Lastenheft_Source-Reference-Policy.md b/requirements/intakes/archive/Lastenheft_Source-Reference-Policy.041-source-reference-policy.md similarity index 100% rename from requirements/intakes/active/Lastenheft_Source-Reference-Policy.md rename to requirements/intakes/archive/Lastenheft_Source-Reference-Policy.041-source-reference-policy.md diff --git a/requirements/intakes/active/Lastenheft_Transactional-Form-Model.md b/requirements/intakes/archive/Lastenheft_Transactional-Form-Model.042-transactional-form-model.md similarity index 100% rename from requirements/intakes/active/Lastenheft_Transactional-Form-Model.md rename to requirements/intakes/archive/Lastenheft_Transactional-Form-Model.042-transactional-form-model.md diff --git a/requirements/intakes/series/tui-vision-delivery/intake-review-request.json b/requirements/intakes/series/tui-vision-delivery/intake-review-request.json index 5aacf1c2..386c9e0b 100644 --- a/requirements/intakes/series/tui-vision-delivery/intake-review-request.json +++ b/requirements/intakes/series/tui-vision-delivery/intake-review-request.json @@ -5,35 +5,35 @@ "policy": "tui-vision-lastenheft", "targets": [ { - "path": "requirements/intakes/active/Lastenheft_22_Wave6-Combined-Delta-Closure.md", + "path": "requirements/intakes/archive/Lastenheft_22_Wave6-Combined-Delta-Closure.037-wave6-combined-delta-closure.md", "role": "OrderedMember" }, { - "path": "requirements/intakes/active/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.md", + "path": "requirements/intakes/archive/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.038-example-portfolio-conformance-audit.md", "role": "OrderedMember" }, { - "path": "requirements/intakes/active/Lastenheft_Example-Portfolio-Closure.md", + "path": "requirements/intakes/archive/Lastenheft_Example-Portfolio-Closure.039-example-portfolio-closure.md", "role": "Primary" }, { - "path": "requirements/intakes/active/Lastenheft_Constitution_Change.md", + "path": "requirements/intakes/archive/Lastenheft_Constitution_Change.040-constitution-governance-closure.md", "role": "OrderedMember" }, { - "path": "requirements/intakes/active/Lastenheft_Source-Reference-Policy.md", + "path": "requirements/intakes/archive/Lastenheft_Source-Reference-Policy.041-source-reference-policy.md", "role": "OrderedMember" }, { - "path": "requirements/intakes/active/Lastenheft_Transactional-Form-Model.md", + "path": "requirements/intakes/archive/Lastenheft_Transactional-Form-Model.042-transactional-form-model.md", "role": "OrderedMember" }, { - "path": "requirements/intakes/active/Lastenheft_23_Documentation-Publishing-Closure.md", + "path": "requirements/intakes/archive/Lastenheft_23_Documentation-Publishing-Closure.043-documentation-publishing-closure.md", "role": "OrderedMember" }, { - "path": "requirements/intakes/active/Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.md", + "path": "requirements/intakes/archive/Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.044-sandbox-secure-development-hardening.md", "role": "OrderedMember" }, { @@ -47,53 +47,53 @@ ], "series": { "orderedTargetPaths": [ - "requirements/intakes/active/Lastenheft_22_Wave6-Combined-Delta-Closure.md", - "requirements/intakes/active/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.md", - "requirements/intakes/active/Lastenheft_Example-Portfolio-Closure.md", - "requirements/intakes/active/Lastenheft_Constitution_Change.md", - "requirements/intakes/active/Lastenheft_Source-Reference-Policy.md", - "requirements/intakes/active/Lastenheft_Transactional-Form-Model.md", - "requirements/intakes/active/Lastenheft_23_Documentation-Publishing-Closure.md", - "requirements/intakes/active/Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.md", + "requirements/intakes/archive/Lastenheft_22_Wave6-Combined-Delta-Closure.037-wave6-combined-delta-closure.md", + "requirements/intakes/archive/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.038-example-portfolio-conformance-audit.md", + "requirements/intakes/archive/Lastenheft_Example-Portfolio-Closure.039-example-portfolio-closure.md", + "requirements/intakes/archive/Lastenheft_Constitution_Change.040-constitution-governance-closure.md", + "requirements/intakes/archive/Lastenheft_Source-Reference-Policy.041-source-reference-policy.md", + "requirements/intakes/archive/Lastenheft_Transactional-Form-Model.042-transactional-form-model.md", + "requirements/intakes/archive/Lastenheft_23_Documentation-Publishing-Closure.043-documentation-publishing-closure.md", + "requirements/intakes/archive/Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.044-sandbox-secure-development-hardening.md", "requirements/intakes/archive/Lastenheft_RL-SE-Checklist-Selbstpruefung.045-rl-se-checklist-self-review.md", "requirements/intakes/archive/Lastenheft_GSDB-Spec-Kit-Intensivpruefung.046-gsdb-spec-kit-intensive-review.md" ], "roots": [ - "requirements/intakes/active/Lastenheft_22_Wave6-Combined-Delta-Closure.md", - "requirements/intakes/active/Lastenheft_Constitution_Change.md", - "requirements/intakes/active/Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.md", + "requirements/intakes/archive/Lastenheft_22_Wave6-Combined-Delta-Closure.037-wave6-combined-delta-closure.md", + "requirements/intakes/archive/Lastenheft_Constitution_Change.040-constitution-governance-closure.md", + "requirements/intakes/archive/Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.044-sandbox-secure-development-hardening.md", "requirements/intakes/archive/Lastenheft_RL-SE-Checklist-Selbstpruefung.045-rl-se-checklist-self-review.md", "requirements/intakes/archive/Lastenheft_GSDB-Spec-Kit-Intensivpruefung.046-gsdb-spec-kit-intensive-review.md" ], "dependencies": [ { - "from": "requirements/intakes/active/Lastenheft_22_Wave6-Combined-Delta-Closure.md", - "to": "requirements/intakes/active/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.md", + "from": "requirements/intakes/archive/Lastenheft_22_Wave6-Combined-Delta-Closure.037-wave6-combined-delta-closure.md", + "to": "requirements/intakes/archive/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.038-example-portfolio-conformance-audit.md", "kind": "HardCompletionGate" }, { - "from": "requirements/intakes/active/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.md", - "to": "requirements/intakes/active/Lastenheft_Example-Portfolio-Closure.md", + "from": "requirements/intakes/archive/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.038-example-portfolio-conformance-audit.md", + "to": "requirements/intakes/archive/Lastenheft_Example-Portfolio-Closure.039-example-portfolio-closure.md", "kind": "HardCompletionGate" }, { - "from": "requirements/intakes/active/Lastenheft_Constitution_Change.md", - "to": "requirements/intakes/active/Lastenheft_Source-Reference-Policy.md", + "from": "requirements/intakes/archive/Lastenheft_Constitution_Change.040-constitution-governance-closure.md", + "to": "requirements/intakes/archive/Lastenheft_Source-Reference-Policy.041-source-reference-policy.md", "kind": "SharedWriterSerialization" }, { - "from": "requirements/intakes/active/Lastenheft_Source-Reference-Policy.md", - "to": "requirements/intakes/active/Lastenheft_Transactional-Form-Model.md", + "from": "requirements/intakes/archive/Lastenheft_Source-Reference-Policy.041-source-reference-policy.md", + "to": "requirements/intakes/archive/Lastenheft_Transactional-Form-Model.042-transactional-form-model.md", "kind": "HardCompletionGate" }, { - "from": "requirements/intakes/active/Lastenheft_Example-Portfolio-Closure.md", - "to": "requirements/intakes/active/Lastenheft_Transactional-Form-Model.md", + "from": "requirements/intakes/archive/Lastenheft_Example-Portfolio-Closure.039-example-portfolio-closure.md", + "to": "requirements/intakes/archive/Lastenheft_Transactional-Form-Model.042-transactional-form-model.md", "kind": "HardCompletionGate" }, { - "from": "requirements/intakes/active/Lastenheft_Transactional-Form-Model.md", - "to": "requirements/intakes/active/Lastenheft_23_Documentation-Publishing-Closure.md", + "from": "requirements/intakes/archive/Lastenheft_Transactional-Form-Model.042-transactional-form-model.md", + "to": "requirements/intakes/archive/Lastenheft_23_Documentation-Publishing-Closure.043-documentation-publishing-closure.md", "kind": "PreferredSerialOrder" } ] diff --git a/requirements/intakes/series/tui-vision-delivery/intake-review-result.json b/requirements/intakes/series/tui-vision-delivery/intake-review-result.json index da92e4d0..59c838f4 100644 --- a/requirements/intakes/series/tui-vision-delivery/intake-review-result.json +++ b/requirements/intakes/series/tui-vision-delivery/intake-review-result.json @@ -4,60 +4,60 @@ "mode": "Series", "status": "Ready", "policy": "tui-vision-lastenheft", - "reviewedAt": "2026-08-30T16:19:20Z", + "reviewedAt": "2026-09-12T23:56:52Z", "repository": { "root": ".", - "head": "fe1f57c201c84fb3f81d746a6ca3d8977c9f1edb" + "head": "5c2c3c301afa8c9cbdba24687294e7d53ed7e417" }, "requestEvidence": { "path": "requirements/intakes/series/tui-vision-delivery/intake-review-request.json", - "normalizedSha256": "f2a38d785c16953ce010cdb9cd8cb1f8987b0f7e92f47886cc2c3fd64d9b663b" + "normalizedSha256": "9fd44beb2d02cc233d7058daa21678e398f1cd13e7f8f99258ec2b99e2cb03c3" }, "targets": [ { - "path": "requirements/intakes/active/Lastenheft_22_Wave6-Combined-Delta-Closure.md", + "path": "requirements/intakes/archive/Lastenheft_22_Wave6-Combined-Delta-Closure.037-wave6-combined-delta-closure.md", "role": "OrderedMember", "normalizedSha256": "1b8ac280514c3415dfa51f2807f2b9183e51cd46b446d59980974cdce0ac70ad", "gitBlob": "N/A" }, { - "path": "requirements/intakes/active/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.md", + "path": "requirements/intakes/archive/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.038-example-portfolio-conformance-audit.md", "role": "OrderedMember", "normalizedSha256": "f46be28ad27bb2dd5644390a7d50bed4912b514ce924e58bfd304135b33c0ad2", "gitBlob": "N/A" }, { - "path": "requirements/intakes/active/Lastenheft_Example-Portfolio-Closure.md", + "path": "requirements/intakes/archive/Lastenheft_Example-Portfolio-Closure.039-example-portfolio-closure.md", "role": "Primary", "normalizedSha256": "f5dc617b7c20d718304bb91f7f63d4a95d5c27cf09a7d0a4685a3bc4a824ab1a", "gitBlob": "N/A" }, { - "path": "requirements/intakes/active/Lastenheft_Constitution_Change.md", + "path": "requirements/intakes/archive/Lastenheft_Constitution_Change.040-constitution-governance-closure.md", "role": "OrderedMember", "normalizedSha256": "b7dbf455ff4e84b336ffe3cca3ff184e1897860592d4f53fb52f1776e7eb9e91", "gitBlob": "N/A" }, { - "path": "requirements/intakes/active/Lastenheft_Source-Reference-Policy.md", + "path": "requirements/intakes/archive/Lastenheft_Source-Reference-Policy.041-source-reference-policy.md", "role": "OrderedMember", "normalizedSha256": "a59e9588363e385c19d48c361df9ebb019323cf25865672dd77152292e8d2776", "gitBlob": "N/A" }, { - "path": "requirements/intakes/active/Lastenheft_Transactional-Form-Model.md", + "path": "requirements/intakes/archive/Lastenheft_Transactional-Form-Model.042-transactional-form-model.md", "role": "OrderedMember", "normalizedSha256": "45d8f8b589c3d9fd417f9b8dc9d25d09c0597f02c075b04454bbce95e095a239", "gitBlob": "N/A" }, { - "path": "requirements/intakes/active/Lastenheft_23_Documentation-Publishing-Closure.md", + "path": "requirements/intakes/archive/Lastenheft_23_Documentation-Publishing-Closure.043-documentation-publishing-closure.md", "role": "OrderedMember", "normalizedSha256": "df5f1876c781632c13594e9ec60c3cc8f9408c586ac03aeb48aa87442987878c", "gitBlob": "N/A" }, { - "path": "requirements/intakes/active/Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.md", + "path": "requirements/intakes/archive/Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.044-sandbox-secure-development-hardening.md", "role": "OrderedMember", "normalizedSha256": "d1f6a20535f90b78d00f7f6974a32156d7c08eeb77ebad9961a41ffbe3f84858", "gitBlob": "N/A" @@ -81,14 +81,14 @@ "operatorExceptions": [], "coverage": { "individual": [ - "requirements/intakes/active/Lastenheft_22_Wave6-Combined-Delta-Closure.md", - "requirements/intakes/active/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.md", - "requirements/intakes/active/Lastenheft_Example-Portfolio-Closure.md", - "requirements/intakes/active/Lastenheft_Constitution_Change.md", - "requirements/intakes/active/Lastenheft_Source-Reference-Policy.md", - "requirements/intakes/active/Lastenheft_Transactional-Form-Model.md", - "requirements/intakes/active/Lastenheft_23_Documentation-Publishing-Closure.md", - "requirements/intakes/active/Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.md", + "requirements/intakes/archive/Lastenheft_22_Wave6-Combined-Delta-Closure.037-wave6-combined-delta-closure.md", + "requirements/intakes/archive/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.038-example-portfolio-conformance-audit.md", + "requirements/intakes/archive/Lastenheft_Example-Portfolio-Closure.039-example-portfolio-closure.md", + "requirements/intakes/archive/Lastenheft_Constitution_Change.040-constitution-governance-closure.md", + "requirements/intakes/archive/Lastenheft_Source-Reference-Policy.041-source-reference-policy.md", + "requirements/intakes/archive/Lastenheft_Transactional-Form-Model.042-transactional-form-model.md", + "requirements/intakes/archive/Lastenheft_23_Documentation-Publishing-Closure.043-documentation-publishing-closure.md", + "requirements/intakes/archive/Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.044-sandbox-secure-development-hardening.md", "requirements/intakes/archive/Lastenheft_RL-SE-Checklist-Selbstpruefung.045-rl-se-checklist-self-review.md", "requirements/intakes/archive/Lastenheft_GSDB-Spec-Kit-Intensivpruefung.046-gsdb-spec-kit-intensive-review.md" ], diff --git a/requirements/intakes/series/tui-vision-delivery/manifest.json b/requirements/intakes/series/tui-vision-delivery/manifest.json index f8aa3d9e..bdd4d10a 100644 --- a/requirements/intakes/series/tui-vision-delivery/manifest.json +++ b/requirements/intakes/series/tui-vision-delivery/manifest.json @@ -7,49 +7,49 @@ "status": "Completed", "orderedTargets": [ { - "path": "requirements/intakes/active/Lastenheft_22_Wave6-Combined-Delta-Closure.md", + "path": "requirements/intakes/archive/Lastenheft_22_Wave6-Combined-Delta-Closure.037-wave6-combined-delta-closure.md", "role": "OrderedMember", "normalizedSha256": "1b8ac280514c3415dfa51f2807f2b9183e51cd46b446d59980974cdce0ac70ad", "status": "Completed" }, { - "path": "requirements/intakes/active/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.md", + "path": "requirements/intakes/archive/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.038-example-portfolio-conformance-audit.md", "role": "OrderedMember", "normalizedSha256": "f46be28ad27bb2dd5644390a7d50bed4912b514ce924e58bfd304135b33c0ad2", "status": "Completed" }, { - "path": "requirements/intakes/active/Lastenheft_Example-Portfolio-Closure.md", + "path": "requirements/intakes/archive/Lastenheft_Example-Portfolio-Closure.039-example-portfolio-closure.md", "role": "Primary", "normalizedSha256": "f5dc617b7c20d718304bb91f7f63d4a95d5c27cf09a7d0a4685a3bc4a824ab1a", "status": "Completed" }, { - "path": "requirements/intakes/active/Lastenheft_Constitution_Change.md", + "path": "requirements/intakes/archive/Lastenheft_Constitution_Change.040-constitution-governance-closure.md", "role": "OrderedMember", "normalizedSha256": "b7dbf455ff4e84b336ffe3cca3ff184e1897860592d4f53fb52f1776e7eb9e91", "status": "Completed" }, { - "path": "requirements/intakes/active/Lastenheft_Source-Reference-Policy.md", + "path": "requirements/intakes/archive/Lastenheft_Source-Reference-Policy.041-source-reference-policy.md", "role": "OrderedMember", "normalizedSha256": "a59e9588363e385c19d48c361df9ebb019323cf25865672dd77152292e8d2776", "status": "Completed" }, { - "path": "requirements/intakes/active/Lastenheft_Transactional-Form-Model.md", + "path": "requirements/intakes/archive/Lastenheft_Transactional-Form-Model.042-transactional-form-model.md", "role": "OrderedMember", "normalizedSha256": "45d8f8b589c3d9fd417f9b8dc9d25d09c0597f02c075b04454bbce95e095a239", "status": "Completed" }, { - "path": "requirements/intakes/active/Lastenheft_23_Documentation-Publishing-Closure.md", + "path": "requirements/intakes/archive/Lastenheft_23_Documentation-Publishing-Closure.043-documentation-publishing-closure.md", "role": "OrderedMember", "normalizedSha256": "df5f1876c781632c13594e9ec60c3cc8f9408c586ac03aeb48aa87442987878c", "status": "Completed" }, { - "path": "requirements/intakes/active/Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.md", + "path": "requirements/intakes/archive/Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.044-sandbox-secure-development-hardening.md", "role": "OrderedMember", "normalizedSha256": "d1f6a20535f90b78d00f7f6974a32156d7c08eeb77ebad9961a41ffbe3f84858", "status": "Completed" @@ -68,46 +68,46 @@ } ], "roots": [ - "requirements/intakes/active/Lastenheft_22_Wave6-Combined-Delta-Closure.md", - "requirements/intakes/active/Lastenheft_Constitution_Change.md", - "requirements/intakes/active/Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.md", + "requirements/intakes/archive/Lastenheft_22_Wave6-Combined-Delta-Closure.037-wave6-combined-delta-closure.md", + "requirements/intakes/archive/Lastenheft_Constitution_Change.040-constitution-governance-closure.md", + "requirements/intakes/archive/Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.044-sandbox-secure-development-hardening.md", "requirements/intakes/archive/Lastenheft_RL-SE-Checklist-Selbstpruefung.045-rl-se-checklist-self-review.md", "requirements/intakes/archive/Lastenheft_GSDB-Spec-Kit-Intensivpruefung.046-gsdb-spec-kit-intensive-review.md" ], "dependencies": [ { - "from": "requirements/intakes/active/Lastenheft_22_Wave6-Combined-Delta-Closure.md", - "to": "requirements/intakes/active/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.md", + "from": "requirements/intakes/archive/Lastenheft_22_Wave6-Combined-Delta-Closure.037-wave6-combined-delta-closure.md", + "to": "requirements/intakes/archive/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.038-example-portfolio-conformance-audit.md", "kind": "HardCompletionGate", "binding": true }, { - "from": "requirements/intakes/active/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.md", - "to": "requirements/intakes/active/Lastenheft_Example-Portfolio-Closure.md", + "from": "requirements/intakes/archive/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.038-example-portfolio-conformance-audit.md", + "to": "requirements/intakes/archive/Lastenheft_Example-Portfolio-Closure.039-example-portfolio-closure.md", "kind": "HardCompletionGate", "binding": true }, { - "from": "requirements/intakes/active/Lastenheft_Constitution_Change.md", - "to": "requirements/intakes/active/Lastenheft_Source-Reference-Policy.md", + "from": "requirements/intakes/archive/Lastenheft_Constitution_Change.040-constitution-governance-closure.md", + "to": "requirements/intakes/archive/Lastenheft_Source-Reference-Policy.041-source-reference-policy.md", "kind": "SharedWriterSerialization", "binding": false }, { - "from": "requirements/intakes/active/Lastenheft_Source-Reference-Policy.md", - "to": "requirements/intakes/active/Lastenheft_Transactional-Form-Model.md", + "from": "requirements/intakes/archive/Lastenheft_Source-Reference-Policy.041-source-reference-policy.md", + "to": "requirements/intakes/archive/Lastenheft_Transactional-Form-Model.042-transactional-form-model.md", "kind": "HardCompletionGate", "binding": true }, { - "from": "requirements/intakes/active/Lastenheft_Example-Portfolio-Closure.md", - "to": "requirements/intakes/active/Lastenheft_Transactional-Form-Model.md", + "from": "requirements/intakes/archive/Lastenheft_Example-Portfolio-Closure.039-example-portfolio-closure.md", + "to": "requirements/intakes/archive/Lastenheft_Transactional-Form-Model.042-transactional-form-model.md", "kind": "HardCompletionGate", "binding": true }, { - "from": "requirements/intakes/active/Lastenheft_Transactional-Form-Model.md", - "to": "requirements/intakes/active/Lastenheft_23_Documentation-Publishing-Closure.md", + "from": "requirements/intakes/archive/Lastenheft_Transactional-Form-Model.042-transactional-form-model.md", + "to": "requirements/intakes/archive/Lastenheft_23_Documentation-Publishing-Closure.043-documentation-publishing-closure.md", "kind": "PreferredSerialOrder", "binding": false } diff --git a/requirements/intakes/series/tui-vision-delivery/operation.json b/requirements/intakes/series/tui-vision-delivery/operation.json index 2538b684..d4bc19ac 100644 --- a/requirements/intakes/series/tui-vision-delivery/operation.json +++ b/requirements/intakes/series/tui-vision-delivery/operation.json @@ -1,18 +1,38 @@ { "schemaVersion": "1.0", "documentType": "IntakeSeriesOperation", - "operationId": "0326e087-08a7-4318-a54d-6b4bf5993017", + "operationId": "3fff6099-cd3b-47c1-985b-c816300dd47a", "seriesId": "a73dda7c-163b-4530-97f2-fd9eea5e8986", "type": "Update", "status": "Published", - "authorityEvidence": "Explicit user authority for completed-series lifecycle reconciliation", - "proposalNormalizedSha256": "6c086db5c8ed9cd33e221210e68edd99546efb9acbe098d863fb18201ffb5ae9", + "authorityEvidence": "Explicit user authority for completed-intake archive reconciliation", + "proposalNormalizedSha256": "268a3d3e37e279127f0fcfc099e7761df0443dc4c9625392a70441c619bdf894", "preparedPaths": [ - "specs/intake-series-archive/a73dda7c-163b-4530-97f2-fd9eea5e8986/0326e087-08a7-4318-a54d-6b4bf5993017/manifest.json", - "specs/intake-series-archive/a73dda7c-163b-4530-97f2-fd9eea5e8986/0326e087-08a7-4318-a54d-6b4bf5993017/receipt.json", + "specs/intake-series-archive/a73dda7c-163b-4530-97f2-fd9eea5e8986/3fff6099-cd3b-47c1-985b-c816300dd47a/manifest.json", + "specs/intake-series-archive/a73dda7c-163b-4530-97f2-fd9eea5e8986/3fff6099-cd3b-47c1-985b-c816300dd47a/receipt.json", + "requirements/intakes/archive/Lastenheft_22_Wave6-Combined-Delta-Closure.037-wave6-combined-delta-closure.md", + "requirements/intakes/archive/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.038-example-portfolio-conformance-audit.md", + "requirements/intakes/archive/Lastenheft_Example-Portfolio-Closure.039-example-portfolio-closure.md", + "requirements/intakes/archive/Lastenheft_Constitution_Change.040-constitution-governance-closure.md", + "requirements/intakes/archive/Lastenheft_Source-Reference-Policy.041-source-reference-policy.md", + "requirements/intakes/archive/Lastenheft_Transactional-Form-Model.042-transactional-form-model.md", + "requirements/intakes/archive/Lastenheft_23_Documentation-Publishing-Closure.043-documentation-publishing-closure.md", + "requirements/intakes/archive/Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.044-sandbox-secure-development-hardening.md", + "specs/037-wave6-combined-delta-closure/autonomous-run-state.json", + "specs/038-example-portfolio-conformance-audit/autonomous-run-state.json", + "specs/039-example-portfolio-closure/autonomous-run-state.json", + "specs/040-constitution-governance-closure/autonomous-run-state.json", + "specs/041-source-reference-policy/autonomous-run-state.json", + "specs/042-transactional-form-model/autonomous-run-state.json", + "specs/043-documentation-publishing-closure/autonomous-run-state.json", + "specs/044-sandbox-secure-development-hardening/autonomous-run-state.json", + "Lastenheft_Abarbeitungsreihenfolge.md", "requirements/intakes/series/tui-vision-delivery/manifest.json", "requirements/intakes/series/tui-vision-delivery/receipt.json", - "requirements/intakes/series/tui-vision-delivery/order.md" + "requirements/intakes/series/tui-vision-delivery/operation.json", + "requirements/intakes/series/tui-vision-delivery/order.md", + "requirements/intakes/series/tui-vision-delivery/intake-review-request.json", + "requirements/intakes/series/tui-vision-delivery/intake-review-result.json" ], "validation": { "bash": "Pass", @@ -21,11 +41,31 @@ "publication": { "status": "Published", "publishedPaths": [ - "specs/intake-series-archive/a73dda7c-163b-4530-97f2-fd9eea5e8986/0326e087-08a7-4318-a54d-6b4bf5993017/manifest.json", - "specs/intake-series-archive/a73dda7c-163b-4530-97f2-fd9eea5e8986/0326e087-08a7-4318-a54d-6b4bf5993017/receipt.json", + "specs/intake-series-archive/a73dda7c-163b-4530-97f2-fd9eea5e8986/3fff6099-cd3b-47c1-985b-c816300dd47a/manifest.json", + "specs/intake-series-archive/a73dda7c-163b-4530-97f2-fd9eea5e8986/3fff6099-cd3b-47c1-985b-c816300dd47a/receipt.json", + "requirements/intakes/archive/Lastenheft_22_Wave6-Combined-Delta-Closure.037-wave6-combined-delta-closure.md", + "requirements/intakes/archive/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.038-example-portfolio-conformance-audit.md", + "requirements/intakes/archive/Lastenheft_Example-Portfolio-Closure.039-example-portfolio-closure.md", + "requirements/intakes/archive/Lastenheft_Constitution_Change.040-constitution-governance-closure.md", + "requirements/intakes/archive/Lastenheft_Source-Reference-Policy.041-source-reference-policy.md", + "requirements/intakes/archive/Lastenheft_Transactional-Form-Model.042-transactional-form-model.md", + "requirements/intakes/archive/Lastenheft_23_Documentation-Publishing-Closure.043-documentation-publishing-closure.md", + "requirements/intakes/archive/Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.044-sandbox-secure-development-hardening.md", + "specs/037-wave6-combined-delta-closure/autonomous-run-state.json", + "specs/038-example-portfolio-conformance-audit/autonomous-run-state.json", + "specs/039-example-portfolio-closure/autonomous-run-state.json", + "specs/040-constitution-governance-closure/autonomous-run-state.json", + "specs/041-source-reference-policy/autonomous-run-state.json", + "specs/042-transactional-form-model/autonomous-run-state.json", + "specs/043-documentation-publishing-closure/autonomous-run-state.json", + "specs/044-sandbox-secure-development-hardening/autonomous-run-state.json", + "Lastenheft_Abarbeitungsreihenfolge.md", "requirements/intakes/series/tui-vision-delivery/manifest.json", "requirements/intakes/series/tui-vision-delivery/receipt.json", - "requirements/intakes/series/tui-vision-delivery/order.md" + "requirements/intakes/series/tui-vision-delivery/operation.json", + "requirements/intakes/series/tui-vision-delivery/order.md", + "requirements/intakes/series/tui-vision-delivery/intake-review-request.json", + "requirements/intakes/series/tui-vision-delivery/intake-review-result.json" ] } } diff --git a/requirements/intakes/series/tui-vision-delivery/order.md b/requirements/intakes/series/tui-vision-delivery/order.md index ca606155..f929c7aa 100644 --- a/requirements/intakes/series/tui-vision-delivery/order.md +++ b/requirements/intakes/series/tui-vision-delivery/order.md @@ -9,20 +9,20 @@ T056-locked evidence. It does not start a feature run.* ## Verlinkter Ausführungsnachweis / Linked Execution Evidence -- Manifest SHA-256: `6c086db5c8ed9cd33e221210e68edd99546efb9acbe098d863fb18201ffb5ae9` -- Projektions-SHA-256: `ee742b9d641546faf154e1aa27a98b14029ada3d120892d4590449aaab65efb7` +- Manifest SHA-256: `268a3d3e37e279127f0fcfc099e7761df0443dc4c9625392a70441c619bdf894` +- Projektions-SHA-256: `d788797f3dd4cee8dfa2e5ebd619810be17fb63944b9dbbbf10c496dff8d1e3b` - Umfang: `10` Serienzuordnungen, `6` unveränderte Abhängigkeiten | Position | Intake | Status | Spec-Kit-Feature | Direkte eingehende Abhängigkeiten | |---:|---|---|---|---| -| 1 | [Lastenheft_22_Wave6-Combined-Delta-Closure.md](../../active/Lastenheft_22_Wave6-Combined-Delta-Closure.md) | `Completed` | [037-wave6-combined-delta-closure](../../../../specs/037-wave6-combined-delta-closure/) | — | -| 2 | [Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.md](../../active/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.md) | `Completed` | [038-example-portfolio-conformance-audit](../../../../specs/038-example-portfolio-conformance-audit/) | [Lastenheft_22_Wave6-Combined-Delta-Closure.md](../../active/Lastenheft_22_Wave6-Combined-Delta-Closure.md) · `HardCompletionGate` · binding=`true` | -| 3 | [Lastenheft_Example-Portfolio-Closure.md](../../active/Lastenheft_Example-Portfolio-Closure.md) | `Completed` | [039-example-portfolio-closure](../../../../specs/039-example-portfolio-closure/) | [Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.md](../../active/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.md) · `HardCompletionGate` · binding=`true` | -| 4 | [Lastenheft_Constitution_Change.md](../../active/Lastenheft_Constitution_Change.md) | `Completed` | [040-constitution-governance-closure](../../../../specs/040-constitution-governance-closure/) | — | -| 5 | [Lastenheft_Source-Reference-Policy.md](../../active/Lastenheft_Source-Reference-Policy.md) | `Completed` | [041-source-reference-policy](../../../../specs/041-source-reference-policy/) | [Lastenheft_Constitution_Change.md](../../active/Lastenheft_Constitution_Change.md) · `SharedWriterSerialization` · binding=`false` | -| 6 | [Lastenheft_Transactional-Form-Model.md](../../active/Lastenheft_Transactional-Form-Model.md) | `Completed` | [042-transactional-form-model](../../../../specs/042-transactional-form-model/) | [Lastenheft_Source-Reference-Policy.md](../../active/Lastenheft_Source-Reference-Policy.md) · `HardCompletionGate` · binding=`true`
[Lastenheft_Example-Portfolio-Closure.md](../../active/Lastenheft_Example-Portfolio-Closure.md) · `HardCompletionGate` · binding=`true` | -| 7 | [Lastenheft_23_Documentation-Publishing-Closure.md](../../active/Lastenheft_23_Documentation-Publishing-Closure.md) | `Completed` | [043-documentation-publishing-closure](../../../../specs/043-documentation-publishing-closure/) | [Lastenheft_Transactional-Form-Model.md](../../active/Lastenheft_Transactional-Form-Model.md) · `PreferredSerialOrder` · binding=`false` | -| 8 | [Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.md](../../active/Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.md) | `Completed` | [044-sandbox-secure-development-hardening](../../../../specs/044-sandbox-secure-development-hardening/) | — | +| 1 | [Lastenheft_22_Wave6-Combined-Delta-Closure.037-wave6-combined-delta-closure.md](../../archive/Lastenheft_22_Wave6-Combined-Delta-Closure.037-wave6-combined-delta-closure.md) | `Completed` | [037-wave6-combined-delta-closure](../../../../specs/037-wave6-combined-delta-closure/) | — | +| 2 | [Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.038-example-portfolio-conformance-audit.md](../../archive/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.038-example-portfolio-conformance-audit.md) | `Completed` | [038-example-portfolio-conformance-audit](../../../../specs/038-example-portfolio-conformance-audit/) | [Lastenheft_22_Wave6-Combined-Delta-Closure.037-wave6-combined-delta-closure.md](../../archive/Lastenheft_22_Wave6-Combined-Delta-Closure.037-wave6-combined-delta-closure.md) · `HardCompletionGate` · binding=`true` | +| 3 | [Lastenheft_Example-Portfolio-Closure.039-example-portfolio-closure.md](../../archive/Lastenheft_Example-Portfolio-Closure.039-example-portfolio-closure.md) | `Completed` | [039-example-portfolio-closure](../../../../specs/039-example-portfolio-closure/) | [Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.038-example-portfolio-conformance-audit.md](../../archive/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.038-example-portfolio-conformance-audit.md) · `HardCompletionGate` · binding=`true` | +| 4 | [Lastenheft_Constitution_Change.040-constitution-governance-closure.md](../../archive/Lastenheft_Constitution_Change.040-constitution-governance-closure.md) | `Completed` | [040-constitution-governance-closure](../../../../specs/040-constitution-governance-closure/) | — | +| 5 | [Lastenheft_Source-Reference-Policy.041-source-reference-policy.md](../../archive/Lastenheft_Source-Reference-Policy.041-source-reference-policy.md) | `Completed` | [041-source-reference-policy](../../../../specs/041-source-reference-policy/) | [Lastenheft_Constitution_Change.040-constitution-governance-closure.md](../../archive/Lastenheft_Constitution_Change.040-constitution-governance-closure.md) · `SharedWriterSerialization` · binding=`false` | +| 6 | [Lastenheft_Transactional-Form-Model.042-transactional-form-model.md](../../archive/Lastenheft_Transactional-Form-Model.042-transactional-form-model.md) | `Completed` | [042-transactional-form-model](../../../../specs/042-transactional-form-model/) | [Lastenheft_Source-Reference-Policy.041-source-reference-policy.md](../../archive/Lastenheft_Source-Reference-Policy.041-source-reference-policy.md) · `HardCompletionGate` · binding=`true`
[Lastenheft_Example-Portfolio-Closure.039-example-portfolio-closure.md](../../archive/Lastenheft_Example-Portfolio-Closure.039-example-portfolio-closure.md) · `HardCompletionGate` · binding=`true` | +| 7 | [Lastenheft_23_Documentation-Publishing-Closure.043-documentation-publishing-closure.md](../../archive/Lastenheft_23_Documentation-Publishing-Closure.043-documentation-publishing-closure.md) | `Completed` | [043-documentation-publishing-closure](../../../../specs/043-documentation-publishing-closure/) | [Lastenheft_Transactional-Form-Model.042-transactional-form-model.md](../../archive/Lastenheft_Transactional-Form-Model.042-transactional-form-model.md) · `PreferredSerialOrder` · binding=`false` | +| 8 | [Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.044-sandbox-secure-development-hardening.md](../../archive/Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.044-sandbox-secure-development-hardening.md) | `Completed` | [044-sandbox-secure-development-hardening](../../../../specs/044-sandbox-secure-development-hardening/) | — | | 9 | [Lastenheft_RL-SE-Checklist-Selbstpruefung.045-rl-se-checklist-self-review.md](../../archive/Lastenheft_RL-SE-Checklist-Selbstpruefung.045-rl-se-checklist-self-review.md) | `Completed` | [045-rl-se-checklist-self-review](../../../../specs/045-rl-se-checklist-self-review/) | — | | 10 | [Lastenheft_GSDB-Spec-Kit-Intensivpruefung.046-gsdb-spec-kit-intensive-review.md](../../archive/Lastenheft_GSDB-Spec-Kit-Intensivpruefung.046-gsdb-spec-kit-intensive-review.md) | `Completed` | [046-gsdb-spec-kit-intensive-review](../../../../specs/046-gsdb-spec-kit-intensive-review/) | — | diff --git a/requirements/intakes/series/tui-vision-delivery/receipt.json b/requirements/intakes/series/tui-vision-delivery/receipt.json index e42c9451..da432a40 100644 --- a/requirements/intakes/series/tui-vision-delivery/receipt.json +++ b/requirements/intakes/series/tui-vision-delivery/receipt.json @@ -1,28 +1,28 @@ { "schemaVersion": "1.0", "documentType": "IntakeSeriesReceipt", - "receiptId": "a76e7957-0b72-4c0b-b738-c88c3bc33885", + "receiptId": "d452f695-2189-42c4-9021-b54c436b7f65", "seriesId": "a73dda7c-163b-4530-97f2-fd9eea5e8986", "generator": { "preset": "intake-sequencing-governance", "version": "0.2.3" }, - "createdAt": "2026-09-12T23:21:05Z", + "createdAt": "2026-09-12T23:56:52Z", "operation": { - "operationId": "0326e087-08a7-4318-a54d-6b4bf5993017", + "operationId": "3fff6099-cd3b-47c1-985b-c816300dd47a", "type": "Update", - "authorityEvidence": "Explicit user authority for completed-series lifecycle reconciliation" + "authorityEvidence": "Explicit user authority for completed-intake archive reconciliation" }, "status": "Ready", "manifest": { "path": "requirements/intakes/series/tui-vision-delivery/manifest.json", - "normalizedSha256": "6c086db5c8ed9cd33e221210e68edd99546efb9acbe098d863fb18201ffb5ae9" + "normalizedSha256": "268a3d3e37e279127f0fcfc099e7761df0443dc4c9625392a70441c619bdf894" }, "supersedes": { - "receiptPath": "specs/intake-series-archive/a73dda7c-163b-4530-97f2-fd9eea5e8986/0326e087-08a7-4318-a54d-6b4bf5993017/receipt.json", - "receiptNormalizedSha256": "eb64ab26a6e0d4fd9ab92039f61a31612cbda4ac1cd4978fabfb3ab220f71136", - "manifestArchivePath": "specs/intake-series-archive/a73dda7c-163b-4530-97f2-fd9eea5e8986/0326e087-08a7-4318-a54d-6b4bf5993017/manifest.json", - "manifestArchiveSha256": "538d12fcc60cab96e5d70865a9ab9c31885634f3981e1c10dc2cd09d1ee2d2e7" + "receiptPath": "specs/intake-series-archive/a73dda7c-163b-4530-97f2-fd9eea5e8986/3fff6099-cd3b-47c1-985b-c816300dd47a/receipt.json", + "receiptNormalizedSha256": "1ea8012359eb684753ec15e75f8ec7b71eaa05db674cd13217cd8fce14142d0f", + "manifestArchivePath": "specs/intake-series-archive/a73dda7c-163b-4530-97f2-fd9eea5e8986/3fff6099-cd3b-47c1-985b-c816300dd47a/manifest.json", + "manifestArchiveSha256": "6c086db5c8ed9cd33e221210e68edd99546efb9acbe098d863fb18201ffb5ae9" }, "tombstone": { "path": "N/A", diff --git a/scripts/render-requirements-intake-governance.mjs b/scripts/render-requirements-intake-governance.mjs index 71a0b0fe..7a2be36c 100644 --- a/scripts/render-requirements-intake-governance.mjs +++ b/scripts/render-requirements-intake-governance.mjs @@ -21,71 +21,71 @@ if (argumentsList.some((argument) => !["--check", "--write"].includes(argument)) const write = argumentsList.includes("--write"); const seriesRoot = "requirements/intakes/series/tui-vision-delivery"; const seriesId = "a73dda7c-163b-4530-97f2-fd9eea5e8986"; -const seriesReceiptId = "a76e7957-0b72-4c0b-b738-c88c3bc33885"; -const seriesOperationId = "0326e087-08a7-4318-a54d-6b4bf5993017"; +const seriesReceiptId = "d452f695-2189-42c4-9021-b54c436b7f65"; +const seriesOperationId = "3fff6099-cd3b-47c1-985b-c816300dd47a"; const reviewId = "88579ec8-e830-4a07-8c29-d6035dcb4782"; const migrationProposal = "specs/requirements-reconciliation-20260726/migration-proposal.json"; const createdAt = "2026-07-26T20:00:00Z"; -const seriesUpdatedAt = "2026-09-12T23:21:05Z"; -const reviewedAt = "2026-08-30T16:19:20Z"; +const seriesUpdatedAt = "2026-09-12T23:56:52Z"; +const reviewedAt = "2026-09-12T23:56:52Z"; const archiveRoot = `specs/intake-series-archive/${seriesId}/${seriesOperationId}`; -const priorManifestHash = "538d12fcc60cab96e5d70865a9ab9c31885634f3981e1c10dc2cd09d1ee2d2e7"; -const priorReceiptHash = "eb64ab26a6e0d4fd9ab92039f61a31612cbda4ac1cd4978fabfb3ab220f71136"; +const priorManifestHash = "6c086db5c8ed9cd33e221210e68edd99546efb9acbe098d863fb18201ffb5ae9"; +const priorReceiptHash = "1ea8012359eb684753ec15e75f8ec7b71eaa05db674cd13217cd8fce14142d0f"; const normalize = (value) => value.replace(/^\uFEFF/, "").replace(/\r\n?/g, "\n"); const hashText = (value) => crypto.createHash("sha256").update(normalize(value)).digest("hex"); const hashFile = (relativePath) => hashText(fs.readFileSync(path.join(root, relativePath), "utf8")); const readJson = (relativePath) => JSON.parse(fs.readFileSync(path.join(root, relativePath), "utf8")); const json = (value) => JSON.stringify(value, null, 2) + "\n"; -const reviewHead = "fe1f57c201c84fb3f81d746a6ca3d8977c9f1edb"; +const reviewHead = "5c2c3c301afa8c9cbdba24687294e7d53ed7e417"; const members = [ { slug: "wave6-combined-delta-closure", - path: "requirements/intakes/active/Lastenheft_22_Wave6-Combined-Delta-Closure.md", + path: "requirements/intakes/archive/Lastenheft_22_Wave6-Combined-Delta-Closure.037-wave6-combined-delta-closure.md", role: "OrderedMember", status: "Completed", }, { slug: "15-post-wave6-example-portfolio-conformance-audit", - path: "requirements/intakes/active/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.md", + path: "requirements/intakes/archive/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.038-example-portfolio-conformance-audit.md", role: "OrderedMember", status: "Completed", }, { slug: "example-portfolio-closure", - path: "requirements/intakes/active/Lastenheft_Example-Portfolio-Closure.md", + path: "requirements/intakes/archive/Lastenheft_Example-Portfolio-Closure.039-example-portfolio-closure.md", role: "Primary", status: "Completed", }, { slug: "constitution-change", - path: "requirements/intakes/active/Lastenheft_Constitution_Change.md", + path: "requirements/intakes/archive/Lastenheft_Constitution_Change.040-constitution-governance-closure.md", role: "OrderedMember", status: "Completed", }, { slug: "source-reference-policy", - path: "requirements/intakes/active/Lastenheft_Source-Reference-Policy.md", + path: "requirements/intakes/archive/Lastenheft_Source-Reference-Policy.041-source-reference-policy.md", role: "OrderedMember", status: "Completed", }, { slug: "transactional-form-model", - path: "requirements/intakes/active/Lastenheft_Transactional-Form-Model.md", + path: "requirements/intakes/archive/Lastenheft_Transactional-Form-Model.042-transactional-form-model.md", role: "OrderedMember", status: "Completed", }, { slug: "documentation-publishing-closure", - path: "requirements/intakes/active/Lastenheft_23_Documentation-Publishing-Closure.md", + path: "requirements/intakes/archive/Lastenheft_23_Documentation-Publishing-Closure.043-documentation-publishing-closure.md", role: "OrderedMember", status: "Completed", }, { slug: "sandbox-gestuetzte-secure-development-haertung", - path: "requirements/intakes/active/Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.md", + path: "requirements/intakes/archive/Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.044-sandbox-secure-development-hardening.md", role: "OrderedMember", status: "Completed", }, @@ -165,6 +165,29 @@ const manifest = { const manifestPath = `${seriesRoot}/manifest.json`; const manifestHash = hashText(json(manifest)); +const reconciledFeatureStates = [ + "specs/037-wave6-combined-delta-closure/autonomous-run-state.json", + "specs/038-example-portfolio-conformance-audit/autonomous-run-state.json", + "specs/039-example-portfolio-closure/autonomous-run-state.json", + "specs/040-constitution-governance-closure/autonomous-run-state.json", + "specs/041-source-reference-policy/autonomous-run-state.json", + "specs/042-transactional-form-model/autonomous-run-state.json", + "specs/043-documentation-publishing-closure/autonomous-run-state.json", + "specs/044-sandbox-secure-development-hardening/autonomous-run-state.json", +]; +const lifecyclePublishedPaths = [ + `${archiveRoot}/manifest.json`, + `${archiveRoot}/receipt.json`, + ...members.slice(0, 8).map((member) => member.path), + ...reconciledFeatureStates, + "Lastenheft_Abarbeitungsreihenfolge.md", + manifestPath, + `${seriesRoot}/receipt.json`, + `${seriesRoot}/operation.json`, + `${seriesRoot}/order.md`, + `${seriesRoot}/intake-review-request.json`, + `${seriesRoot}/intake-review-result.json`, +]; function sourceRecord(sourceId, relativePath, label) { const digest = hashFile(relativePath); @@ -280,7 +303,7 @@ const seriesReceipt = { operation: { operationId: seriesOperationId, type: "Update", - authorityEvidence: "Explicit user authority for completed-series lifecycle reconciliation", + authorityEvidence: "Explicit user authority for completed-intake archive reconciliation", }, status: "Ready", manifest: {path: manifestPath, normalizedSha256: manifestHash}, @@ -301,25 +324,13 @@ const operation = { seriesId, type: "Update", status: "Published", - authorityEvidence: "Explicit user authority for completed-series lifecycle reconciliation", + authorityEvidence: "Explicit user authority for completed-intake archive reconciliation", proposalNormalizedSha256: manifestHash, - preparedPaths: [ - `${archiveRoot}/manifest.json`, - `${archiveRoot}/receipt.json`, - manifestPath, - `${seriesRoot}/receipt.json`, - `${seriesRoot}/order.md`, - ], + preparedPaths: lifecyclePublishedPaths, validation: {bash: "Pass", powerShell: "Pass"}, publication: { status: "Published", - publishedPaths: [ - `${archiveRoot}/manifest.json`, - `${archiveRoot}/receipt.json`, - manifestPath, - `${seriesRoot}/receipt.json`, - `${seriesRoot}/order.md`, - ], + publishedPaths: lifecyclePublishedPaths, }, }; @@ -406,13 +417,14 @@ function encodedRelativeDestination(outputPath, targetPath, directory = false) { function linkedIntakeOrderDocument(outputPath) { const exact = readJson(exactFixturePath); - const mapping = exact.activeMapping; + const mapping = exact.seriesMapping; const tuples = exact.dependencyTuples; const backlog = exact.backlog; if (mapping.canonicalManifestSha256 !== manifestHash || tuples.canonicalManifestSha256 !== manifestHash || backlog.canonicalManifestSha256 !== manifestHash || - mapping.expectedActiveCount !== 10 || mapping.mappings.length !== 10 || + mapping.expectedSeriesTargetCount !== 10 || mapping.expectedActiveCount !== 0 || + mapping.mappings.length !== 10 || tuples.expectedEdgeCount !== 6 || tuples.edges.length !== 6) { throw new Error("TUI-EXACT-LOCK: exact fixture differs from the canonical manifest"); } diff --git a/scripts/tests/linked-intake-evidence/tuivision-exact.json b/scripts/tests/linked-intake-evidence/tuivision-exact.json index 50203c17..04622fd7 100644 --- a/scripts/tests/linked-intake-evidence/tuivision-exact.json +++ b/scripts/tests/linked-intake-evidence/tuivision-exact.json @@ -1,85 +1,87 @@ { "schemaVersion": "1.0", "documentType": "TuiVisionLinkedIntakeExactFixture", - "activeMapping": { + "seriesMapping": { "schemaVersion": "1.0", - "documentType": "TuiVisionExactActiveMapping", + "documentType": "TuiVisionExactSeriesMapping", "sourceRepository": "TuiVision", "canonicalManifest": "requirements/intakes/series/tui-vision-delivery/manifest.json", - "canonicalManifestSha256": "6c086db5c8ed9cd33e221210e68edd99546efb9acbe098d863fb18201ffb5ae9", - "expectedActiveCount": 10, + "canonicalManifestSha256": "268a3d3e37e279127f0fcfc099e7761df0443dc4c9625392a70441c619bdf894", + "expectedSeriesTargetCount": 10, + "expectedActiveCount": 0, + "expectedArchiveCount": 38, "mappings": [ { "position": 1, "status": "Completed", - "intakePath": "requirements/intakes/active/Lastenheft_22_Wave6-Combined-Delta-Closure.md", + "intakePath": "requirements/intakes/archive/Lastenheft_22_Wave6-Combined-Delta-Closure.037-wave6-combined-delta-closure.md", "intakeSha256": "1b8ac280514c3415dfa51f2807f2b9183e51cd46b446d59980974cdce0ac70ad", "featurePath": "specs/037-wave6-combined-delta-closure/", "proofPath": "specs/037-wave6-combined-delta-closure/autonomous-run-state.json", - "proofSha256": "827afa08fee1de1b2ab101bb3b8a44691e3596e44e2b556d759b8b13d8bee04d" + "proofSha256": "4107c66394e51704b3144f91342a74776dd6f4db212eee4f84d3c6efc4cb70f7" }, { "position": 2, "status": "Completed", - "intakePath": "requirements/intakes/active/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.md", + "intakePath": "requirements/intakes/archive/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.038-example-portfolio-conformance-audit.md", "intakeSha256": "f46be28ad27bb2dd5644390a7d50bed4912b514ce924e58bfd304135b33c0ad2", "featurePath": "specs/038-example-portfolio-conformance-audit/", "proofPath": "specs/038-example-portfolio-conformance-audit/autonomous-run-state.json", - "proofSha256": "3fc474777b0a7374569948f6ef9c3f1cdcf015951ba5aab825b0d5dd3ca422ad" + "proofSha256": "9b44b4b8ed12e096175e1d1b6d8bf3f27c33387337c0fdad1eda9915583fa93f" }, { "position": 3, "status": "Completed", - "intakePath": "requirements/intakes/active/Lastenheft_Example-Portfolio-Closure.md", + "intakePath": "requirements/intakes/archive/Lastenheft_Example-Portfolio-Closure.039-example-portfolio-closure.md", "intakeSha256": "f5dc617b7c20d718304bb91f7f63d4a95d5c27cf09a7d0a4685a3bc4a824ab1a", "featurePath": "specs/039-example-portfolio-closure/", "proofPath": "specs/039-example-portfolio-closure/autonomous-run-state.json", - "proofSha256": "279fa4169e77c0a8b0037983ebdf2f7275875ee68ca5fe34882ca6ff6906b4a7" + "proofSha256": "b2b81ef790c5a4589f67faa3616d91403c8975c21f302e080795d3b7cd40c004" }, { "position": 4, "status": "Completed", - "intakePath": "requirements/intakes/active/Lastenheft_Constitution_Change.md", + "intakePath": "requirements/intakes/archive/Lastenheft_Constitution_Change.040-constitution-governance-closure.md", "intakeSha256": "b7dbf455ff4e84b336ffe3cca3ff184e1897860592d4f53fb52f1776e7eb9e91", "featurePath": "specs/040-constitution-governance-closure/", "proofPath": "specs/040-constitution-governance-closure/autonomous-run-state.json", - "proofSha256": "14723a92f49eeb8e5d46a1e4fd78ee1f9f3959ba51e0b79ee09a1d548776622d" + "proofSha256": "e5aaf3f22a38a9a0caae15c6f8ea0aaa23f31d81abd9b237fa3d27cd5c68521c" }, { "position": 5, "status": "Completed", - "intakePath": "requirements/intakes/active/Lastenheft_Source-Reference-Policy.md", + "intakePath": "requirements/intakes/archive/Lastenheft_Source-Reference-Policy.041-source-reference-policy.md", "intakeSha256": "a59e9588363e385c19d48c361df9ebb019323cf25865672dd77152292e8d2776", "featurePath": "specs/041-source-reference-policy/", "proofPath": "specs/041-source-reference-policy/autonomous-run-state.json", - "proofSha256": "ceccf547168018b3cfc7a42e43397a7cc233667ae6a72e7cb93a7ee75be86537" + "proofSha256": "636faaec8a627979c01714d7bb21147064009c41d8104cad6a4e9d123a21eeab" }, { "position": 6, "status": "Completed", - "intakePath": "requirements/intakes/active/Lastenheft_Transactional-Form-Model.md", + "intakePath": "requirements/intakes/archive/Lastenheft_Transactional-Form-Model.042-transactional-form-model.md", "intakeSha256": "45d8f8b589c3d9fd417f9b8dc9d25d09c0597f02c075b04454bbce95e095a239", "featurePath": "specs/042-transactional-form-model/", "proofPath": "specs/042-transactional-form-model/autonomous-run-state.json", - "proofSha256": "408c5635cfa92bab5033bbd5032db65171d3f110df7e9c6e8b4de1d7060956fe" + "proofSha256": "9b9ea964b973a18389ac5b6fba563ee7ffa5225aae6f6b21881e2c020feed85a" }, { "position": 7, "status": "Completed", - "intakePath": "requirements/intakes/active/Lastenheft_23_Documentation-Publishing-Closure.md", + "intakePath": "requirements/intakes/archive/Lastenheft_23_Documentation-Publishing-Closure.043-documentation-publishing-closure.md", "intakeSha256": "df5f1876c781632c13594e9ec60c3cc8f9408c586ac03aeb48aa87442987878c", "featurePath": "specs/043-documentation-publishing-closure/", "proofPath": "specs/043-documentation-publishing-closure/autonomous-run-state.json", - "proofSha256": "7c56533e30c4bbc1dcd1b8467d9cfb94ac7042e6150496f85182d05261e5879a" + "proofSha256": "c953d8348bd4721aefdfee49178869a24b5cac083dda561a73c16cada306b98b" }, { "position": 8, "status": "Completed", - "intakePath": "requirements/intakes/active/Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.md", + "intakePath": "requirements/intakes/archive/Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.044-sandbox-secure-development-hardening.md", "intakeSha256": "d1f6a20535f90b78d00f7f6974a32156d7c08eeb77ebad9961a41ffbe3f84858", "featurePath": "specs/044-sandbox-secure-development-hardening/", "proofPath": "specs/044-sandbox-secure-development-hardening/autonomous-run-state.json", - "proofSha256": "7931839f360a1ef21edd86c1f7884d891597959bda95a704c502727a52ca2de0" + "proofSha256": "b94fdfdb9e6d10da28f9b58d9d3928cd645516f9c578f17a2a4b62affeb5ddca" }, { "position": 9, @@ -112,44 +114,44 @@ "schemaVersion": "1.0", "documentType": "TuiVisionExactDependencyTuples", "canonicalManifest": "requirements/intakes/series/tui-vision-delivery/manifest.json", - "canonicalManifestSha256": "6c086db5c8ed9cd33e221210e68edd99546efb9acbe098d863fb18201ffb5ae9", + "canonicalManifestSha256": "268a3d3e37e279127f0fcfc099e7761df0443dc4c9625392a70441c619bdf894", "expectedEdgeCount": 6, "expectedBindingTrueCount": 4, "expectedBindingFalseCount": 2, "edges": [ { - "from": "requirements/intakes/active/Lastenheft_22_Wave6-Combined-Delta-Closure.md", - "to": "requirements/intakes/active/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.md", + "from": "requirements/intakes/archive/Lastenheft_22_Wave6-Combined-Delta-Closure.037-wave6-combined-delta-closure.md", + "to": "requirements/intakes/archive/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.038-example-portfolio-conformance-audit.md", "kind": "HardCompletionGate", "binding": true }, { - "from": "requirements/intakes/active/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.md", - "to": "requirements/intakes/active/Lastenheft_Example-Portfolio-Closure.md", + "from": "requirements/intakes/archive/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.038-example-portfolio-conformance-audit.md", + "to": "requirements/intakes/archive/Lastenheft_Example-Portfolio-Closure.039-example-portfolio-closure.md", "kind": "HardCompletionGate", "binding": true }, { - "from": "requirements/intakes/active/Lastenheft_Constitution_Change.md", - "to": "requirements/intakes/active/Lastenheft_Source-Reference-Policy.md", + "from": "requirements/intakes/archive/Lastenheft_Constitution_Change.040-constitution-governance-closure.md", + "to": "requirements/intakes/archive/Lastenheft_Source-Reference-Policy.041-source-reference-policy.md", "kind": "SharedWriterSerialization", "binding": false }, { - "from": "requirements/intakes/active/Lastenheft_Source-Reference-Policy.md", - "to": "requirements/intakes/active/Lastenheft_Transactional-Form-Model.md", + "from": "requirements/intakes/archive/Lastenheft_Source-Reference-Policy.041-source-reference-policy.md", + "to": "requirements/intakes/archive/Lastenheft_Transactional-Form-Model.042-transactional-form-model.md", "kind": "HardCompletionGate", "binding": true }, { - "from": "requirements/intakes/active/Lastenheft_Example-Portfolio-Closure.md", - "to": "requirements/intakes/active/Lastenheft_Transactional-Form-Model.md", + "from": "requirements/intakes/archive/Lastenheft_Example-Portfolio-Closure.039-example-portfolio-closure.md", + "to": "requirements/intakes/archive/Lastenheft_Transactional-Form-Model.042-transactional-form-model.md", "kind": "HardCompletionGate", "binding": true }, { - "from": "requirements/intakes/active/Lastenheft_Transactional-Form-Model.md", - "to": "requirements/intakes/active/Lastenheft_23_Documentation-Publishing-Closure.md", + "from": "requirements/intakes/archive/Lastenheft_Transactional-Form-Model.042-transactional-form-model.md", + "to": "requirements/intakes/archive/Lastenheft_23_Documentation-Publishing-Closure.043-documentation-publishing-closure.md", "kind": "PreferredSerialOrder", "binding": false } @@ -159,7 +161,7 @@ "schemaVersion": "1.0", "documentType": "TuiVisionExactBacklogSeparation", "canonicalManifest": "requirements/intakes/series/tui-vision-delivery/manifest.json", - "canonicalManifestSha256": "6c086db5c8ed9cd33e221210e68edd99546efb9acbe098d863fb18201ffb5ae9", + "canonicalManifestSha256": "268a3d3e37e279127f0fcfc099e7761df0443dc4c9625392a70441c619bdf894", "intakePath": "requirements/intakes/backlog/Lastenheft_Optional-NuGet-Package.md", "intakeSha256": "471fd71020250310afb4093cd25a5f1baaddc57e31e1c9fbf1f9a8d97c5a4dba", "status": "DeferredOptional", diff --git a/scripts/tests/requirements-intake-alignment-tests.mjs b/scripts/tests/requirements-intake-alignment-tests.mjs index b8c0ce30..8684cfb0 100644 --- a/scripts/tests/requirements-intake-alignment-tests.mjs +++ b/scripts/tests/requirements-intake-alignment-tests.mjs @@ -90,7 +90,9 @@ fs.mkdirSync(activeFeatureDirectory, {recursive: true}); const activeFeaturePath = "specs/043-documentation-publishing-closure"; const bindingIntake = "requirements/intakes/active/Lastenheft_23_Documentation-Publishing-Closure.md"; -const bindingHash = awaitDigest(fs.readFileSync(path.join(root, bindingIntake), "utf8")); +const archivedBindingIntake = + "requirements/intakes/archive/Lastenheft_23_Documentation-Publishing-Closure.043-documentation-publishing-closure.md"; +const bindingHash = awaitDigest(fs.readFileSync(path.join(root, archivedBindingIntake), "utf8")); fs.writeFileSync( path.join(activeFeatureDirectory, "spec.md"), `# Authorized Feature\n\n**Binding Intake**: \`${bindingIntake}\`\n`); @@ -100,7 +102,7 @@ fs.writeFileSync( featurePath: activeFeaturePath, branch: "043-documentation-publishing-closure", status: "Completed", - acceptedArtifacts: [{path: bindingIntake, sha256: bindingHash}], + acceptedArtifacts: [{path: archivedBindingIntake, sha256: bindingHash}], }, null, 2) + "\n"); const activeFeatureMetadata = path.join(temp, "authorized-feature.json"); fs.writeFileSync( @@ -148,7 +150,7 @@ expectFailure("pending intake injected into executable series", { status: "Eligible", }); }), -}, /series must contain exactly 10 unique active targets/); +}, /series must contain exactly 10 unique targets/); expectFailure("unauthorized feature", { featurePath: fixture("unauthorized-feature", ".specify/feature.json", (value) => { @@ -166,14 +168,14 @@ expectFailure("duplicate target", { manifestPath: fixture("duplicate-target", manifestSource, (value) => { value.orderedTargets.push({...value.orderedTargets[0]}); }), -}, /unique active targets/); +}, /unique targets/); expectFailure("backlog target", { manifestPath: fixture("backlog-target", manifestSource, (value) => { value.orderedTargets[6].path = "requirements/intakes/backlog/Lastenheft_Optional-NuGet-Package.md"; }), -}, /missing from the active intake directory|archive or backlog/); +}, /status does not match its collection|series target is missing/); expectFailure("unexpected eligible", { manifestPath: fixture("unexpected-eligible", manifestSource, (value) => { @@ -185,7 +187,7 @@ expectFailure("incomplete Wave-6 closure", { manifestPath: fixture("incomplete-wave6", manifestSource, (value) => { value.orderedTargets[0].status = "Pending"; }), -}, /Wave-6 closure must remain Completed|declared Eligible target still has a binding blocker/); +}, /status does not match its collection|completed delivery series must retain only Completed targets/); expectFailure("stale target hash", { manifestPath: fixture("stale-hash", manifestSource, (value) => { @@ -202,6 +204,21 @@ expectFailure("missing receipt target without completed archive successor", { }), }, /lacks one completed archive successor/); +expectFailure("standalone receipt with foreign series claim", { + receiptsPath: receiptsFixture("foreign-series-receipt", (receiptsPath) => { + const receiptPath = path.join(receiptsPath, "Lastenheft_Example-Portfolio-Closure.receipt.json"); + const receipt = JSON.parse(fs.readFileSync(receiptPath, "utf8")); + receipt.series = { + seriesId: "00000000-0000-4000-8000-000000000001", + manifestPath: "requirements/intakes/series/foreign/manifest.json", + order: 1, + role: "OrderedMember", + supersedesIntakeIds: [], + }; + fs.writeFileSync(receiptPath, JSON.stringify(receipt, null, 2) + "\n"); + }), +}, /lacks one completed archive successor/); + expectFailure("invalid dependency cycle", { manifestPath: fixture("dependency-cycle", manifestSource, (value) => { value.dependencies.push({ @@ -218,7 +235,7 @@ expectFailure("dangling target", { manifestPath: fixture("dangling-target", manifestSource, (value) => { value.orderedTargets[6].path = "requirements/intakes/active/Missing.md"; }), -}, /missing from the active intake directory|target is missing/); +}, /status does not match its collection|target is missing/); expectFailure("duplicate requirement ID", { coveragePath: fixture("duplicate-id", coverageSource, (value) => { @@ -244,7 +261,7 @@ const exactFixturePath = "scripts/tests/linked-intake-evidence/tuivision-exact.j const exact = JSON.parse(fs.readFileSync(path.join(root, exactFixturePath), "utf8")); const exactManifestText = fs.readFileSync(path.join(root, manifestSource), "utf8"); const exactManifest = JSON.parse(exactManifestText); -const mapping = exact.activeMapping; +const mapping = exact.seriesMapping; const tuples = exact.dependencyTuples; const backlog = exact.backlog; @@ -253,8 +270,9 @@ if (awaitDigest(exactManifestText) !== mapping.canonicalManifestSha256 || mapping.canonicalManifestSha256 !== backlog.canonicalManifestSha256) { throw new Error("exact fixture does not bind the current canonical manifest"); } -if (mapping.mappings.length !== mapping.expectedActiveCount || - mapping.expectedActiveCount !== 10 || tuples.edges.length !== tuples.expectedEdgeCount || +if (mapping.mappings.length !== mapping.expectedSeriesTargetCount || + mapping.expectedSeriesTargetCount !== 10 || mapping.expectedActiveCount !== 0 || + mapping.expectedArchiveCount !== 38 || tuples.edges.length !== tuples.expectedEdgeCount || tuples.expectedEdgeCount !== 6) { throw new Error("exact fixture cardinality differs from the T056 lock"); } @@ -355,5 +373,5 @@ for (const outputPath of [ fs.rmSync(temp, {recursive: true, force: true}); console.log("requirements/intake positive fixtures PASS (3 cases)"); -console.log("requirements/intake negative fixtures PASS (17 cases)"); +console.log("requirements/intake negative fixtures PASS (18 cases)"); console.log("TuiVision exact linked-intake fixtures PASS (10 mappings, 6 edges, 1 latest completion, 1 backlog)"); diff --git a/scripts/validate-requirements-intake-alignment.mjs b/scripts/validate-requirements-intake-alignment.mjs index 6a9227b2..1a53e33c 100644 --- a/scripts/validate-requirements-intake-alignment.mjs +++ b/scripts/validate-requirements-intake-alignment.mjs @@ -20,6 +20,8 @@ export function validate(options = {}) { "requirements/intakes/series/tui-vision-delivery/intake-review-result.json"; const activePath = options.activePath ?? "requirements/intakes/active"; const receiptsPath = options.receiptsPath ?? "specs/intake-authoring-receipts"; + const exactFixturePath = options.exactFixturePath ?? + "scripts/tests/linked-intake-evidence/tuivision-exact.json"; const errors = []; const resolve = (candidate) => path.isAbsolute(candidate) ? candidate : path.join(root, candidate); const read = (relativePath) => fs.readFileSync(resolve(relativePath), "utf8"); @@ -29,6 +31,9 @@ export function validate(options = {}) { const coverage = parse(coveragePath); const manifest = parse(manifestPath); const review = parse(reviewPath); + const exact = parse(exactFixturePath); + const seriesMapping = exact.seriesMapping; + const expectedDependencyTuples = exact.dependencyTuples; const baselineHash = digest(read(baselinePath)); if (baselineHash !== coverage.source?.normalizedSha256) { @@ -55,23 +60,35 @@ export function validate(options = {}) { const active = fs.readdirSync(activeRoot).filter((name) => name.endsWith(".md")).sort(); const archived = fs.readdirSync(archiveRoot).filter((name) => name.endsWith(".md")).sort(); const rootLastenhefte = fs.readdirSync(root).filter((name) => /^Lastenheft.*\.md$/.test(name)); - if (archived.length !== 30) errors.push(`expected 30 archived intakes, found ${archived.length}`); + if (archived.length !== seriesMapping.expectedArchiveCount) { + errors.push(`expected ${seriesMapping.expectedArchiveCount} archived intakes, found ${archived.length}`); + } if (rootLastenhefte.join(",") !== "Lastenheft_Abarbeitungsreihenfolge.md") { errors.push("only the generated processing-order view may remain as root Lastenheft"); } const targets = manifest.orderedTargets ?? []; const targetPaths = targets.map((target) => target.path); - if (targetPaths.length !== 10 || new Set(targetPaths).size !== targetPaths.length) { - errors.push("series must contain exactly 10 unique active targets"); + if (targetPaths.length !== seriesMapping.expectedSeriesTargetCount || + new Set(targetPaths).size !== targetPaths.length) { + errors.push(`series must contain exactly ${seriesMapping.expectedSeriesTargetCount} unique targets`); + } + const activeSeriesTargets = targets.filter((target) => + target.path?.startsWith("requirements/intakes/active/")); + if (activeSeriesTargets.length !== seriesMapping.expectedActiveCount) { + errors.push(`expected ${seriesMapping.expectedActiveCount} active series targets, found ${activeSeriesTargets.length}`); } const expectedActive = active.map((name) => `requirements/intakes/active/${name}`).sort(); const targetSet = new Set(targetPaths); - const invalidLifecycleTargets = targets.filter((target) => - target.path?.includes("/backlog/") || - (target.path?.includes("/archive/") && target.status !== "Completed")); + const invalidLifecycleTargets = targets.filter((target) => { + const inActive = target.path?.startsWith("requirements/intakes/active/"); + const inArchive = target.path?.startsWith("requirements/intakes/archive/"); + return target.path?.includes("/backlog/") || + target.status === "Completed" && !inArchive || + target.status !== "Completed" && !inActive; + }); if (invalidLifecycleTargets.length > 0) { - errors.push(`archive or backlog target has an executable lifecycle: ${invalidLifecycleTargets.map((target) => target.path).join(", ")}`); + errors.push(`series target status does not match its collection: ${invalidLifecycleTargets.map((target) => target.path).join(", ")}`); } const reviewedTargets = new Set((review.targets ?? []).map((target) => target.path)); @@ -103,8 +120,11 @@ export function validate(options = {}) { target.normalizedSha256 === receiptHash && fs.existsSync(resolve(target.path)) && digest(read(target.path)) === receiptHash); - if (receipt.value.series?.seriesId !== manifest.seriesId || - completedArchiveMatches.length !== 1) { + const receiptSeries = receipt.value.series ?? {}; + const compatibleSeriesLineage = receiptSeries.seriesId === manifest.seriesId || + (receiptSeries.seriesId === "N/A" && receiptSeries.manifestPath === "N/A" && + receiptSeries.order === "N/A" && receiptSeries.role === "N/A"); + if (!compatibleSeriesLineage || completedArchiveMatches.length !== 1) { errors.push(`missing authoring receipt target lacks one completed archive successor: ${receiptTarget}`); } } @@ -148,70 +168,33 @@ export function validate(options = {}) { if (eligible.length !== 0) { errors.push("completed delivery series must not expose an Eligible target"); } - const wave6Closure = targets.find((target) => - target.path.endsWith("requirements/intakes/active/Lastenheft_22_Wave6-Combined-Delta-Closure.md")); - if (!wave6Closure || wave6Closure.status !== "Completed") { - errors.push("Wave-6 closure must remain Completed"); + if (manifest.status !== "Completed" || targets.some((target) => target.status !== "Completed")) { + errors.push("completed delivery series must retain only Completed targets"); } - const portfolio = targets.find((target) => - target.path.endsWith("requirements/intakes/active/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.md")); - if (!portfolio || portfolio.status !== "Completed") { - errors.push("post-Wave-6 portfolio audit must remain Completed"); + const expectedTargetPaths = seriesMapping.mappings.map((item) => item.intakePath); + if (JSON.stringify(targetPaths) !== JSON.stringify(expectedTargetPaths)) { + errors.push("series target order differs from the exact feature mapping"); } - - const portfolioClosure = targets.find((target) => - target.path.endsWith("requirements/intakes/active/Lastenheft_Example-Portfolio-Closure.md")); - const constitution = targets.find((target) => - target.path.endsWith("requirements/intakes/active/Lastenheft_Constitution_Change.md")); - const sourcePolicy = targets.find((target) => - target.path.endsWith("requirements/intakes/active/Lastenheft_Source-Reference-Policy.md")); - const formModel = targets.find((target) => - target.path.endsWith("requirements/intakes/active/Lastenheft_Transactional-Form-Model.md")); - const documentationClosure = targets.find((target) => - target.path.endsWith("requirements/intakes/active/Lastenheft_23_Documentation-Publishing-Closure.md")); - const sandboxHardening = targets.find((target) => - target.path.endsWith("requirements/intakes/active/Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.md")); - const rlSeReview = targets.find((target) => - target.path.endsWith("requirements/intakes/archive/Lastenheft_RL-SE-Checklist-Selbstpruefung.045-rl-se-checklist-self-review.md")); - const gsdbReview = targets.find((target) => - target.path.endsWith("requirements/intakes/archive/Lastenheft_GSDB-Spec-Kit-Intensivpruefung.046-gsdb-spec-kit-intensive-review.md")); - for (const [label, target] of [ - ["portfolio closure", portfolioClosure], - ["constitution change", constitution], - ["source-reference policy", sourcePolicy], - ["transactional form model", formModel], - ]) { - if (!target || target.status !== "Completed") { - errors.push(`${label} must remain Completed`); + for (const item of seriesMapping.mappings) { + const target = targets.find((candidate) => candidate.path === item.intakePath); + const featureDirectory = item.featurePath.replace(/\/$/, ""); + const state = parse(item.proofPath); + if (!target || target.status !== "Completed" || target.normalizedSha256 !== item.intakeSha256 || + !fs.existsSync(resolve(featureDirectory)) || state.featurePath !== featureDirectory || + state.branch !== path.basename(featureDirectory) || state.status !== "Completed" || + digest(read(item.proofPath)) !== item.proofSha256 || + !state.acceptedArtifacts?.some((artifact) => + artifact.path === item.intakePath && artifact.sha256 === item.intakeSha256)) { + errors.push(`exact feature mapping is invalid: ${item.intakePath}`); } } - if (!documentationClosure || documentationClosure.status !== "Completed") { - errors.push("documentation publishing closure must remain Completed"); - } - if (!sandboxHardening || sandboxHardening.status !== "Completed") { - errors.push("sandbox security hardening must remain Completed"); - } - if (!rlSeReview || rlSeReview.status !== "Completed") { - errors.push("RL-SE checklist self-review must remain Completed and archived"); - } - if (!gsdbReview || gsdbReview.status !== "Completed") { - errors.push("GSDB Spec Kit intensive review must remain Completed and archived"); - } const dependencies = manifest.dependencies ?? []; - const expectedDependencies = [ - [wave6Closure?.path, portfolio?.path, "HardCompletionGate", true], - [portfolio?.path, portfolioClosure?.path, "HardCompletionGate", true], - [constitution?.path, sourcePolicy?.path, "SharedWriterSerialization", false], - [sourcePolicy?.path, formModel?.path, "HardCompletionGate", true], - [portfolioClosure?.path, formModel?.path, "HardCompletionGate", true], - [formModel?.path, documentationClosure?.path, "PreferredSerialOrder", false], - ]; const dependencyKeys = new Set(dependencies.map((edge) => `${edge.from}|${edge.to}|${edge.kind}|${edge.binding}`)); - if (dependencies.length !== expectedDependencies.length || - expectedDependencies.some(([from, to, kind, binding]) => - !dependencyKeys.has(`${from}|${to}|${kind}|${binding}`))) { + if (dependencies.length !== expectedDependencyTuples.expectedEdgeCount || + expectedDependencyTuples.edges.some((edge) => + !dependencyKeys.has(`${edge.from}|${edge.to}|${edge.kind}|${edge.binding}`))) { errors.push("series must contain the exact six approved delivery dependencies"); } const indegree = new Map(targetPaths.map((target) => [target, 0])); @@ -244,7 +227,7 @@ export function validate(options = {}) { const order = read("Lastenheft_Abarbeitungsreihenfolge.md"); const index = read("Pflichtenheft.md"); for (const target of targetPaths) { - if (!order.includes(target)) errors.push(`processing order omits active target: ${target}`); + if (!order.includes(target)) errors.push(`processing order omits series target: ${target}`); } if (!index.includes(manifestPath)) errors.push("Pflichtenheft index omits canonical manifest"); if (/\[[ xX-]\]/.test(index)) errors.push("slim Pflichtenheft must not contain progress checkboxes"); diff --git a/specs/037-wave6-combined-delta-closure/autonomous-run-state.json b/specs/037-wave6-combined-delta-closure/autonomous-run-state.json index 8691f324..4e542517 100644 --- a/specs/037-wave6-combined-delta-closure/autonomous-run-state.json +++ b/specs/037-wave6-combined-delta-closure/autonomous-run-state.json @@ -10,7 +10,7 @@ "checkpointCommit": "246d9ddf7f63c8429f0ad1c61ab9452cfd59bfab", "acceptedArtifacts": [ { - "path": "requirements/intakes/active/Lastenheft_22_Wave6-Combined-Delta-Closure.md", + "path": "requirements/intakes/archive/Lastenheft_22_Wave6-Combined-Delta-Closure.037-wave6-combined-delta-closure.md", "sha256": "1b8ac280514c3415dfa51f2807f2b9183e51cd46b446d59980974cdce0ac70ad" }, { diff --git a/specs/038-example-portfolio-conformance-audit/autonomous-run-state.json b/specs/038-example-portfolio-conformance-audit/autonomous-run-state.json index 16995c0d..5159f0ad 100644 --- a/specs/038-example-portfolio-conformance-audit/autonomous-run-state.json +++ b/specs/038-example-portfolio-conformance-audit/autonomous-run-state.json @@ -10,7 +10,7 @@ "checkpointCommit": "ca0cdf413187efd4710a6bf6436f1863c67bcdcd", "acceptedArtifacts": [ { - "path": "requirements/intakes/active/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.md", + "path": "requirements/intakes/archive/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.038-example-portfolio-conformance-audit.md", "sha256": "f46be28ad27bb2dd5644390a7d50bed4912b514ce924e58bfd304135b33c0ad2" }, { diff --git a/specs/039-example-portfolio-closure/autonomous-run-state.json b/specs/039-example-portfolio-closure/autonomous-run-state.json index 310c8668..ecbf13df 100644 --- a/specs/039-example-portfolio-closure/autonomous-run-state.json +++ b/specs/039-example-portfolio-closure/autonomous-run-state.json @@ -10,7 +10,7 @@ "checkpointCommit": "19450fa383abfbdf71268f09ab6d67395deb98e1", "acceptedArtifacts": [ { - "path": "requirements/intakes/active/Lastenheft_Example-Portfolio-Closure.md", + "path": "requirements/intakes/archive/Lastenheft_Example-Portfolio-Closure.039-example-portfolio-closure.md", "sha256": "f5dc617b7c20d718304bb91f7f63d4a95d5c27cf09a7d0a4685a3bc4a824ab1a" }, { diff --git a/specs/040-constitution-governance-closure/autonomous-run-state.json b/specs/040-constitution-governance-closure/autonomous-run-state.json index f0d579a9..effaca89 100644 --- a/specs/040-constitution-governance-closure/autonomous-run-state.json +++ b/specs/040-constitution-governance-closure/autonomous-run-state.json @@ -10,7 +10,7 @@ "checkpointCommit": "19450fa383abfbdf71268f09ab6d67395deb98e1", "acceptedArtifacts": [ { - "path": "requirements/intakes/active/Lastenheft_Constitution_Change.md", + "path": "requirements/intakes/archive/Lastenheft_Constitution_Change.040-constitution-governance-closure.md", "sha256": "b7dbf455ff4e84b336ffe3cca3ff184e1897860592d4f53fb52f1776e7eb9e91" } ], diff --git a/specs/041-source-reference-policy/autonomous-run-state.json b/specs/041-source-reference-policy/autonomous-run-state.json index 86acec78..9e35553a 100644 --- a/specs/041-source-reference-policy/autonomous-run-state.json +++ b/specs/041-source-reference-policy/autonomous-run-state.json @@ -10,7 +10,7 @@ "checkpointCommit": "19450fa383abfbdf71268f09ab6d67395deb98e1", "acceptedArtifacts": [ { - "path": "requirements/intakes/active/Lastenheft_Source-Reference-Policy.md", + "path": "requirements/intakes/archive/Lastenheft_Source-Reference-Policy.041-source-reference-policy.md", "sha256": "a59e9588363e385c19d48c361df9ebb019323cf25865672dd77152292e8d2776" }, { diff --git a/specs/042-transactional-form-model/autonomous-run-state.json b/specs/042-transactional-form-model/autonomous-run-state.json index 4d4711c2..b01ced29 100644 --- a/specs/042-transactional-form-model/autonomous-run-state.json +++ b/specs/042-transactional-form-model/autonomous-run-state.json @@ -10,7 +10,7 @@ "checkpointCommit": "337a9cfe70bfc7ec25385eaa257b13f5e463bfed", "acceptedArtifacts": [ { - "path": "requirements/intakes/active/Lastenheft_Transactional-Form-Model.md", + "path": "requirements/intakes/archive/Lastenheft_Transactional-Form-Model.042-transactional-form-model.md", "sha256": "45d8f8b589c3d9fd417f9b8dc9d25d09c0597f02c075b04454bbce95e095a239" }, { diff --git a/specs/043-documentation-publishing-closure/autonomous-run-state.json b/specs/043-documentation-publishing-closure/autonomous-run-state.json index a2a910ab..9f4b00b1 100644 --- a/specs/043-documentation-publishing-closure/autonomous-run-state.json +++ b/specs/043-documentation-publishing-closure/autonomous-run-state.json @@ -10,7 +10,7 @@ "checkpointCommit": "4c701d80ec4b72c9d1cba27fb24dd95fb0090e9a", "acceptedArtifacts": [ { - "path": "requirements/intakes/active/Lastenheft_23_Documentation-Publishing-Closure.md", + "path": "requirements/intakes/archive/Lastenheft_23_Documentation-Publishing-Closure.043-documentation-publishing-closure.md", "sha256": "df5f1876c781632c13594e9ec60c3cc8f9408c586ac03aeb48aa87442987878c" }, { diff --git a/specs/044-sandbox-secure-development-hardening/autonomous-run-state.json b/specs/044-sandbox-secure-development-hardening/autonomous-run-state.json index 9d974d6e..ab08123b 100644 --- a/specs/044-sandbox-secure-development-hardening/autonomous-run-state.json +++ b/specs/044-sandbox-secure-development-hardening/autonomous-run-state.json @@ -10,7 +10,7 @@ "checkpointCommit": "65c04619a824f253961b58567aa4945554c22b8f", "acceptedArtifacts": [ { - "path": "requirements/intakes/active/Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.md", + "path": "requirements/intakes/archive/Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.044-sandbox-secure-development-hardening.md", "sha256": "d1f6a20535f90b78d00f7f6974a32156d7c08eeb77ebad9961a41ffbe3f84858" }, { diff --git a/specs/intake-series-archive/a73dda7c-163b-4530-97f2-fd9eea5e8986/3fff6099-cd3b-47c1-985b-c816300dd47a/manifest.json b/specs/intake-series-archive/a73dda7c-163b-4530-97f2-fd9eea5e8986/3fff6099-cd3b-47c1-985b-c816300dd47a/manifest.json new file mode 100644 index 00000000..f8aa3d9e --- /dev/null +++ b/specs/intake-series-archive/a73dda7c-163b-4530-97f2-fd9eea5e8986/3fff6099-cd3b-47c1-985b-c816300dd47a/manifest.json @@ -0,0 +1,120 @@ +{ + "schemaVersion": "1.0", + "documentType": "IntakeSeriesManifest", + "seriesId": "a73dda7c-163b-4530-97f2-fd9eea5e8986", + "title": "TuiVision Delivery Intake Series", + "policy": "tui-vision-delivery-v1", + "status": "Completed", + "orderedTargets": [ + { + "path": "requirements/intakes/active/Lastenheft_22_Wave6-Combined-Delta-Closure.md", + "role": "OrderedMember", + "normalizedSha256": "1b8ac280514c3415dfa51f2807f2b9183e51cd46b446d59980974cdce0ac70ad", + "status": "Completed" + }, + { + "path": "requirements/intakes/active/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.md", + "role": "OrderedMember", + "normalizedSha256": "f46be28ad27bb2dd5644390a7d50bed4912b514ce924e58bfd304135b33c0ad2", + "status": "Completed" + }, + { + "path": "requirements/intakes/active/Lastenheft_Example-Portfolio-Closure.md", + "role": "Primary", + "normalizedSha256": "f5dc617b7c20d718304bb91f7f63d4a95d5c27cf09a7d0a4685a3bc4a824ab1a", + "status": "Completed" + }, + { + "path": "requirements/intakes/active/Lastenheft_Constitution_Change.md", + "role": "OrderedMember", + "normalizedSha256": "b7dbf455ff4e84b336ffe3cca3ff184e1897860592d4f53fb52f1776e7eb9e91", + "status": "Completed" + }, + { + "path": "requirements/intakes/active/Lastenheft_Source-Reference-Policy.md", + "role": "OrderedMember", + "normalizedSha256": "a59e9588363e385c19d48c361df9ebb019323cf25865672dd77152292e8d2776", + "status": "Completed" + }, + { + "path": "requirements/intakes/active/Lastenheft_Transactional-Form-Model.md", + "role": "OrderedMember", + "normalizedSha256": "45d8f8b589c3d9fd417f9b8dc9d25d09c0597f02c075b04454bbce95e095a239", + "status": "Completed" + }, + { + "path": "requirements/intakes/active/Lastenheft_23_Documentation-Publishing-Closure.md", + "role": "OrderedMember", + "normalizedSha256": "df5f1876c781632c13594e9ec60c3cc8f9408c586ac03aeb48aa87442987878c", + "status": "Completed" + }, + { + "path": "requirements/intakes/active/Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.md", + "role": "OrderedMember", + "normalizedSha256": "d1f6a20535f90b78d00f7f6974a32156d7c08eeb77ebad9961a41ffbe3f84858", + "status": "Completed" + }, + { + "path": "requirements/intakes/archive/Lastenheft_RL-SE-Checklist-Selbstpruefung.045-rl-se-checklist-self-review.md", + "role": "OrderedMember", + "normalizedSha256": "62fadb9f571f6c6e5fb81badd103f5ca5087c7219698fdec7be708196d6d6863", + "status": "Completed" + }, + { + "path": "requirements/intakes/archive/Lastenheft_GSDB-Spec-Kit-Intensivpruefung.046-gsdb-spec-kit-intensive-review.md", + "role": "OrderedMember", + "normalizedSha256": "97d31e6eac5c2e5defeae1dd29bc5c97ddb8ba43b75106768dfe4b703c6d802d", + "status": "Completed" + } + ], + "roots": [ + "requirements/intakes/active/Lastenheft_22_Wave6-Combined-Delta-Closure.md", + "requirements/intakes/active/Lastenheft_Constitution_Change.md", + "requirements/intakes/active/Lastenheft_Sandbox-gestuetzte-Secure-Development-Haertung.md", + "requirements/intakes/archive/Lastenheft_RL-SE-Checklist-Selbstpruefung.045-rl-se-checklist-self-review.md", + "requirements/intakes/archive/Lastenheft_GSDB-Spec-Kit-Intensivpruefung.046-gsdb-spec-kit-intensive-review.md" + ], + "dependencies": [ + { + "from": "requirements/intakes/active/Lastenheft_22_Wave6-Combined-Delta-Closure.md", + "to": "requirements/intakes/active/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.md", + "kind": "HardCompletionGate", + "binding": true + }, + { + "from": "requirements/intakes/active/Lastenheft_15_Post-Wave6-Example-Portfolio-Conformance-Audit.md", + "to": "requirements/intakes/active/Lastenheft_Example-Portfolio-Closure.md", + "kind": "HardCompletionGate", + "binding": true + }, + { + "from": "requirements/intakes/active/Lastenheft_Constitution_Change.md", + "to": "requirements/intakes/active/Lastenheft_Source-Reference-Policy.md", + "kind": "SharedWriterSerialization", + "binding": false + }, + { + "from": "requirements/intakes/active/Lastenheft_Source-Reference-Policy.md", + "to": "requirements/intakes/active/Lastenheft_Transactional-Form-Model.md", + "kind": "HardCompletionGate", + "binding": true + }, + { + "from": "requirements/intakes/active/Lastenheft_Example-Portfolio-Closure.md", + "to": "requirements/intakes/active/Lastenheft_Transactional-Form-Model.md", + "kind": "HardCompletionGate", + "binding": true + }, + { + "from": "requirements/intakes/active/Lastenheft_Transactional-Form-Model.md", + "to": "requirements/intakes/active/Lastenheft_23_Documentation-Publishing-Closure.md", + "kind": "PreferredSerialOrder", + "binding": false + } + ], + "evidencePaths": [ + "specs/requirements-reconciliation-20260726/requirements-coverage.json", + "specs/requirements-reconciliation-20260726/migration-proposal.json", + "Lastenheft_Abarbeitungsreihenfolge.md" + ] +} diff --git a/specs/intake-series-archive/a73dda7c-163b-4530-97f2-fd9eea5e8986/3fff6099-cd3b-47c1-985b-c816300dd47a/receipt.json b/specs/intake-series-archive/a73dda7c-163b-4530-97f2-fd9eea5e8986/3fff6099-cd3b-47c1-985b-c816300dd47a/receipt.json new file mode 100644 index 00000000..e42c9451 --- /dev/null +++ b/specs/intake-series-archive/a73dda7c-163b-4530-97f2-fd9eea5e8986/3fff6099-cd3b-47c1-985b-c816300dd47a/receipt.json @@ -0,0 +1,32 @@ +{ + "schemaVersion": "1.0", + "documentType": "IntakeSeriesReceipt", + "receiptId": "a76e7957-0b72-4c0b-b738-c88c3bc33885", + "seriesId": "a73dda7c-163b-4530-97f2-fd9eea5e8986", + "generator": { + "preset": "intake-sequencing-governance", + "version": "0.2.3" + }, + "createdAt": "2026-09-12T23:21:05Z", + "operation": { + "operationId": "0326e087-08a7-4318-a54d-6b4bf5993017", + "type": "Update", + "authorityEvidence": "Explicit user authority for completed-series lifecycle reconciliation" + }, + "status": "Ready", + "manifest": { + "path": "requirements/intakes/series/tui-vision-delivery/manifest.json", + "normalizedSha256": "6c086db5c8ed9cd33e221210e68edd99546efb9acbe098d863fb18201ffb5ae9" + }, + "supersedes": { + "receiptPath": "specs/intake-series-archive/a73dda7c-163b-4530-97f2-fd9eea5e8986/0326e087-08a7-4318-a54d-6b4bf5993017/receipt.json", + "receiptNormalizedSha256": "eb64ab26a6e0d4fd9ab92039f61a31612cbda4ac1cd4978fabfb3ab220f71136", + "manifestArchivePath": "specs/intake-series-archive/a73dda7c-163b-4530-97f2-fd9eea5e8986/0326e087-08a7-4318-a54d-6b4bf5993017/manifest.json", + "manifestArchiveSha256": "538d12fcc60cab96e5d70865a9ab9c31885634f3981e1c10dc2cd09d1ee2d2e7" + }, + "tombstone": { + "path": "N/A", + "normalizedSha256": "N/A" + }, + "nextAction": "$speckit-intake-series-status" +} From 98b0f28e1dfb5f756eacd1a3a6f431b167527bc8 Mon Sep 17 00:00:00 2001 From: Thorsten Hindermann Date: Sun, 13 Sep 2026 02:24:03 +0200 Subject: [PATCH 2/3] test: cover absent active intake directory --- scripts/tests/requirements-intake-alignment-tests.mjs | 6 +++++- scripts/validate-requirements-intake-alignment.mjs | 4 +++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/scripts/tests/requirements-intake-alignment-tests.mjs b/scripts/tests/requirements-intake-alignment-tests.mjs index 8684cfb0..f3e91430 100644 --- a/scripts/tests/requirements-intake-alignment-tests.mjs +++ b/scripts/tests/requirements-intake-alignment-tests.mjs @@ -82,6 +82,10 @@ function awaitDigest(value) { if (validate({root}).length !== 0) throw new Error("positive fixture failed"); +expectSuccess("completed series without physical active directory", { + activePath: path.join(temp, "absent-active-collection"), +}); + const pending = pendingIntakeFixture("valid-pending"); expectSuccess("valid authored pending intake", pending); @@ -372,6 +376,6 @@ for (const outputPath of [ } fs.rmSync(temp, {recursive: true, force: true}); -console.log("requirements/intake positive fixtures PASS (3 cases)"); +console.log("requirements/intake positive fixtures PASS (4 cases)"); console.log("requirements/intake negative fixtures PASS (18 cases)"); console.log("TuiVision exact linked-intake fixtures PASS (10 mappings, 6 edges, 1 latest completion, 1 backlog)"); diff --git a/scripts/validate-requirements-intake-alignment.mjs b/scripts/validate-requirements-intake-alignment.mjs index 1a53e33c..b4efb798 100644 --- a/scripts/validate-requirements-intake-alignment.mjs +++ b/scripts/validate-requirements-intake-alignment.mjs @@ -57,7 +57,9 @@ export function validate(options = {}) { const activeRoot = resolve(activePath); const archiveRoot = path.join(root, "requirements/intakes/archive"); - const active = fs.readdirSync(activeRoot).filter((name) => name.endsWith(".md")).sort(); + const active = fs.existsSync(activeRoot) + ? fs.readdirSync(activeRoot).filter((name) => name.endsWith(".md")).sort() + : []; const archived = fs.readdirSync(archiveRoot).filter((name) => name.endsWith(".md")).sort(); const rootLastenhefte = fs.readdirSync(root).filter((name) => /^Lastenheft.*\.md$/.test(name)); if (archived.length !== seriesMapping.expectedArchiveCount) { From d7cd2c63bc0d8925104a6a7bd0c6aadb27b1fc5f Mon Sep 17 00:00:00 2001 From: Thorsten Hindermann Date: Sun, 13 Sep 2026 02:27:13 +0200 Subject: [PATCH 3/3] docs: refresh project statistics --- docs/project-statistics.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/project-statistics.md b/docs/project-statistics.md index bd162880..751f4ffa 100644 --- a/docs/project-statistics.md +++ b/docs/project-statistics.md @@ -1144,29 +1144,29 @@ Profil 2 verwendet Git-getrackte Textdateien und sichtbare Git-Aktivitaet. Die W | Kennzahl / Metric | Wert / Value | |---|---:| -| Textbasis / Text base | 726140 lines | -| Textdateien / Text files | 3383 | +| Textbasis / Text base | 726505 lines | +| Textdateien / Text files | 3385 | | Beobachtbarer Zeitraum / Observable period | 2025-09-21..2026-09-13 | | Aktivtage / Active days | 97 | -| Relevante Commits / Relevant commits | 593 | -| Zeilen je Aktivtag / Lines per active day | 7486.0 | +| Relevante Commits / Relevant commits | 595 | +| Zeilen je Aktivtag / Lines per active day | 7489.7 | | Peak-Tag im Fenster / Peak day in window | 2026-03-22 / 321183 | | Peak-Woche im Fenster / Peak week in window | 2026-03-22 / 373576 | | Laengste Serie / Longest streak | 17 days | | Speedup vs. 80 lines/day | 93.6x | | Speedup vs. 125 lines/day | 59.9x | -| Methodik / Methodology | v2; source `aa0e56db99bc` | +| Methodik / Methodology | v2; source `98b0f28e1dfb` | ### Artefaktmix / Artifact Mix ```text Produktiv / Production [####................] 19.2% | 139704 -Tests [#...................] 7.5% | 54317 -Dokumentation / Documentation [##########..........] 50.5% | 366545 -Skripte / Scripts [#...................] 3.2% | 23417 -Konfiguration / Configuration [#...................] 5.8% | 42291 +Tests [#...................] 7.5% | 54341 +Dokumentation / Documentation [##########..........] 50.5% | 366697 +Skripte / Scripts [#...................] 3.2% | 23414 +Konfiguration / Configuration [#...................] 5.8% | 42483 Daten und Medien / Data and media [#...................] 0.0% | 1 -Sonstiger Text / Other text [###.................] 13.8% | 99865 +Sonstiger Text / Other text [###.................] 13.7% | 99865 ``` Die Balken teilen die aktuelle getrackte Textbasis in stabile Kategorien. Prozent und Zeilenwert sind die genaue, textorientierte Aussage. @@ -1381,7 +1381,7 @@ Die Faktoren vergleichen sichtbare Lieferdichte mit den dokumentierten manuellen Scale: 0..10000 lines/day Experienced manual [#...................] 80 Thorsten solo [#...................] 125 -Visible repository [###############.....] 7486.0 +Visible repository [###############.....] 7489.7 ``` Die gemeinsame Skala vergleicht Referenzen und sichtbare Lieferdichte. Sie schreibt die Git-Aktivitaet keiner Person oder KI pauschal zu. @@ -1407,6 +1407,6 @@ DE: Das Fenster beginnt am 2025-09-21 und endet am 2026-09-13. Es enthaelt 97 ak | 2026-06 | 42176 | | 2026-07 | 205615 | | 2026-08 | 122136 | -| 2026-09 | 24327 | +| 2026-09 | 25370 |