From 0f88d3b3016af69aabe35746ee9925d3fb393909 Mon Sep 17 00:00:00 2001 From: axiomlogicnexus Date: Wed, 27 May 2026 01:48:01 +0200 Subject: [PATCH] Intake cubing scramble successor surfaces --- ..._REPO_LICENSE_EVIDENCE_AUDIT_2026-05-27.md | 13 +- docs/REPO_LICENSE_TRACKING.md | 120 ++++++++++++++++++ ...REPO_LICENSE_EVIDENCE_AUDIT_2026-05-27.csv | 3 + ..._AND_LEGAL_EVIDENCE_SEQUENCE_2026-05-26.md | 8 ++ .../HyperTwist/LICENSETRACKING.md | 7 + ...ite-HyperTwistRepoLicenseEvidenceAudit.ps1 | 71 +++++++++-- 6 files changed, 210 insertions(+), 12 deletions(-) diff --git a/docs/HYPERTWIST_REPO_LICENSE_EVIDENCE_AUDIT_2026-05-27.md b/docs/HYPERTWIST_REPO_LICENSE_EVIDENCE_AUDIT_2026-05-27.md index 929a765..fbebb71 100644 --- a/docs/HYPERTWIST_REPO_LICENSE_EVIDENCE_AUDIT_2026-05-27.md +++ b/docs/HYPERTWIST_REPO_LICENSE_EVIDENCE_AUDIT_2026-05-27.md @@ -11,13 +11,14 @@ Boundary: - when later repos are mirrored or their root-license evidence changes, rerun `C:\HyperTwist\scripts\Write-HyperTwistRepoLicenseEvidenceAudit.ps1` in the same pass that updates the legal tracker Counts: -- total deduped repos scanned: 66 -- clear repo-local license file or explicit mixed root-license declaration: 59 +- total deduped repos scanned: 69 +- clear repo-local license file or explicit mixed root-license declaration: 60 - MIT with clear root license file: 33 - MIT from README only, no root license file: 1 - MIT from repo metadata only, no root license file: 1 -- no clear repo-local license signal: 5 -- no-clear bucket where current HyperTwist manifest already carries a legal call: 5 +- non-MIT license from repo metadata only, no root license file: 1 +- no clear repo-local license signal: 6 +- no-clear bucket where current HyperTwist manifest already carries a legal call: 6 - package-subpath rows normalized under parent root authority: 11 - historical alias rows outside active mirror expectation: 1 - unresolved upstream-unavailable, missing, or unrelated non-standalone rows outside the live standalone count: 0 @@ -34,10 +35,14 @@ MIT without root license file - README only: MIT without root license file - metadata only: - pmndrs/maath +Non-MIT license from repo metadata only, no root license file: +- cubing/scramble.cubing.net - signal: GPL-3.0-or-later via `package.json` + No clear repo-local license signal: - alinen/cube - current manifest call: `No explicit license found` - ambisinister/blindsolve - current manifest call: `No explicit license found` - AviKaufman/Rubix-cube-trainer - current manifest call: `All rights reserved` +- cubing/mark3 - current manifest call: `No explicit license found` - cubing/qqTimer - current manifest call: `No explicit license found` - poliva/cubedex - current manifest call: `No explicit license found` diff --git a/docs/REPO_LICENSE_TRACKING.md b/docs/REPO_LICENSE_TRACKING.md index 6209181..ce2705d 100644 --- a/docs/REPO_LICENSE_TRACKING.md +++ b/docs/REPO_LICENSE_TRACKING.md @@ -704,6 +704,8 @@ Current licensing judgment: - `cubing/cubing.js` via `cubing/scramble` - `cubing/scramble.cubing.net` - `cubing/mark3` +- when HyperTwist retains those successor repos directly, track them as their + own repo rows rather than blurring them back into this alias row - direct donor use is not cleared - keep this row as a historical alias only, not as an active mirror-restoration target @@ -733,6 +735,124 @@ Approved working posture: - do not let it keep the mirror audit in an unresolved state when maintained public scramble sources are already elsewhere in the cubing family +### `cubing/mark3` + +Decision date: + +- `2026-05-27` + +Current licensing judgment: + +- the repo is now mirrored locally +- no explicit repo-root license file is visible at the checked mirror root +- the checked root surface currently lacks a standalone `LICENSE`, `COPYING`, + or `NOTICE` file +- the checked `package.json` does not declare a repo license +- treat the row as restrictive custody and `license-missing` +- direct donor use is not cleared +- retain as a scramble-generation clean-room candidate only + +Source basis: + +- `C:\Workspaces\HyperTwist\mirrors\restrictive\cubing\mark3\README.md` +- `C:\Workspaces\HyperTwist\mirrors\restrictive\cubing\mark3\package.json` +- `C:\Workspaces\HyperTwist\mirrors\restrictive\cubing\mark3\src\scramble-generation\index.ts` +- `C:\Workspaces\HyperTwist\mirrors\restrictive\cubing\mark3\src\fixtures\testCompetitionScramblesSpec.ts` + +Practical obligations: + +- keep the mirror in restrictive custody +- do not assume permissive terms from the public repo visibility alone +- Model B must not read this mirror +- if a later source-backed license basis appears, reopen this row selectively + instead of silently flattening it into permissive custody + +Approved working posture: + +- retain as a scramble-generation architecture reference and clean-room + candidate only +- use it for source inspection, seeded workflow reference, and independently + owned reimplementation planning +- do not widen from the mirror as a normal permissive donor lane + +### `cubing/scramble.cubing.net` + +Decision date: + +- `2026-05-27` + +Current licensing judgment: + +- the repo is now mirrored locally +- no explicit repo-root license file is visible at the checked mirror root +- the checked root surface currently lacks a standalone `LICENSE`, `COPYING`, + or `NOTICE` file +- the checked `package.json` declares `GPL-3.0-or-later` +- treat that as repo-local metadata-only license evidence, not as the same tier + as a clear root license file +- keep the row in restrictive custody and treat it as strong copyleft +- direct donor use is not cleared + +Source basis: + +- `C:\Workspaces\HyperTwist\mirrors\restrictive\cubing\scramble.cubing.net\package.json` +- `C:\Workspaces\HyperTwist\mirrors\restrictive\cubing\scramble.cubing.net\README.md` +- `C:\Workspaces\HyperTwist\mirrors\restrictive\cubing\scramble.cubing.net\src\scramble.ts` +- `C:\Workspaces\HyperTwist\mirrors\restrictive\cubing\scramble.cubing.net\src\index.html` + +Practical obligations: + +- keep the mirror in restrictive custody +- preserve the distinction between metadata-only license evidence and a clear + repo-root license file +- Model B must not read this mirror +- do not treat the public webapp shell as permission for direct donor reuse + +Approved working posture: + +- retain as a scramble-webapp behavior reference and clean-room candidate only +- use it for source inspection, event-selection UX reference, refresh-workflow + comparison, and independently owned reimplementation planning +- do not widen from the mirror as a normal permissive or direct-integration + lane + +### `cubing/scramble-display` + +Decision date: + +- `2026-05-27` + +Current licensing judgment: + +- the repo is now mirrored locally +- the checked root `LICENSE.md` resolves to `GPL-3.0-or-later` +- keep the row in restrictive custody and treat it as strong copyleft +- the repo is scramble-display specific and sits above already tracked cubing.js + and twisty.js surfaces +- direct donor use is not cleared + +Source basis: + +- `C:\Workspaces\HyperTwist\mirrors\restrictive\cubing\scramble-display\LICENSE.md` +- `C:\Workspaces\HyperTwist\mirrors\restrictive\cubing\scramble-display\README.md` +- `C:\Workspaces\HyperTwist\mirrors\restrictive\cubing\scramble-display\src\scramble-display\index.ts` +- `C:\Workspaces\HyperTwist\mirrors\restrictive\cubing\scramble-display\src\scramble-display\ScrambleDisplay.ts` + +Practical obligations: + +- keep the mirror in restrictive custody +- Model B must not read this mirror +- do not treat this wrapper surface as permission to bypass the stricter + cubing.js / twisty.js lane boundaries +- preserve it as a comparison surface rather than a direct donor-use approval + +Approved working posture: + +- retain as a scramble-visualization comparison surface only +- use it for source inspection, display-shell behavior reference, and bounded + clean-room planning if a first-party equivalent is ever needed +- do not widen from the mirror as a normal permissive donor lane + ### `onionhoney/roux-trainers` Decision date: diff --git a/docs/generated/license_audit/HYPERTWIST_REPO_LICENSE_EVIDENCE_AUDIT_2026-05-27.csv b/docs/generated/license_audit/HYPERTWIST_REPO_LICENSE_EVIDENCE_AUDIT_2026-05-27.csv index 5c24c98..b6b673e 100644 --- a/docs/generated/license_audit/HYPERTWIST_REPO_LICENSE_EVIDENCE_AUDIT_2026-05-27.csv +++ b/docs/generated/license_audit/HYPERTWIST_REPO_LICENSE_EVIDENCE_AUDIT_2026-05-27.csv @@ -14,7 +14,10 @@ "cs0x7f/cstimer","https://github.com/cs0x7f/cstimer.git","C:\Workspaces\HyperTwist\mirrors\restrictive\cs0x7f\cstimer","C:\Workspaces\HyperTwist\mirrors\restrictive\cs0x7f\cstimer","restrictive","GPL-3.0","strong-copyleft","1","LICENSE","","README.md","GPL-3.0-or-later","clear_repo_license_file","","LICENSE","","","","","Copyright (C) 2007 Free Software Foundation, Inc. ","d417cfcc5d7702b54ef8afcb843d87c5dfcfb69e","Manifest/tracker posture is narrower or more contextual than the root license signal." "cubing/alg.js","https://github.com/cubing/alg.js.git","C:\Workspaces\HyperTwist\mirrors\restrictive\cubing\alg.js","C:\Workspaces\HyperTwist\mirrors\restrictive\cubing\alg.js","restrictive","GPL-3.0-or-later","strong-copyleft","1","LICENSE.md","","README.md","GPL-3.0-or-later","clear_repo_license_file","","LICENSE.md","","","","","Copyright (C) 2007 Free Software Foundation, Inc.","1c2fd2bf2fb4204f5f2a195ee7bd2a04a9a7784c","" "cubing/cubing.js","https://github.com/cubing/cubing.js.git","C:\Workspaces\HyperTwist\mirrors\permissive\cubing\cubing.js","C:\Workspaces\HyperTwist\mirrors\permissive\cubing\cubing.js","permissive","MPL-2.0 OR GPL-3.0-or-later","dual-weak-copyleft-library-use-ok","2","LICENSE-GPL.md; LICENSE-MPL.md","","README.md","MPL-2.0 OR GPL-3.0-or-later","clear_repo_license_file","","LICENSE-GPL.md; LICENSE-MPL.md","","","","","Copyright (C) 2007 Free Software Foundation, Inc.","06faa3d74083646a93236e69e0f38cb23669ad34","" +"cubing/mark3","https://github.com/cubing/mark3.git","C:\Workspaces\HyperTwist\mirrors\restrictive\cubing\mark3","C:\Workspaces\HyperTwist\mirrors\restrictive\cubing\mark3","restrictive","No explicit license found","license-missing","0","","","README.md","no_clear_repo_local_license_signal","","","","","","","","","ce956c33c4cace52ecaf6c08edb2327cd040600f","Manifest/tracker carries the current legal call, but no standalone repo-local license signal was captured at the mirror root." "cubing/qqTimer","https://github.com/cubing/qqTimer.git","C:\Workspaces\HyperTwist\mirrors\restrictive\cubing\qqTimer","C:\Workspaces\HyperTwist\mirrors\restrictive\cubing\qqTimer","restrictive","No explicit license found","license-missing","0","","","README.md","no_clear_repo_local_license_signal","","","","","","","","","64786743d9e2a4f2bdeb9d1cff1ff97874fbac63","Manifest/tracker carries the current legal call, but no standalone repo-local license signal was captured at the mirror root." +"cubing/scramble-display","https://github.com/cubing/scramble-display.git","C:\Workspaces\HyperTwist\mirrors\restrictive\cubing\scramble-display","C:\Workspaces\HyperTwist\mirrors\restrictive\cubing\scramble-display","restrictive","GPL-3.0-or-later","strong-copyleft","1","LICENSE.md","","README.md","GPL-3.0-or-later","clear_repo_license_file","","LICENSE.md","","","","","Copyright (C) 2007 Free Software Foundation, Inc.","7447d5e31947d4804352a64dc828e7437ba9aa9f","" +"cubing/scramble.cubing.net","https://github.com/cubing/scramble.cubing.net.git","C:\Workspaces\HyperTwist\mirrors\restrictive\cubing\scramble.cubing.net","C:\Workspaces\HyperTwist\mirrors\restrictive\cubing\scramble.cubing.net","restrictive","GPL-3.0-or-later (package metadata only; no root license file)","strong-copyleft","0","","","README.md","GPL-3.0-or-later","metadata_only","","package.json","","","GPL-3.0-or-later","package.json","","863169dde94090e27fa3bbbb4e6184af3b91e14f","" "cubing/twisty.js","https://github.com/cubing/twisty.js.git","C:\Workspaces\HyperTwist\mirrors\restrictive\cubing\twisty.js","C:\Workspaces\HyperTwist\mirrors\restrictive\cubing\twisty.js","restrictive","GPL-3.0-or-later","strong-copyleft","1","LICENSE.md","","README.md","GPL-3.0-or-later","clear_repo_license_file","","LICENSE.md","","","","","Copyright (C) 2007 Free Software Foundation, Inc.","58ef9e07e253054ad1fd88f71823f0af76f2852f","" "cutelyaware/magiccube4d","https://github.com/cutelyaware/magiccube4d.git","C:\Workspaces\HyperTwist\mirrors\permissive\cutelyaware\magiccube4d","C:\Workspaces\HyperTwist\mirrors\permissive\cutelyaware\magiccube4d","permissive","Custom permissive attribution-request license","custom-permissive-attribution","1","LICENSE.md","","README.md","other_root_license_file","clear_repo_license_file","","LICENSE.md","","","","","Copyright (c) 2016 Melinda Green and Don Hatch","6761a9dff7fc23cd11c747f473d47e164c0d076f","Manifest/tracker posture is narrower or more contextual than the root license signal." "ecomfe/echarts-gl","https://github.com/ecomfe/echarts-gl.git","C:\Workspaces\HyperTwist\mirrors\permissive\ecomfe\echarts-gl","C:\Workspaces\HyperTwist\mirrors\permissive\ecomfe\echarts-gl","permissive","BSD-3-Clause","permissive","1","LICENSE","","README.md","BSD-family","clear_repo_license_file","","LICENSE","","","","","Copyright (c) 2017, Baidu Inc.","709273a186bed9d0271ac7efd49aafc275275626","Manifest/tracker posture is narrower or more contextual than the root license signal." diff --git a/docs/ops/HYPERTWIST_DEEP_SOURCE_CLOSEOUT_AND_LEGAL_EVIDENCE_SEQUENCE_2026-05-26.md b/docs/ops/HYPERTWIST_DEEP_SOURCE_CLOSEOUT_AND_LEGAL_EVIDENCE_SEQUENCE_2026-05-26.md index 3ada2c3..0485da6 100644 --- a/docs/ops/HYPERTWIST_DEEP_SOURCE_CLOSEOUT_AND_LEGAL_EVIDENCE_SEQUENCE_2026-05-26.md +++ b/docs/ops/HYPERTWIST_DEEP_SOURCE_CLOSEOUT_AND_LEGAL_EVIDENCE_SEQUENCE_2026-05-26.md @@ -75,6 +75,10 @@ For each resumed repo pass: public source surfaces already exist elsewhere, convert it into a historical alias row instead of keeping it in the active mirror-restoration queue +8ab. if HyperTwist later retains one or more of those maintained successor repos + directly, intake each successor as its own manifest row, mirror, legal + call, and audit entry instead of treating the historical alias row as a + substitute 8b. if a manifest row points at a package subpath inside a mirrored monorepo and the parent git root resolves to the same repo URL, normalize that row under the parent root authority in the generated audit instead of leaving it @@ -85,6 +89,10 @@ For each resumed repo pass: 10. if the `MIT` call is README-only or metadata-only, capture canonical `MIT` text in the MIT text folder and record the evidence path, source URL, and commit hash explicitly in the audit ledger and third-party notices draft +10a. if a non-`MIT` license is present only in repo-local package metadata and + no root license file exists, record that as metadata-only evidence in the + root tracker and generated audit, but keep it distinct from clear + repo-root license-file evidence 11. rerun: - `C:\HyperTwist\scripts\Write-HyperTwistRepoLicenseEvidenceAudit.ps1` 12. answer status questions by naming: diff --git a/docs/v6_5_deep_manual_pack/HyperTwist/LICENSETRACKING.md b/docs/v6_5_deep_manual_pack/HyperTwist/LICENSETRACKING.md index 421a3ae..4cc594f 100644 --- a/docs/v6_5_deep_manual_pack/HyperTwist/LICENSETRACKING.md +++ b/docs/v6_5_deep_manual_pack/HyperTwist/LICENSETRACKING.md @@ -80,10 +80,17 @@ Required rule: - if a missing standalone repo row is only a historical alias and maintained public source surfaces now live elsewhere, convert it into a historical alias row instead of keeping it in the active mirror-restoration queue +- if HyperTwist later retains one or more of those maintained successor repos + directly, intake them as explicit repo rows with their own legal calls rather + than treating the historical alias row as a substitute for successor custody - if a manifest row points at a package subpath inside a mirrored monorepo and the parent git root resolves to the same repo URL, normalize that row under the parent root authority in the generated audit rather than treating it as a generic exclusion +- if a repo has no root license file but does declare a repo-local license in + package metadata, record that as metadata-only evidence in the generated + audit and root tracker, but do not treat it as equivalent to a clear root + license file - if a repo resolves to `MIT` from a repo-root license file, capture the exact repo-root `MIT` text under: - `C:\HyperTwist\docs\generated\license_audit\MIT_LICENSE_TEXTS_2026-05-27\` diff --git a/scripts/Write-HyperTwistRepoLicenseEvidenceAudit.ps1 b/scripts/Write-HyperTwistRepoLicenseEvidenceAudit.ps1 index e898fbd..73a52c1 100644 --- a/scripts/Write-HyperTwistRepoLicenseEvidenceAudit.ps1 +++ b/scripts/Write-HyperTwistRepoLicenseEvidenceAudit.ps1 @@ -171,11 +171,32 @@ function Get-MetadataSignal { continue } - $text = Get-Content -LiteralPath $fullPath -Raw -ErrorAction SilentlyContinue + $text = Get-Content -LiteralPath $fullPath -Raw -Encoding UTF8 -ErrorAction SilentlyContinue if (-not $text) { continue } + if ($candidate -eq "package.json") { + try { + $packageJson = $text | ConvertFrom-Json -ErrorAction Stop + $packageLicense = [string]$packageJson.license + if ($packageLicense) { + $packageLicense = $packageLicense.Trim() + if ($packageLicense -and + $packageLicense -notmatch '^SEE LICENSE IN\b' -and + ((-not $ManifestLicense) -or + ($ManifestLicense -match [regex]::Escape($packageLicense)) -or + ($packageLicense -match [regex]::Escape($ManifestLicense)))) { + return @{ + Signal = $packageLicense + Path = $candidate + } + } + } + } catch { + } + } + if ($ManifestLicense -match 'MIT' -and $text -match '\bMIT\b') { return @{ Signal = "MIT" @@ -224,6 +245,16 @@ function Get-SafeFileStem { return $stem.Trim('_') } +function Write-Utf8NoBomTextFile { + param( + [string]$Path, + [string]$Content + ) + + $encoding = [System.Text.UTF8Encoding]::new($false) + [System.IO.File]::WriteAllText($Path, $Content, $encoding) +} + $repoRoot = Split-Path -Parent $PSScriptRoot $docsRoot = Join-Path $repoRoot "docs" $generatedRoot = Join-Path $docsRoot "generated\\license_audit" @@ -265,7 +296,7 @@ New-Item -ItemType Directory -Path $generatedRoot -Force | Out-Null New-Item -ItemType Directory -Path $mitTextDir -Force | Out-Null Get-ChildItem -LiteralPath $mitTextDir -File -ErrorAction SilentlyContinue | Remove-Item -Force -$manifest = Get-Content $manifestPath -Raw | ConvertFrom-Json +$manifest = Get-Content $manifestPath -Raw -Encoding UTF8 | ConvertFrom-Json $entries = New-Object System.Collections.Generic.List[object] foreach ($repo in $manifest.repositories) { @@ -360,7 +391,7 @@ foreach ($entry in $entries) { $readmeFiles = Get-RootFilesByPattern -Path $path -Pattern '^README([-.].+)?(\..+)?$' $licenseFileRows = foreach ($licenseFile in $licenseFiles) { - $text = Get-Content -LiteralPath $licenseFile.FullName -Raw -ErrorAction SilentlyContinue + $text = Get-Content -LiteralPath $licenseFile.FullName -Raw -Encoding UTF8 -ErrorAction SilentlyContinue [pscustomobject]@{ Name = $licenseFile.Name Signal = Get-LicenseSignalFromText -FileName $licenseFile.Name -Text $text @@ -398,7 +429,7 @@ foreach ($entry in $entries) { } } else { foreach ($readmeFile in $readmeFiles) { - $readmeText = Get-Content -LiteralPath $readmeFile.FullName -Raw -ErrorAction SilentlyContinue + $readmeText = Get-Content -LiteralPath $readmeFile.FullName -Raw -Encoding UTF8 -ErrorAction SilentlyContinue if ($entry.CurrentManifestLicense -match 'MIT' -and $readmeText -match '\bMIT\b') { $resolvedLicenseSignal = "MIT" $evidenceTier = "readme_only" @@ -478,7 +509,7 @@ foreach ($row in $orderedAuditRows | Where-Object { $_.mit_bucket }) { $licenseCandidates = ($row.license_files -split '; ' | Where-Object { $_ }) foreach ($candidate in $licenseCandidates) { $fullPath = Join-Path $row.primary_path $candidate - $candidateText = Get-Content -LiteralPath $fullPath -Raw -ErrorAction SilentlyContinue + $candidateText = Get-Content -LiteralPath $fullPath -Raw -Encoding UTF8 -ErrorAction SilentlyContinue if ((Get-LicenseSignalFromText -FileName $candidate -Text $candidateText) -eq "MIT") { $mitText = $candidateText break @@ -491,7 +522,7 @@ foreach ($row in $orderedAuditRows | Where-Object { $_.mit_bucket }) { } $mitFilePath = Join-Path $mitTextDir ("{0}.LICENSE.txt" -f (Get-SafeFileStem -RepoId $row.repo_id)) - Set-Content -LiteralPath $mitFilePath -Value $mitText -Encoding UTF8 + Write-Utf8NoBomTextFile -Path $mitFilePath -Content ($mitText.TrimEnd() + "`r`n`r`n") $block = @( "Component: $($row.repo_id)", @@ -520,13 +551,17 @@ foreach ($row in $orderedAuditRows | Where-Object { $_.mit_bucket }) { $mitNoticeBlocks.Add(($block -join "`r`n")) } -Set-Content -LiteralPath $thirdPartyPath -Value (($mitNoticeBlocks -join "`r`n`r`n").TrimEnd() + "`r`n") -Encoding UTF8 +Write-Utf8NoBomTextFile -Path $thirdPartyPath -Content (($mitNoticeBlocks -join "`r`n`r`n").TrimEnd() + "`r`n`r`n") $scannedCount = @($orderedAuditRows).Count $clearRootCount = @($orderedAuditRows | Where-Object { $_.evidence_tier -eq "clear_repo_license_file" }).Count $mitClearCount = @($orderedAuditRows | Where-Object { $_.mit_bucket -eq "mit_clear_root_license_file" }).Count $mitReadmeCount = @($orderedAuditRows | Where-Object { $_.mit_bucket -eq "mit_readme_only" }).Count $mitMetadataCount = @($orderedAuditRows | Where-Object { $_.mit_bucket -eq "mit_metadata_only" }).Count +$nonMitMetadataCount = @($orderedAuditRows | Where-Object { + $_.evidence_tier -eq "metadata_only" -and + -not $_.mit_bucket + }).Count $noClearCount = @($orderedAuditRows | Where-Object { $_.resolved_license_signal -eq "no_clear_repo_local_license_signal" }).Count $noClearWithCanonCount = @($orderedAuditRows | Where-Object { $_.resolved_license_signal -eq "no_clear_repo_local_license_signal" -and @@ -559,6 +594,7 @@ $markdown.Add("- clear repo-local license file or explicit mixed root-license de $markdown.Add("- MIT with clear root license file: $mitClearCount") $markdown.Add("- MIT from README only, no root license file: $mitReadmeCount") $markdown.Add("- MIT from repo metadata only, no root license file: $mitMetadataCount") +$markdown.Add("- non-MIT license from repo metadata only, no root license file: $nonMitMetadataCount") $markdown.Add("- no clear repo-local license signal: $noClearCount") $markdown.Add("- no-clear bucket where current HyperTwist manifest already carries a legal call: $noClearWithCanonCount") $markdown.Add("- package-subpath rows normalized under parent root authority: $normalizedSubpathCount") @@ -594,6 +630,25 @@ if ($metadataOnlyRows.Count -eq 0) { } $markdown.Add("") +$nonMitMetadataRows = @($orderedAuditRows | Where-Object { + $_.evidence_tier -eq "metadata_only" -and + -not $_.mit_bucket + }) +$markdown.Add("Non-MIT license from repo metadata only, no root license file:") +if ($nonMitMetadataRows.Count -eq 0) { + $markdown.Add("- none") +} else { + foreach ($row in $nonMitMetadataRows) { + $detail = if ($row.metadata_signal_path) { + "$($row.resolved_license_signal) via ``$($row.metadata_signal_path)``" + } else { + $row.resolved_license_signal + } + $markdown.Add("- $($row.repo_id) - signal: $detail") + } +} +$markdown.Add("") + $noClearRows = @($orderedAuditRows | Where-Object { $_.resolved_license_signal -eq "no_clear_repo_local_license_signal" }) $markdown.Add("No clear repo-local license signal:") if ($noClearRows.Count -eq 0) { @@ -649,7 +704,7 @@ if ($remainingExcludedRows.Count -eq 0) { } $markdown.Add("") -Set-Content -LiteralPath $markdownPath -Value (($markdown -join "`r`n").TrimEnd() + "`r`n") -Encoding UTF8 +Write-Utf8NoBomTextFile -Path $markdownPath -Content (($markdown -join "`r`n").TrimEnd() + "`r`n`r`n") Write-Output "Wrote:" Write-Output $csvPath