Intake cubing scramble successor surfaces

This commit is contained in:
axiomlogicnexus 2026-05-27 01:48:01 +02:00
parent 01d36e43e9
commit 0f88d3b301
6 changed files with 210 additions and 12 deletions

View file

@ -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`

View file

@ -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:

View file

@ -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. <http://fsf.org/>","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."

1 repo_id repo_url primary_path all_local_paths current_manifest_mirror_class current_manifest_license current_manifest_license_status license_file_count license_files notice_files readme_files resolved_license_signal evidence_tier mit_bucket evidence_paths readme_signal readme_signal_path metadata_signal metadata_signal_path copyright_line repo_head note
14 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. <http://fsf.org/> d417cfcc5d7702b54ef8afcb843d87c5dfcfb69e Manifest/tracker posture is narrower or more contextual than the root license signal.
15 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
16 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
17 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.
18 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.
19 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
20 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
21 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
22 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.
23 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.

View file

@ -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:

View file

@ -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\`

View file

@ -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