公开记录
软件健康报告模式 0.31.0 · 指标 2.5.0 · 2026-08-05 17:52 UTC

gregkwaste / NMSMV

C#未检测到许可证★ 47 星标⑂ 7 复刻始于 2020年8月在 GitHub 上查看 ↗
类型桌面应用如何判定

gregkwaste/NMSMV 的健康指数为 100 分中的 21 分,处于「存在风险」区间。 其得分最高的类别是AI Readiness(42/100),最低的是Security(17/100)。 最近一次更新在 139 天前。 近期的大部分工作由 1 位贡献者完成。

21
总分 / 100
存在风险

软件健康指数

指标归入加权类别,统一采用 1–100 量表。总体分先取类别加权平均,再依据公开记录的分布进行校准,使各等级具有百分位含义;当公开证据触发高风险司法辖区政策时,评级会按政策调整,并设置 34(存在风险)的上限。

21
卓越93-100公开记录中的最高层级(约前 5%);基本满足所有检验标准
优秀80-92各方面均表现强劲;仅有少量不足
良好65-79健康;不足之处有限且可控
中等50-64可接受,但存在明显不足;建议进行审查
薄弱35-49多个领域存在实质性薄弱环节
存在风险20-34存在重大薄弱环节;采用时应保持审慎
危急1-19问题严重(项目被弃置、仅有单一维护者、缺乏基本工程规范)
活力社区与采用可持续性与治理工程质量安全AI 就绪度

评分画像

每条轴代表一个类别。形状比平均值更重要——健康的对象会填满整个图形,而“一峰一谷”式画像意味着某一维度的优势正掩盖另一维度的风险。

加权总体分 27 经校准后在公布的指数量表上为 21(记录校准 2026-08-02)。

所有权

Greg Kasapidis个人账户
18 关注者24 个公开仓库始于 2014年5月

该仓库由个人账户拥有。相较于组织支持的项目,单一所有者项目的延续性风险更高。

按类别列示的指标

活力

项目是否仍有生命——是否仍在编写代码,是否仍在发布版本?

30存在风险 · 占总体的 21%
评分方式
9.9/36推送新近度 — 最近一次推送于 139 天前
0.7/36提交节奏 — 52 周中有 1 周有提交
2.7/18提交量 — 最近一年 1 次提交
0/10OpenSSF Scorecard:Maintained — 0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
所用输入
commits_last_year1
human_commit_share1
days_since_last_push139
active_weeks_last_year1

发布纪律

56中等
评分方式
27/27有发布版本 — 已发布 13 个发布版本
16.2/36发布时效 — 最近一次发布版本于 350 天前
12.6/27发布节奏 — 约每 145.5 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — Project has not signed or included provenance with any releases.
所用输入
releases_count13
latest_release_tagv0.93.1-pre
releases_from_tags
days_since_latest_release350
mean_days_between_releases145.5

社区与采用

项目是否拥有用户、下载量与关注度,并具备欢迎贡献者参与的配置?

32存在风险 · 占总体的 17%
评分方式
27/60星标 — 47 个星标
6.5/25复刻 — 7 个复刻
4.7/15关注者 — 8 位关注者
所用输入
forks7
stars47
watchers8
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

25存在风险
评分方式
22.5/22.5README
0/22.5许可证 — 未检测到许可证文件
0/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
0/6.3PR 模板
所用输入
has_readme
has_license
readme_badges3
has_contributing
has_issue_template
has_code_of_conduct
readme_badge_servicesshields.io
has_pull_request_template

可持续性与治理

项目能否在其成员之外延续——巴士系数、响应能力、由谁支持,以及软件包的维护状况?

35薄弱 · 占总体的 23%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
0/22.5提交分布 — 头号贡献者编写了 100% 的提交
1.4/13.5贡献者广度 — 1 位贡献者
0/10OpenSSF Scorecard:Contributors — project has 0 contributing companies or organizations -- score normalized to 0
所用输入
bus_factor1
contributors_sampled1
top_contributor_share1
评分方式
28/42议题解决 — 67% 的议题已关闭
0/30PR 接受 — 没有已裁定的拉取请求或无数据
0/13Newcomer PR acceptance — 30 天内没有首次贡献者的 PR 得到裁决
0/15OpenSSF Scorecard:Code-Review — Found 0/30 approved changesets -- score normalized to 0
所用输入
merged_prs0
open_issues5
closed_issues10
prs_merged_7d0
prs_decided_7d0
prs_merged_30d0
prs_decided_30d0
issue_closed_ratio0.667
closed_unmerged_prs0
first_time_authors_30d0
first_time_prs_merged_30d0
first_time_prs_decided_30d0
已排除计分(无数据或不适用):PR 接受, newcomer_pr_acceptance。 其余权重已重新归一化。
评分方式
10/30所有权背书 — 个人(用户)账户
0/20已验证域名 — 不适用于个人账户
9.2/25所有者影响力 — gregkwaste 有 18 位关注者
22.2/25既往记录 — 24 个公开仓库,账户约 12 年
所用输入
followers18
owner_typeUser
is_verified
owner_logingregkwaste
public_repos24
account_age_days4,473
已排除计分(无数据或不适用):已验证域名。 其余权重已重新归一化。

工程质量

基础的工程与文档实践是否到位?

17危急 · 占总体的 19%
评分方式
0/24CI 工作流
0/24存在测试
0/16Linter 配置
0/9.6Pre-commit 钩子
0/6.4.editorconfig
0/20OpenSSF Scorecard:CI-Tests — 无数据
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config
已排除计分(无数据或不适用):OpenSSF Scorecard:CI-Tests。 其余权重已重新归一化。

文档

40薄弱
评分方式
30/30README
0/25文档目录
0/15文档 / 主页站点
0/10仓库描述
0/10主题标签
10/10Wiki
所用输入
topics
has_wiki
homepage
has_readme
has_docs_dir
has_description

安全

可见的安全与供应链实践是否稳固,且不存在未解决的高风险司法辖区暴露?

17危急 · 占总体的 16%

安全态势

17危急
评分方式
5.2/7.5Binary-Artifacts — binaries present in source code
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — 无数据
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
0/10Dangerous-Workflow — 无数据
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
0/2.5许可证 — license file not detected
0/7.5Maintained — 0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
0/5Packaging — 无数据
0/5Pinned-Dependencies — 无数据
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — 无数据
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated13
scorecard_versionv5.5.0
checks_inconclusive5
scorecard_aggregate1.7
已排除计分(无数据或不适用):ci_tests, dangerous_workflow, packaging, pinned_dependencies, token_permissions。 其余权重已重新归一化。

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?权重刻意设小(4%):代理工具链是一项真实的维护信号,但完全不具备的仓库仍可达到 100/100。

42薄弱 · 占总体的 4%
评分方式
0/45代理指令 — 没有 CLAUDE.md / AGENTS.md / 编辑器规则
0/15机器可读文档(llms.txt)
35.2/40可读的提交历史 — 100 次人类提交中有 66 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.66
agent_instruction_files
agent_instruction_max_bytes
评分方式
12.6/18一条命令的引导启动 — SimpleTextureRenderer/SimpleTextureRenderer.csproj, TextureMixer/TextureMixer.csproj, TextureRenderer/TextureRenderer.csproj(工具链约定,无任务运行器)
0/22自动化测试
0/11Lint / 格式化配置
11/11静态类型检查 — C#(静态类型)
0/10可复现环境
0/10已体现的代理实践 — 最近 100 次提交中没有代理编写的提交
0/8自动化维护 — 未观察到自动依赖更新
0/10OpenSSF Scorecard:Pinned-Dependencies — 无数据
所用输入
has_nix
has_tests
lockfiles
has_dockerfile
typed_language
bootstrap_files
has_devcontainer
has_linter_config
typecheck_configs
agent_commit_share0
toolchain_manifestsSimpleTextureRenderer/SimpleTextureRenderer.csproj, TextureMixer/TextureMixer.csproj, TextureRenderer/TextureRenderer.csproj, Viewer_Unit_Tests/Viewer_Unit_Tests.csproj, WPFModelViewer/WPFModelViewer.csproj
dependency_bot_commit_share0
已排除计分(无数据或不适用):OpenSSF Scorecard:Pinned-Dependencies。 其余权重已重新归一化。
评分方式
45/45可类型检查的代码 — C#(静态类型)
54.3/55可控的文件大小 — 采样的 76 个源文件中有 1 个超过 60KB
所用输入
primary_languageC#
largest_source_bytes80,963
source_files_sampled76
oversized_source_files1

关键数据

47GitHub 星标
1贡献者
1最近 12 个月提交数
139距最近推送天数
13发布版本数
1巴士系数(bus factor)
5开放议题
NuGet软件包生态系统数

数据采集警告

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

更多细节

Star 与 Fork 历史 0 ★ / 7 ⇿
0Star
7Fork
8发布

每颗 star 和每个 fork 的添加时间,来自 GitHub 并按天汇总。累计增长位于其构成来源——每日新增——的正上方,二者可相互对照:稳定的自然增长与短暂的突增形态截然不同。当这一差别可被衡量时,它会作为增长真实性予以报告。

1234567712021-042022-102024-05
主版本 0次版本 1修订 6

每个点涵盖 3 天。

OpenSSF Scorecard 1.7 / 10
1.7综合

来自开源项目 OpenSSF Scorecard 的独立、工具无关的安全评估。每项检查奖励的是安全实践本身,而非特定供应商的工具。Scorecard 无法判定的检查项标记为 不适用,并从安全评分中剔除(绝不按零分计)。Scorecard v5.5.0 · 2026-08-05 17:52 UTC

7Binary-Artifactsbinaries present in source code
0Branch-Protectionbranch protection not enabled on development/release branches
不适用CI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
不适用Dangerous-Workflowno workflows found
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
0Licenselicense file not detected
0Maintained0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
不适用Packagingpackaging workflow not detected
不适用Pinned-Dependenciesno dependencies found
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
不适用Token-PermissionsNo tokens found
10Vulnerabilities0 existing vulnerabilities detected
直接依赖 13
注册表软件包版本约束清单文件
NuGetOpenTK3.1.0SimpleTextureRenderer/SimpleTextureRenderer.csproj
NuGetAssimpNet5.0.0-beta1WPFModelViewer/WPFModelViewer.csproj
NuGetCostura.Fody5.8.0-alpha0098WPFModelViewer/WPFModelViewer.csproj
NuGetFody6.8.1WPFModelViewer/WPFModelViewer.csproj
NuGetGameloop.Vdf0.6.2WPFModelViewer/WPFModelViewer.csproj
NuGetMathNet.Numerics5.0.0WPFModelViewer/WPFModelViewer.csproj
NuGetMicrosoft.CSharp4.7.0WPFModelViewer/WPFModelViewer.csproj
NuGetNewtonsoft.Json13.0.3WPFModelViewer/WPFModelViewer.csproj
NuGetNLog5.3.2WPFModelViewer/WPFModelViewer.csproj
NuGetOpenTK.GLWpfControl4.2.3WPFModelViewer/WPFModelViewer.csproj
NuGetOpenTK4.8.2WPFModelViewer/WPFModelViewer.csproj
NuGetSystem.Drawing.Common8.0.7WPFModelViewer/WPFModelViewer.csproj
NuGetWindowsAPICodePack8.0.4WPFModelViewer/WPFModelViewer.csproj
全部依赖 未采集

本报告未能采集到解析后的依赖集合:GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

原始 JSON 报告 机器可读
{
  "data": {
    "icon": {
      "bytes": 380127,
      "width": 1024,
      "height": 1024,
      "rejected": [],
      "collected": true,
      "media_type": "image/png",
      "source_url": "https://i.imgur.com/hdBRZFL.png",
      "source_type": "readme",
      "content_hash": "eaafc27b903279daedd5056c96818d78e1b768292c75d93d4f946177d65611e5",
      "candidates_considered": 1
    },
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 11780,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "C#": 840084,
        "GLSL": 71903,
        "Python": 1162
      },
      "pushed_at": "2026-03-18T22:56:14Z",
      "created_at": "2020-08-21T09:06:19Z",
      "owner_type": "User",
      "updated_at": "2026-03-26T16:11:57Z",
      "description": null,
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": null,
      "default_branch": "master",
      "license_spdx_raw": null,
      "primary_language": "C#",
      "significant_languages": [
        "C#"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Greg Kasapidis",
      "type": "User",
      "login": "gregkwaste",
      "company": null,
      "location": "United Kingdom",
      "followers": 18,
      "avatar_url": "https://avatars.githubusercontent.com/u/7515235?v=4",
      "created_at": "2014-05-07T17:44:51Z",
      "is_verified": null,
      "public_repos": 24,
      "account_age_days": 4473
    },
    "license": {
      "state": "absent",
      "spdx_id": null,
      "raw_spdx": null,
      "file_present": false,
      "scorecard_found": false,
      "profile_has_license": false
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.93.1-pre",
          "kind": "prerelease",
          "published_at": "2025-08-20T08:14:37Z"
        },
        {
          "tag": "v0.91.3-pre",
          "kind": "prerelease",
          "published_at": "2024-08-01T23:57:27Z"
        },
        {
          "tag": "v0.91.2",
          "kind": "patch",
          "published_at": "2023-09-24T01:37:00Z"
        },
        {
          "tag": "v0.91.1",
          "kind": "patch",
          "published_at": "2022-12-01T17:53:54Z"
        },
        {
          "tag": "v0.91.0",
          "kind": "minor",
          "published_at": "2022-11-06T12:56:26Z"
        },
        {
          "tag": "v0.90.7-hotfix",
          "kind": "prerelease",
          "published_at": "2022-07-24T03:49:22Z"
        },
        {
          "tag": "v0.90.7",
          "kind": "patch",
          "published_at": "2022-07-23T15:04:19Z"
        },
        {
          "tag": "v0.90.6",
          "kind": "patch",
          "published_at": "2022-07-18T07:52:43Z"
        },
        {
          "tag": "v0.90.4",
          "kind": "patch",
          "published_at": "2022-02-23T14:19:16Z"
        },
        {
          "tag": "v0.90.3",
          "kind": "patch",
          "published_at": "2022-01-18T15:12:13Z"
        },
        {
          "tag": "v0.90.1",
          "kind": "patch",
          "published_at": "2021-01-13T13:43:31Z"
        },
        {
          "tag": "0.90.0",
          "kind": "minor",
          "published_at": "2020-08-29T16:07:27Z"
        },
        {
          "tag": "v0.89.4",
          "kind": "patch",
          "published_at": "2020-08-21T18:14:44Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "ee2ed17e79ff82ec4cfd069f33fcd2234e443e03",
          "body": null,
          "is_bot": false,
          "headline": "Prerelease version update + libmbin v5.74",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2025-08-20T08:00:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d95401e097c7411214aa7788c0ffa98d9018d369",
          "body": "- Disabled reference loading. References now need to be manually loaded (Green nodes on the scenegraph represent Reference nodes)\n- Added support for new texture formats (ATI1)\n- Minor UI updates for better camera settings control",
          "is_bot": false,
          "headline": "Updated Codebase for NMS v5.7x",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2025-07-16T01:54:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fd4c6fec336a818f73760744a4a64876f3f20bca",
          "body": "- Added support for NMS 5.0 geometry model formats\n- Added support for GROUP node types (interpreted as locator objects)\n- Added a very preliminary implementation of a scene exporter to EXML (only exports hierarchy information for now)\n- Repaired proc gen model generator\n- Upgraded project to Net 8",
          "is_bot": false,
          "headline": "NMS 5.0 update",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2024-08-01T23:20:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "53ffee760cc1a79f28213f24c153ea34123331ba",
          "body": "- Fixed a small bug related to the incorrect interpolation between rotation quaternions\n- Added a dynamic NMS archive parsing mechanism. Archives are now locked only during the loading process\n- Repaired the procgen button. The tool is able to create random procedurally generated models (excluding pose customisation for now)",
          "is_bot": false,
          "headline": "BugFixes and ProcGen",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2024-07-30T23:21:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c9006304c6d2c14fbb725e21e60ef3289794865e",
          "body": null,
          "is_bot": false,
          "headline": "Dependencies update + new Parser for NMS v5.0",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2024-07-29T18:58:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e96c9b4c107c55c68f7118bfc50af167e9ab57c9",
          "body": null,
          "is_bot": false,
          "headline": "Removed NMS template field from the model class",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2023-09-24T01:45:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fec012b25110cd5f1a99b25fc8d3a39da4099787",
          "body": "- Fixed issue with insufficient joint arrays\n- Fixed issue with duplicated mesh hashes",
          "is_bot": false,
          "headline": "Bug fixes",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2023-09-24T01:10:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "23a9076e2c5a00f2b1c1d2056447d45d467d1149",
          "body": null,
          "is_bot": false,
          "headline": "Bugfixes",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2023-07-31T20:48:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d2ddfdb77501e95494e4c59a90aaf065dbe898be",
          "body": "Fixed an issue with wrong nms path detection when the game is installed in the default steam directory",
          "is_bot": false,
          "headline": "Fixed a bug with wrong nms path calculation",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2022-12-01T17:50:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a68e2e91b3d99a5b537d11614eb0c4033611bc0e",
          "body": null,
          "is_bot": false,
          "headline": "Added support for default Anims",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2022-11-26T16:05:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "375476049bc8b7a1a74130fa5dab42971db5e828",
          "body": "Camera movement is based on yaw/pitch. No interpolation hapenning, no polling thread. Seems much smoother.",
          "is_bot": false,
          "headline": "Addressed choppy camera movement.",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2022-11-12T20:50:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e1b73d6fba18b8f2308095969db538a4e1cff970",
          "body": "- UI and mouse capturing bug fixes.",
          "is_bot": false,
          "headline": "Removed WinForms Dependency",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2022-11-06T12:44:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3b93cbc70661fcb633a49222cccba1b788dc8749",
          "body": null,
          "is_bot": false,
          "headline": "Fixed a bug on default browser invoke",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2022-11-06T06:19:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ba0f2ed899ac804bd3566e35edece0165ea4c319",
          "body": null,
          "is_bot": false,
          "headline": "Updated Donation Link",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2022-11-06T06:13:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "91957befea69f7dfaf74c7068e95911a5bb4db76",
          "body": "Bumped version to 0.91 and fixed libmbin updater to grab the net5.0 assembly",
          "is_bot": false,
          "headline": "Version update+",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2022-11-06T05:46:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0e5c7f5b6123f43e4ad06aa7f50aac976359d99d",
          "body": "Upgraded OpenTK 3->4\nMigrated to Net6.0\nUsing net5.0 version of the libmbin",
          "is_bot": false,
          "headline": "Dependency Upgrade",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2022-11-05T20:08:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bb051bbe9a827011b19a89a29b74e7ea7ab4456e",
          "body": "- Cleaned up rendering options control\n- Fixed issue with null skinning matrices\n- Fixed an issue with camera reset position",
          "is_bot": false,
          "headline": "Bugfixing",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2022-07-24T14:31:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "69e136c780cc4aebfe11a76c1cbd300ecb91b141",
          "body": "- Set HDRExposure to 0.5 by default\n- Fixed issue with overriden user camera settings after a new import.\n- Added more error logging when libmbin fails to decompile a file",
          "is_bot": false,
          "headline": "Bug fix",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2022-07-23T22:57:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "402ff46119ff8137bc4d6d4f08d4dca6bf827e4c",
          "body": "- Updated libmbin version\n- Fixed an issue with new not yet supported samplers\n- Improved libmbin update mechanism\n- All viewport settings are saved in the settings.json file.",
          "is_bot": false,
          "headline": "Endurance update + Bug Fixes + QOL",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2022-07-23T14:57:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "233921162c0a685f4e3e259ec7d4af0a93ce87ed",
          "body": "- Updated several dependencies",
          "is_bot": false,
          "headline": "Fixed Steam library search",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2022-07-18T07:51:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4aa4d5d562e4961c8bb2186d5b8f9a8c8e0d9ea8",
          "body": null,
          "is_bot": false,
          "headline": "cleaned up readme file",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2022-07-16T15:32:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d96ce9e6f2cfcd13100625764f355148943fe37d",
          "body": "Also fixed an error regarding inconsistent input skinning data.",
          "is_bot": false,
          "headline": "New version. Settings NMS path request. Added new light attenuation type",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2022-07-16T15:23:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "42dbc7c984a8fffd9851c4439d3396e7622878c5",
          "body": "The viewer now is logging EVERYTHING supposed to be printed out.\nCode was adapted to handle the modified physics component struct.",
          "is_bot": false,
          "headline": "Upgraded Logging, libMBIN upgrade",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2022-05-11T07:00:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b1d538dfd14587159997b682da10d9428849cc4e",
          "body": "…UTOUT flag during rendering",
          "is_bot": false,
          "headline": "Added fixes for the VBSKINNED flag as well the handling of the ALPHAC…",
          "author_name": "Greg",
          "author_login": "gregkwaste",
          "committed_at": "2022-02-27T21:27:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1fa024aed191ac54435e20c90f3c94a468c74a32",
          "body": null,
          "is_bot": false,
          "headline": "Cleared up some settings window descriptions",
          "author_name": "Greg",
          "author_login": "gregkwaste",
          "committed_at": "2022-02-23T14:00:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d8505384d7f7e9ea7b56205e73e2611a92ab88cb",
          "body": "… completely wrong.",
          "is_bot": false,
          "headline": "Proper fix for parsing the TkMeshMetaData class. The previous one was…",
          "author_name": "Greg",
          "author_login": "gregkwaste",
          "committed_at": "2022-02-23T13:34:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3738b5c225562c48b9faf22d5159e7af03de4cc6",
          "body": "…s that may contain spaces.",
          "is_bot": false,
          "headline": "Adapted code to Sentinel Update. Fixed a bug related to gamedata path…",
          "author_name": "Greg",
          "author_login": "gregkwaste",
          "committed_at": "2022-02-23T13:14:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e5a91cfb71b000d7d8f27136ade56aba5d817816",
          "body": null,
          "is_bot": false,
          "headline": "Updated platform target to x64",
          "author_name": "Greg",
          "author_login": "gregkwaste",
          "committed_at": "2022-01-18T15:09:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "464b94474b50118678883685868b7c5d04240e51",
          "body": "Also updated framework version and  app version\n* Latest libmbin is included.\n* Problematic shaders are fixed",
          "is_bot": false,
          "headline": "Updated to support Latest Mbin Version",
          "author_name": "Greg",
          "author_login": "gregkwaste",
          "committed_at": "2022-01-18T14:59:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aa07c5a58ce8bbf8ff857b95c4d45c2d2d3f6341",
          "body": "* Added UI components for testing that are enabled only in debug mode. they should not affect the tool's release version\n* Changed default exposure to 0.005 to kinda match the game's lighting environment\n* A lot of work on underlying systems to support game components such as ActionTriggers, Physics\n[…]\n Lod filtering to children of Lod meshes\n* Added error catchers during material shader compilation for debugging purposes\n* Included latest libMBIN and libPSARC libraries and updated version to 0.90.1",
          "is_bot": false,
          "headline": "Performance + Bug Fixes + New Features",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2021-01-13T12:56:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "281a4c911c90a0c4e56c8ac7daaa41131945deff",
          "body": "-We now got an engine object yaaaaay\n-Fixed a bug during animation interpolation\n-Fixed a bug during Camera interpolation\n-A bit of experimentation with poses.\n-Basic infrastructure for ECS systems is implemented.",
          "is_bot": false,
          "headline": "Action system Infrastructure + Code Organization",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2020-09-02T08:23:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bdcdc89723c4d1b6a23872c02f8583564d2fd9b0",
          "body": "test options are added programmatically only on the debug version\nupdate changelog\nupdated version on tool and build tool\nremoved unecessary packages",
          "is_bot": false,
          "headline": "Big Fixes on Release version",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-29T15:57:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b89ad970ebd63f72d096613f5c0edd7bc1cda181",
          "body": null,
          "is_bot": false,
          "headline": "Removing old Imaging class",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-29T13:51:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a5bed21f8269775e757cc2d7bd4ca9a603e97607",
          "body": "-Finished the greatest part of a custom SDF text renderer. Droid and Segoe fonts are now embedded as resources in the app. External references to QFont and SharpFont are completely removed.\n- Fixed a bug that prevented the settings form to be re-opened. \n- Core Engine code organization into separate\n[…]\ny smoother compared to the past\n- Fixed a bug related to repeated rendering of locator meshes\n- Migrated app to OpenGL 4.6 core profile. Rendering code as well as all the related shaders were updated.",
          "is_bot": false,
          "headline": "Bunch of updates and bug fixes",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-29T13:50:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9d9518ac676a5ed2cf0d9030522f1b1c9bf28a90",
          "body": "LOD filtering This option is enabled by default. Minor updates to the readme and a bit of code reorganization",
          "is_bot": false,
          "headline": "Brought Back LOD level filtering.",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-23T18:29:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "11dbd60d2fa6d06a1ac47c5fdd59d1c83bc839bd",
          "body": null,
          "is_bot": false,
          "headline": "Added build script",
          "author_name": "Greg",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-23T16:37:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ae0b3e5fc0f6a6f673a7bd8ac725d9570aa18966",
          "body": "latest dll is fetched from github.",
          "is_bot": false,
          "headline": "Added libMBIN update functions",
          "author_name": "Greg",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-22T17:11:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "729bd71b5a9594876de4ae99f07c1695ddad23a6",
          "body": null,
          "is_bot": false,
          "headline": "Update README.md",
          "author_name": "Greg Kasapidis",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-22T07:20:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "69c7fa0f1c6dd2baebc737679aa80f07de82102a",
          "body": null,
          "is_bot": false,
          "headline": "Update README.md",
          "author_name": "Greg Kasapidis",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-22T07:19:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "11212e3ecba6bb1fd48ad955f3ad0119f4b0235b",
          "body": "Fixed links in about window. Improved readme and fixed the layout of the about window",
          "is_bot": false,
          "headline": "Reference updates",
          "author_name": "Greg",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-22T07:15:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "178d5089ff38951b6e3ab1f5a62bfeedccc9d4be",
          "body": null,
          "is_bot": false,
          "headline": "Deleted samples from project",
          "author_name": "Greg",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-21T20:04:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c5359dde75ba5dc7ddc89f9adbde194b6294b75b",
          "body": null,
          "is_bot": false,
          "headline": "Reassigned references to match the new lib directory",
          "author_name": "Greg",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-21T20:03:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cea1d0ff72593cc195065c6c79dddb6317a3cb90",
          "body": "Moved lib and samples to the root of the project.\nTODO: I think samples are also not required.",
          "is_bot": false,
          "headline": "Removed old winforms project",
          "author_name": "Greg",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-21T19:55:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5faa9d4c9a00f3ab5bbab5be08c118303829583e",
          "body": null,
          "is_bot": false,
          "headline": "updated screenshot",
          "author_name": "Greg",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-21T19:37:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "20f0b768c242ad3c7540dfe7296cf3f03466d378",
          "body": null,
          "is_bot": false,
          "headline": "Added a feature list to the readme",
          "author_name": "Greg",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-21T19:03:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "adf492159e542ea0bdc60ccc3e3c1e1cd9afffbe",
          "body": null,
          "is_bot": false,
          "headline": "Updated badges in readme file",
          "author_name": "Greg",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-21T18:33:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c0acf4b1366341f0183612a2db96386520d48433",
          "body": null,
          "is_bot": false,
          "headline": "Readme updates",
          "author_name": "Greg",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-21T09:13:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7156771f2ed615cb0180605739506e4c2b887921",
          "body": "packed hdrexposure into the cameraposition vector.\nremoved initial scene rotation when inititalizing the control.\nincluding changelog in the project",
          "is_bot": false,
          "headline": "Mini optimizations and fixes",
          "author_name": "Greg",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-20T23:09:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cf1c502fe6100a78d51fd133cdea779f8ce98f67",
          "body": "reassigned Q/E keys to scene rotation and not camera rotation.\nFixed some issues related to frustum culling (it still needs improvements...)\nIncluded scene rotation to the light position update as well as in the frustum culling process.\nProperly implemented light rendering in the renderManager. lights are kept separately and rendered according to the flags.\nReworked shaders to fix bugs related to scene rotation.",
          "is_bot": false,
          "headline": "Bug Fixes",
          "author_name": "Greg",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-18T07:50:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ca06e9751f8ba5046c5604e279039d66105371bb",
          "body": "Setup for translation gizmo with picking and movement. Fixes on lighting shaders. Added backend to facilitate model export using assimp.",
          "is_bot": false,
          "headline": "Updates",
          "author_name": "Greg",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-16T22:21:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1c4693e94f21cd72508b8e358e0ca8114d904616",
          "body": "Fixed issue with MBIN, EXML export and reference objects. Also removed convexhull imports from the project files and added the latest libMBIN.dll",
          "is_bot": false,
          "headline": "Bug fix and more",
          "author_name": "Unknown",
          "author_login": null,
          "committed_at": "2020-08-09T18:54:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d938f4b7cebc625a79c595e7f04ed108ccb6543d",
          "body": null,
          "is_bot": false,
          "headline": "Bug Fixes + Error Reports + Work on gizmos",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2020-08-07T13:08:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b3d7b82eb5073a4baa6511105979367892775100",
          "body": "After a shit ton of experiments with ray casting using the projection matrices, it just didn't work. I have no idea why that shit happens. But honestly I have absolutely no clue. Reverted to an alternative ray casting method even lighter that simply moves the camera front vector according to the mou\n[…]\ncolors.  This should also happen to a different fbo as well. Picking involves reading from both fbos, first for checking the selected object, then for checking if the gizmo was selected. This is a WIP",
          "is_bot": false,
          "headline": "Ray Casting attempt and more",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2020-05-28T12:57:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b422a2193bf28c1ed5a198ab00bca466eaaf7a48",
          "body": "MeshBufferManager manages data buffers per mesh. Dynamic memory allocatio regarding instance Data on both RAM and VRAM. SSBOs are used to replace per mesh UBOs, and offer much larger storage when required. \n\nRevamped gamepadcontroller class. New gamepad supports button and action mapping. First test\n[…]\ng a DS4 controller class which properly maps not by default supported DS4 v2 controlers. In the future I can add support for any controller :)\n\nAdded new function for calculating mipmap level in GLSL.",
          "is_bot": false,
          "headline": "MeshBufferManager, Revamped gamepad support, SSBOs and more",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2020-05-26T15:40:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a92370f1709a96b532348d5112b1a6256a1a133c",
          "body": "Basic implementation of WBOIT. Brought back support for deferred decals. Added the decal shader logic into the main material shader. Reorganized settings to make the app more robust and interactive.\n\nAdded support for exporting only visible objects to exml/mbin",
          "is_bot": false,
          "headline": "WBOIT + Deferred Decal Rendering  + Settings Reorganization",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2020-05-24T11:33:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5034818e825df3562de32bf6e5a533f621f82708",
          "body": "GLControl cleanup\nRenderOptions reorganization\nFixed some bugs related to material loading using PAK files.\nAdded routines for auto NMS installation folder identification. (Steam should work flawlessly, not sure about GOG)\nAdded Tone mapping shaders\nEmbedded default textures to the app\nReorganized f\n[…]\n related to loading childrens of reference objects\nShader cleanup\nMinor updates on about page\nAdded work dispatcher thread to handle cpu related tasks of the UI thread without interrupting UI updates.",
          "is_bot": false,
          "headline": "",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2020-05-21T00:40:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "94b8053333d0b4603423c33af3e2600d9b39a444",
          "body": "Disabled animation loading before the animation is used, in order to save time during scene loading. Actual animation data are loaded only when the animation is enabled for playback\nMultiple shaders have been added to add support for bloom effect, gaussian blur and additive blending.\nAdded a shader \n[…]\npendency version updates\nAdded a very preliminary version of PBO buffers per texture for kinda asynchronous texture upload. Looks like its working good for now but I think there is still more into it.",
          "is_bot": false,
          "headline": "A LOT of stuff once again",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2020-05-14T19:25:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "115b3429e5292d765520fcc6e31b925fb603deaa",
          "body": "Removed locator and joint shaders\nAdded inverted look and projection matrices to the comonperframeUBO.\nIncluded inverse world matrices per instance and added support for decal rendering (decal normal maps are not accumulated atm)\nRemoved stored shader programs per model.\nNecessary update of UBO structs.\nAdded support for 2nd diffuse textures.",
          "is_bot": false,
          "headline": "Various",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2020-05-03T20:18:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e344d6dee48a3e8689242dd6e528a68e827eea6b",
          "body": "TBOs seem to be working smooth AF. There are still some issues with decal models and their clone calculations (not inheriting proper instanceIDs)\n\nI'm about to fix them and also get rid of all the shader programs that get cached to each model. I think its not required anymore.",
          "is_bot": false,
          "headline": "added support for instancedMeshSkinMats in TBOs",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2020-04-27T11:32:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "812ea040f202fc0ac62aff0d445e1fab7179f640",
          "body": "Implemented a proper (expensive but correct) way of calculating the distance from a point to  an AABB. Sorting results look decent for now.\n\nEncountered some problems regarding instanced data, spend the entire day trying to remember what the fuck was wrong. I finally remembered... skin matrices are \n[…]\nd all instance skin data, without having problems with high instance counts and limited UBO sizes. On the other hand the corresponding data from mesh UBOs can be removed so this is also an extra gain.",
          "is_bot": false,
          "headline": "AABB recalculation + checkpoint",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2020-04-26T20:31:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "95ddf15e4a89a8dcf660d031f6b2799d2d7715d0",
          "body": "Brought back to life back to front rendering of transparent objects\nRemoved all the BULLSHIT flags that i had as triggers for the transparent objects. Transparents are the ones that have TRANSPARENCY or CUTOUT (still not sure about that) and transparent scalar.\nCleaned up the shaders a bit\n\n\nAlso fixed the AABB calculation of mesh objects (for now the input value from the mbin attributes are transferred to the actual object)",
          "is_bot": false,
          "headline": "Fixed (as much as I could for now)  transparent object rendering",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2020-04-25T19:43:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "13ac0a6a5897b2a7314895db739db4a77c8efea1",
          "body": "Results are looking good. Also added some extra optimizations regarding mesh info updates.",
          "is_bot": false,
          "headline": "Added support for Diffuse2Maps.",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2020-04-25T13:51:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "527cad348fe5d29b82a491c03930b7993da4266c",
          "body": "Probably a shit ton of performance fixes. For sure fixed the bug related to the calculation of the TBN matrix in the CPU side.\n\nReorganized completely the way that the scene is updated.\n\nlibmbin, opentk have been updated, model classes have been revisited and re-organized.\n\nOctree implementation has been added\n\nNew font has been added\n\nPlus a lot more that I can't even remember x.x",
          "is_bot": false,
          "headline": "I don't even remember what has changed since the last one",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2020-04-24T12:39:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b6c734002dc92c1a8e14192e7ef0ae7806259279",
          "body": "Added a super simple texture renderer OpenTK Gamewindow class that helps me debug texture loading issues.",
          "is_bot": false,
          "headline": "Added the TextureRenderer  Project files",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-12-09T22:09:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cd7910a1d5357de3bedd0f195550525d32dc9a60",
          "body": "Fixes on LOD  distance evaluation, brought back gUserData uniform on mesh objects, added tone mapping on the shaders, added support for the NORMAL_TILING material flag + UI fixes.\n\nThere are still some visible issues with toggling instances renderable. I think this is the next issue that has to be solved prior to release, but this require some thinking.",
          "is_bot": false,
          "headline": "Fixed Vertex Color attributes",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-12-09T22:08:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f8d19c2e19ccb585667ace55e517f669850c0238",
          "body": "Live shader recompilation is a bit broken on some special cases. I've also implemented support for UV scrolling effects and I'm working towards proper rendering of transparent objects.",
          "is_bot": false,
          "headline": "Reword the GLSL Preprocessor, Fixed lighting issues",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-12-08T17:44:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "23ca493e4af2380d3a82bb215c64e33305b58a38",
          "body": "Primitive LOD filtering is now a thing, adopting properties of the entity files\nIn order to properly render transparent objects with whatever technique (sorted or unsorted) two things had to be implemented: 1) Output of the calculated light color to the gbuffer, therefore a new attachment was added.\n[…]\nanches of the same code. I am in the process of modifying shader source files to make this work back to normal. Then I'll test this with the deferred and forward lighting passes to see how this works.",
          "is_bot": false,
          "headline": "LOD Filtering, Overhaul of the GLSL preprocessing step and more",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-12-04T17:13:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d430dd2818f7bfd85082152bf98db5c3e8435704",
          "body": "Bounding spheres are calculated much more efficiently now\nAdded extra animation information in the UI\nRefactored the whole animation pipeline to use less resources, cache transformations to memory, removed animation timers, properly calculating and interpolating between frame data.\nI'm about to enter the instanced rendering territory",
          "is_bot": false,
          "headline": "Repaired Shaders, UI changes and Bug Fixing, Animation overhaul",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-12-01T10:37:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d2a9ea5e0ba8934b4c3a5cdb030f1496f829e373",
          "body": "I don't even remember most of the bugs that I have fixed at this point. The most critical one dealt with invalid/duplicate hashes when fetching VAOs from the resource Manager. VAOs are now moved to their corresponding geometry object. Implemented a brand new PBR shader as well as a  blooming effect for  glowing objects.",
          "is_bot": false,
          "headline": "Lighting + Bug Fixing",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-11-30T02:25:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "09d5bf7a919dd3447c70f13ce9e639d3bdb208da",
          "body": "…I can't get them organized into one place. They keep getting copied to the internal Resources folder of the Solution. Slight progress on animation caching.",
          "is_bot": false,
          "headline": "I have messed up completely with the shader resources. It seems like …",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-11-26T23:49:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ac99e72fe14fb845f1484c58df6fb1d033ee09e6",
          "body": "Fixed a lot of issues related to animation playback\nAdded Some LOD related components in order to load LOD models properly\nOptimization fixes on light uploading\nNecessary preparation for shadow mapping\n\nTODO: Frustum culling still looking goofy. I need to make sure that its working properly in all cases.",
          "is_bot": false,
          "headline": "Beyond Updates + Rendering Optimizations + Fixes",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-11-26T02:09:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ef0f30a18b337e8c6c1d2e11dc173d5855a8fd10",
          "body": "These are 3 month old changes. I need to remember where I fuck I was working on x.x",
          "is_bot": false,
          "headline": "Omnidirectional lighting progress + fixes for beyond",
          "author_name": "Greg Kasapidis",
          "author_login": "gregkwaste",
          "committed_at": "2019-11-03T10:36:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e2c974a65a003b1f4543c929415818f7dd856b34",
          "body": "…pping",
          "is_bot": false,
          "headline": "Moved Shader Folders and started working on omnidirectional shadow ma…",
          "author_name": "Greg Kasapidis",
          "author_login": "gregkwaste",
          "committed_at": "2019-08-18T20:05:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d8b215adef03b41e3386ea8b2e23cbc41db93878",
          "body": "Small bug fixes and extended error handling\n- Fixed shader lighting for adding support for the default lighting.",
          "is_bot": false,
          "headline": "Updating tool for Beyond + Fixes",
          "author_name": "Greg Kasapidis",
          "author_login": "gregkwaste",
          "committed_at": "2019-08-17T10:20:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "274236c1aa8e81af43b2f625d470e48a17dd9f1d",
          "body": null,
          "is_bot": false,
          "headline": "First version of a multi light system",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-08-15T14:24:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "898e39af6082192972cde9cdf2cfb647d86de797",
          "body": "1) Worked a bit on the texture mixer and made it comply with the texture mixer class and stuff. I think that both the viewer and the mixer work exactly the same way so its a good tool for testing\n2) I think I improved the application of pose data even more. I'm sorting the pose matrices and keeping \n[…]\nf the same textures over and over in the program. Memory impact should be kinda less especially on some of the largest models that overuse the same textures.\n6) I have forgotten what else i have fixed",
          "is_bot": false,
          "headline": "Various Experiments and Fixes",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-07-20T20:52:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "89246b74e11fb83dc6456793fb4b8f7ce06d53cb",
          "body": "I think the tool layout is much more cleaner this way.\nMaybe shit has to be reorganized a bit better but I'm keeping it this way for the time being...",
          "is_bot": false,
          "headline": "Layout Update",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-07-13T22:24:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bf7f585c5438e8aafffcbeff4ac8cf01c3094628",
          "body": "#1 Added toggles for frustum culling and animations\n#2 Implemented a better way for handling pose information'\n#3 I forgot to use the nMat in the shader -.-\n#4 Some other minor shit i guess",
          "is_bot": false,
          "headline": "Various Updates",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-07-13T21:54:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ed13487650b22da6d008247c8e684d675b4db648",
          "body": "Working towards a more complete lighting system. (I'm pissed because again the mesh part normals do not match with the meshes close to them...",
          "is_bot": false,
          "headline": "New Light system",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-07-08T09:23:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ce24e50a224da90fbc6d2336e9ee433c198f5b90",
          "body": "Brought back RenderBoundHulls flag. Also implemented a UBO report function that tracks the GLSL shader and fetches the uniform offset so that I won't get lost next time that I have to implement a struct for that kind of shit.",
          "is_bot": false,
          "headline": "A bit of a cleanup",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-06-18T11:59:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c7a17a91b6e97ec98b7bedd96b6130554e65dff3",
          "body": "The whole pursuit was about implementing a better light system. It soon ended up with organizing all shader uniforms into structs, using UBOs for common perframe and permesh parameters. Because of the GLSL mess with explicit uniform locations in uniforms within a struct, I ended up loading all the a\n[…]\nendously cleaner (although capturing the correct format of the C# structs to match the std140 GLSL versions was a nightmare), but performance seems pretty much the same, not to say it got a bit worse.",
          "is_bot": false,
          "headline": "Added UBO Support and organized the basic shaders",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-06-18T10:27:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5271a3ddc7c7dc41a843d9bbce0faa5070a8d576",
          "body": "All the color mismatches that occured mostly on proc gen models, occured due to false colorspace used for the textures. It seems like all diffuse textures use sRGB, and I'm forcing this atm. Actually due to lack of info, I'm forcing sRGB on all textures other than the RG normal textures.",
          "is_bot": false,
          "headline": "Added support for sRGB textures",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-06-17T10:26:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "36bf02b416359966f8d4045f83f472b63b8cf77b",
          "body": "Need to rework a bit the animation loading part, as it now is loading only the first active animation and also possibly blend animations together. \nI need to make the generic animation toggle button to properly interact with the GLControl. Animations are working find though.",
          "is_bot": false,
          "headline": "Added Animations to the UI",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-06-16T23:32:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1b5feb2fe3131b55f590716db3a0b1e89cc23244",
          "body": "I forgot that the InvBMatrix refers to global space while Bindmatrix as well as all the animation frame data are transforms RELATIVE to the parent...\n\nPose data is not calculated properly. Trying to use just animationframes for now...",
          "is_bot": false,
          "headline": "Fixed Pose Data Integration",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-06-16T10:22:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3ae3f97c56aa6d080f057137979466895563491e",
          "body": "I ended up compiling my own version of the library. Probably there was a conflict with the target architecture of the released lib. Also fixed any reference issues with all the other projects of the solution (Mainly QuickFont). Currently working on separating the jointDictionary from a scene, and mo\n[…]\nTODO: I don't trust the cloning functions at all. I simplified them a bit, but I need to work on them again in order to make sure that everything gets uniquely copied when generating a proc gen model.",
          "is_bot": false,
          "headline": "Fixed XAML issues with LibMBIN",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-06-15T18:46:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ed81e440c5742a9df6490e003b030e8729a4eb53",
          "body": "Started with entity parsing. For now one attachment is supported, we fetch it, then go through a component processing procedure. For now AnimPose and AnimData components are supported. AnimPose data has been exposed to the UI, I just need to update the pose on demand when the data changes. TODO: Do the same thing with the animations.",
          "is_bot": false,
          "headline": "libmbin 1.78 + AnimPose Classes",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-06-14T00:07:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3242174c252cc39131d98d8633bee10e40307b8e",
          "body": "1) Added support for model poses. TODO: I need to properly handle locator attachments during object loading. Attachments contain animpose data, which I can use to procedurally generate a pose for a model\n2) Bound the Renderoptions as static resources to the UI.\n3) Added some animation controls on the UI (TODO: I need to make sure that key presses from the glcontrol are mapped to the UI buttons)",
          "is_bot": false,
          "headline": "Reworked Animation Controls",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-06-02T21:07:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "315728763a0b57bd76fe2af7146ecdda3cb3f099",
          "body": "Implemented a new RenderManager class that tries to organize mesh objects and render them directly. For now I don't do any sorting. I just separate static and trransparent objects. Static meshes are loaded first, transparent meshes are rendered after the static with blend on and depthmask off. Works for now but its probably far from perfect.\n\nFixed some bugs regarding empty material loading, UI binding and probably some more shit.",
          "is_bot": false,
          "headline": "Implemented RenderManager class  + Transparency support",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-06-01T21:34:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d267cc84a655c183637932569f412f517a76c54d",
          "body": "1) Fixed the texture mixer (texture mixing ressembles as much as possible the original shader)\n2) Updated the gbuffer\n3) Revamped the material class to inherit the TkMaterialData\n4) Added more rendering stats",
          "is_bot": false,
          "headline": "Fixes",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-05-31T22:13:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "095d31c1ca9815b19f48f0080111640c36cd76f5",
          "body": "Replaced the custom GUI for querying object properties with XAML binding rules. Scene editing should work (hopefully) without many bugs. \n\nCompletely overhauled material parsing. Now texture parsing is done through the samplers. A texture resource manager is implemented and assigned per model. This way its scene model keeps its own textures.",
          "is_bot": false,
          "headline": "XAML updates + Material overhaul",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-05-30T17:14:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2363720b3ed6ff3058ad82cdd5fb0cc8a83b02f1",
          "body": "1) I fixed bugs related to capsule and cylinder collision loading. Should be working properly now\n2) Fixed collision mesh loading and rendering based on the bound hulls\n3) Added support for multitextures: This contains: a) converting all textures to 2darrays in order to minimize the changes on the s\n[…]\nrop support in the treeview, so that we can start visually manipulating the structure of the scene.\n6) Working towards adding uniform buffers for custom and common material flags.\n7) Should be more...",
          "is_bot": false,
          "headline": "A ton of updates , new features and optimizations",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-05-26T02:14:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8c2d1dc3af15bd6d7b3b090b099141750a884dc0",
          "body": "Fixed a bug with capsule collision rendering. Also I think I got the capsule geometry to  calculate properly.\nOptimized some shader code a bit more\nReorganized the code again. Shader compilation is done by the CGLControl. The main file is super clean now.\nRemoved some unecessary classes",
          "is_bot": false,
          "headline": "Code Organization + even more optimizations + bug fixes",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-05-23T15:48:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5b38e4936edb3aada25c29af2c972ab2fce8b5e7",
          "body": "Optimized the rendering process of the meshmodels, trying to limit the calls to GL.UniformLocation as much as possible. Also tried to optimize text rendering process as well.\n\nAdded some more rendering thread request messages. Improved the GUI. Reorganized some of the GLControl code.\n\nAlso farewell to the initial model_viewer project. I removed it from the solution file :'(",
          "is_bot": false,
          "headline": "Optimizations + More Vol2",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-05-23T11:11:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9ffdf96860507c6270f0adb6ecb90dd2bfd0b6ab",
          "body": "Added a model update method, which dramatically reduces the multiplications during object transform matrix calculations. Now transform attributes can be calculated on the fly during the update for a model and its children.\n\nReplaced my text renderer with QuickFont. Looks fine and much simpler.\n\nAdde\n[…]\nfficient rendering of joints\n\nAdded a new request type for handling scene update requests (should be executed from the rendering thread).\n\nOther optimizations, reorganizations and fixes here and there",
          "is_bot": false,
          "headline": "Optimizations + More",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-05-05T15:12:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "65b6743b312a45ad20ce80823d59a6f1ffb08920",
          "body": "A lot of optimizations.\nI have removed the stupid numeric element from the interface which is much more smooth with textboxes.\nI'm preloading mipmaps from existing textures instead of generating them\nMigrated to OpenGL 4.2 as much as possible\nReorganization to the resource manager\nAdded a unit tests\n[…]\nthis update also adds support for live editing shaders that I had implemented months ago.\n\nThis is a backup commit cause I'll start testing math shit. I believe that OpenTK math library is utter SHIT.",
          "is_bot": false,
          "headline": "I have lost track of how many updates I have made",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2019-05-04T23:13:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f6c531d031acf5d71458e44b93e98ad335f58cf4",
          "body": "Moved rendering to a separate thread to release the UI thread.\nBugfixing on animations\nAdded palette parsing from biome files (TODO: make sure this is user defined at some point)",
          "is_bot": false,
          "headline": "Updated code to the latest libMBIN library.",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2018-08-26T23:59:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "64df5a17928c373e52818277e03370994f2c522d",
          "body": "Fixed Recoloring shaders + code\nPreparing for threaded rendering in the GLControl",
          "is_bot": false,
          "headline": "Brought back the semi deferred renderer.",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2018-08-26T02:40:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d147350abace0ac4a7a583fd19608cfb55999b48",
          "body": "Combined TextureMixer Project\nCreated a new WPF Project for the VIewer\nAdded a shared code projects for sharing code between all the projects\nA SHIT ton of optimizations  on the control as well as the rendering process and the shaders (I'm too tired to list them all now lol)",
          "is_bot": false,
          "headline": "Completely reorganized Solution.",
          "author_name": "gregkwaste",
          "author_login": "gregkwaste",
          "committed_at": "2018-08-23T01:07:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cbd2d16c09fef2ef1fa8abf80f645f547cb0e301",
          "body": null,
          "is_bot": false,
          "headline": "Added updated shaders",
          "author_name": "Greg Kasapidis",
          "author_login": "gregkwaste",
          "committed_at": "2018-08-20T17:28:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a6a7e5083e3c7074f5b95d2df44dc925d1c96040",
          "body": null,
          "is_bot": false,
          "headline": "Minor Updates",
          "author_name": "Greg Kasapidis",
          "author_login": "gregkwaste",
          "committed_at": "2018-08-20T17:11:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 13,
      "commits_last_year": 1,
      "latest_release_at": "2025-08-20T08:14:37Z",
      "latest_release_tag": "v0.93.1-pre",
      "releases_from_tags": false,
      "days_since_last_push": 139,
      "active_weeks_last_year": 1,
      "days_since_latest_release": 350,
      "mean_days_between_releases": 145.5
    },
    "artifacts": {
      "collected": true,
      "structure": [],
      "declarations": [
        {
          "name": "SimpleTextureRenderer",
          "path": "SimpleTextureRenderer/SimpleTextureRenderer.csproj",
          "tokens": [
            "nuget.output_type:exe"
          ],
          "ecosystem": "nuget"
        },
        {
          "name": "TextureMixer",
          "path": "TextureMixer/TextureMixer.csproj",
          "tokens": [
            "nuget.output_type:winexe"
          ],
          "ecosystem": "nuget"
        },
        {
          "name": "TextureRenderer",
          "path": "TextureRenderer/TextureRenderer.csproj",
          "tokens": [
            "nuget.output_type:exe"
          ],
          "ecosystem": "nuget"
        },
        {
          "name": "Viewer_Unit_Tests",
          "path": "Viewer_Unit_Tests/Viewer_Unit_Tests.csproj",
          "tokens": [
            "nuget.output_type:library"
          ],
          "ecosystem": "nuget"
        },
        {
          "name": "WPFModelViewer",
          "path": "WPFModelViewer/WPFModelViewer.csproj",
          "tokens": [
            "nuget.platform_tfm:windows8.0",
            "nuget.output_type:winexe"
          ],
          "ecosystem": "nuget"
        }
      ]
    },
    "community": {
      "has_readme": true,
      "has_license": false,
      "readme_badges": {
        "hosts": [
          "shields.io"
        ],
        "total": 3,
        "header": 3,
        "collected": true,
        "has_inspect_badge": false
      },
      "has_description": false,
      "has_contributing": false,
      "health_percentage": 14,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": []
    },
    "popularity": {
      "forks": 7,
      "stars": 47,
      "watchers": 8,
      "fork_history": {
        "days": [
          {
            "date": "2021-04-04",
            "count": 1
          },
          {
            "date": "2021-06-27",
            "count": 1
          },
          {
            "date": "2022-01-26",
            "count": 1
          },
          {
            "date": "2022-03-29",
            "count": 1
          },
          {
            "date": "2022-05-26",
            "count": 1
          },
          {
            "date": "2023-03-20",
            "count": 1
          },
          {
            "date": "2024-05-15",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 7,
        "total_forks": 7
      },
      "star_history": null,
      "open_issues_and_prs": 5
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "SimpleTextureRenderer/SimpleTextureRenderer.csproj",
        "TextureMixer/TextureMixer.csproj",
        "TextureRenderer/TextureRenderer.csproj",
        "Viewer_Unit_Tests/Viewer_Unit_Tests.csproj",
        "WPFModelViewer/WPFModelViewer.csproj"
      ],
      "largest_source_bytes": 80963,
      "source_files_sampled": 76,
      "oversized_source_files": 1,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "SimpleTextureRenderer/SimpleTextureRenderer.csproj",
        "TextureMixer/TextureMixer.csproj",
        "TextureRenderer/TextureRenderer.csproj",
        "Viewer_Unit_Tests/Viewer_Unit_Tests.csproj",
        "WPFModelViewer/WPFModelViewer.csproj"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "nuget"
      ],
      "dependencies": [
        {
          "name": "OpenTK",
          "manifest": "SimpleTextureRenderer/SimpleTextureRenderer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "3.1.0"
        },
        {
          "name": "AssimpNet",
          "manifest": "WPFModelViewer/WPFModelViewer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "5.0.0-beta1"
        },
        {
          "name": "Costura.Fody",
          "manifest": "WPFModelViewer/WPFModelViewer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "5.8.0-alpha0098"
        },
        {
          "name": "Fody",
          "manifest": "WPFModelViewer/WPFModelViewer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "6.8.1"
        },
        {
          "name": "Gameloop.Vdf",
          "manifest": "WPFModelViewer/WPFModelViewer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "0.6.2"
        },
        {
          "name": "MathNet.Numerics",
          "manifest": "WPFModelViewer/WPFModelViewer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "5.0.0"
        },
        {
          "name": "Microsoft.CSharp",
          "manifest": "WPFModelViewer/WPFModelViewer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "4.7.0"
        },
        {
          "name": "Newtonsoft.Json",
          "manifest": "WPFModelViewer/WPFModelViewer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "13.0.3"
        },
        {
          "name": "NLog",
          "manifest": "WPFModelViewer/WPFModelViewer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "5.3.2"
        },
        {
          "name": "OpenTK.GLWpfControl",
          "manifest": "WPFModelViewer/WPFModelViewer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "4.2.3"
        },
        {
          "name": "OpenTK",
          "manifest": "WPFModelViewer/WPFModelViewer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "4.8.2"
        },
        {
          "name": "System.Drawing.Common",
          "manifest": "WPFModelViewer/WPFModelViewer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "8.0.7"
        },
        {
          "name": "WindowsAPICodePack",
          "manifest": "WPFModelViewer/WPFModelViewer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "8.0.4"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 0,
        "open_issues": 5,
        "closed_ratio": 0.667,
        "closed_issues": 10,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "gregkwaste",
          "commits": 198,
          "avatar_url": "https://avatars.githubusercontent.com/u/7515235?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": false,
      "has_tests": false,
      "ci_workflows": [],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 7,
            "reason": "binaries present in source code",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": null,
            "reason": "no workflows found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 0,
            "reason": "license file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": null,
            "reason": "no dependencies found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": null,
            "reason": "No tokens found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "ee2ed17e79ff82ec4cfd069f33fcd2234e443e03",
        "ran_at": "2026-08-05T17:52:50Z",
        "aggregate_score": 1.7,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "recent_prs": {
        "merged_7d": 0,
        "decided_7d": 0,
        "merged_30d": 0,
        "authors_30d": 0,
        "decided_30d": 0,
        "sample_size": 0,
        "window_days": 30,
        "sample_exhausted": false,
        "authors_probed_30d": 0,
        "newcomer_merged_30d": 0,
        "bot_prs_excluded_30d": 0,
        "newcomer_authors_30d": 0,
        "newcomer_decided_30d": 0
      },
      "ci_last_run_at": "2025-08-20T07:59:56Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": null,
      "ci_last_conclusion": null,
      "oldest_open_issues": [
        {
          "number": 9,
          "created_at": "2024-09-02T01:54:10Z",
          "last_comment_at": "2024-10-08T23:02:36Z",
          "last_comment_author": "gregkwaste"
        },
        {
          "number": 11,
          "created_at": "2024-09-10T15:38:07Z",
          "last_comment_at": "2025-03-26T06:25:26Z",
          "last_comment_author": "kefiiiiir"
        },
        {
          "number": 13,
          "created_at": "2025-02-17T04:30:17Z",
          "last_comment_at": "2025-09-21T22:46:00Z",
          "last_comment_author": "jurassicjordan"
        },
        {
          "number": 14,
          "created_at": "2025-03-07T17:02:36Z",
          "last_comment_at": "2025-09-23T18:25:40Z",
          "last_comment_author": "davebastian"
        },
        {
          "number": 16,
          "created_at": "2026-01-22T18:32:20Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/gregkwaste/NMSMV",
    "host": "github.com",
    "name": "NMSMV",
    "owner": "gregkwaste"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "at_risk",
      "name": "Overall health",
      "note": "The weighted overall 27 is calibrated to 21 on the published index scale (record calibration 2026-08-02).",
      "notes": [
        {
          "code": "overall_calibration",
          "params": {
            "raw": 27,
            "calibrated": 21,
            "calibration": "2026-08-02"
          }
        }
      ],
      "value": 21,
      "inputs": {
        "security": 17,
        "vitality": 30,
        "community": 32,
        "governance": 35,
        "calibration": "2026-08-02",
        "engineering": 17,
        "ai_readiness": 42,
        "weighted_overall_raw": 27
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "at_risk",
        "name": "Vitality",
        "value": 30,
        "weight": 0.21,
        "metrics": [
          {
            "key": "development_activity",
            "band": "critical",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 13,
            "inputs": {
              "commits_last_year": 1,
              "human_commit_share": 1,
              "days_since_last_push": 139,
              "active_weeks_last_year": 1
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 139 days ago",
                "points": 9.9,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 139
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "1/52 weeks with commits",
                "points": 0.7,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 1
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "1 commits in the last year",
                "points": 2.7,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "moderate",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 56,
            "inputs": {
              "releases_count": 13,
              "latest_release_tag": "v0.93.1-pre",
              "releases_from_tags": false,
              "days_since_latest_release": 350,
              "mean_days_between_releases": 145.5
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "13 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 13
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 350 days ago",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 350
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~145.5 days",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 145.5
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "exceptional",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "dormant",
              "guards": [
                "recent_release"
              ],
              "signals": [
                "scorecard_unmaintained"
              ],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": 0,
              "unanswered_open_issues": 3,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 350,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "no human commit for 350 days, with nothing left unanswered; held at dormant by a release within the year",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_quiet",
                    "params": {
                      "days": 350
                    }
                  },
                  {
                    "code": "abandonment_guarded",
                    "params": {
                      "guards": "a release within the year"
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 32,
        "weight": 0.17,
        "metrics": [
          {
            "key": "popularity",
            "band": "weak",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 38,
            "inputs": {
              "forks": 7,
              "stars": 47,
              "watchers": 8,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "47 stars",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 47
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "7 forks",
                "points": 6.5,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 7
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "8 watchers",
                "points": 4.7,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 8
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "at_risk",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 25,
            "inputs": {
              "has_readme": true,
              "has_license": false,
              "readme_badges": 3,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "readme_badge_services": [
                "shields.io"
              ],
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "no license file detected",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "license_absent",
                    "params": {}
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "weak",
        "name": "Sustainability & Governance",
        "value": 35,
        "weight": 0.23,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 10,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "weak",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): PR acceptance, Newcomer PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "pr_acceptance",
                    "newcomer_pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 49,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 5,
              "closed_issues": 10,
              "prs_merged_7d": 0,
              "prs_decided_7d": 0,
              "prs_merged_30d": 0,
              "prs_decided_30d": 0,
              "issue_closed_ratio": 0.667,
              "closed_unmerged_prs": 0,
              "first_time_authors_30d": 0,
              "first_time_prs_merged_30d": 0,
              "first_time_prs_decided_30d": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "67% of issues closed",
                "points": 28,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 67
                    }
                  }
                ],
                "max_points": 42
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "no decided pull requests or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_decided_prs_or_data",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "newcomer_pr_acceptance",
                "name": "Newcomer PR acceptance",
                "detail": "no first-time contributor's PR decided in 30d",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_newcomer_prs",
                    "params": {
                      "days": 30
                    }
                  }
                ],
                "max_points": 13
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 52,
            "inputs": {
              "followers": 18,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "gregkwaste",
              "public_repos": 24,
              "account_age_days": 4473
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "18 followers of gregkwaste",
                "points": 9.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 18,
                      "login": "gregkwaste"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "24 public repos, account ~12 yr old",
                "points": 22.2,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 24
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 12
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "critical",
        "name": "Engineering Quality",
        "value": 17,
        "weight": 0.19,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "critical",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "has_ci": false,
              "has_tests": false,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "weak",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "has_description": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "critical",
        "name": "Security",
        "value": 17,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "critical",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Dangerous-Workflow, Packaging, Pinned-Dependencies, Token-Permissions. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "dangerous_workflow",
                    "packaging",
                    "pinned_dependencies",
                    "token_permissions"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 17,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 13,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 5,
              "scorecard_aggregate": 1.7
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "binaries present in source code",
                "points": 5.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no workflows found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "No tokens found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "exceptional",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "commit_weight_rule": {
                "min_commits": 50,
                "min_commit_share": 0.1
              },
              "review_only_matches": 0,
              "below_threshold_exposures": [],
              "assessed_self_published_locations": 2
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "weak",
        "name": "AI Readiness",
        "value": 42,
        "weight": 0.04,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "weak",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 35,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.66,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "66 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 35.2,
                "status": "partial",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 66,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "at_risk",
            "name": "Verify loop (build / test / typecheck)",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_pinned_dependencies"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 26,
            "inputs": {
              "has_nix": false,
              "has_tests": false,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [
                "SimpleTextureRenderer/SimpleTextureRenderer.csproj",
                "TextureMixer/TextureMixer.csproj",
                "TextureRenderer/TextureRenderer.csproj",
                "Viewer_Unit_Tests/Viewer_Unit_Tests.csproj",
                "WPFModelViewer/WPFModelViewer.csproj"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "SimpleTextureRenderer/SimpleTextureRenderer.csproj, TextureMixer/TextureMixer.csproj, TextureRenderer/TextureRenderer.csproj (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "SimpleTextureRenderer/SimpleTextureRenderer.csproj, TextureMixer/TextureMixer.csproj, TextureRenderer/TextureRenderer.csproj"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "C# (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "C#"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "exceptional",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 99,
            "inputs": {
              "primary_language": "C#",
              "largest_source_bytes": 80963,
              "source_files_sampled": 76,
              "oversized_source_files": 1
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "C# (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "C#"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "1/76 source files over 60KB",
                "points": 54.3,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 76,
                      "oversized": 1
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? Carries a deliberately small weight: agent tooling is a real maintenance signal, but its absence must never gate the top of the scale (calibration saturates at raw 91, so 100/100 remains reachable with AI Readiness at zero)."
      }
    ],
    "classification": {
      "top": [
        "library",
        "application"
      ],
      "labels": [
        "desktop",
        "library"
      ],
      "scores": {
        "desktop": 4.8,
        "library": 4.8,
        "application": 3
      },
      "primary": "desktop",
      "evidence": [
        {
          "tier": "declared",
          "label": "desktop",
          "source": "nuget.output_type:winexe",
          "weight": 4.8
        },
        {
          "tier": "declared",
          "label": "library",
          "source": "nuget.output_type:library",
          "weight": 4.8
        },
        {
          "tier": "declared",
          "label": "application",
          "source": "nuget.output_type:exe",
          "weight": 3
        }
      ],
      "artifacts": [
        {
          "path": "SimpleTextureRenderer/SimpleTextureRenderer.csproj",
          "labels": [
            "application"
          ],
          "ecosystem": "nuget"
        },
        {
          "path": "TextureMixer/TextureMixer.csproj",
          "labels": [
            "desktop"
          ],
          "ecosystem": "nuget"
        },
        {
          "path": "TextureRenderer/TextureRenderer.csproj",
          "labels": [
            "application"
          ],
          "ecosystem": "nuget"
        },
        {
          "path": "Viewer_Unit_Tests/Viewer_Unit_Tests.csproj",
          "labels": [
            "library"
          ],
          "ecosystem": "nuget"
        },
        {
          "path": "WPFModelViewer/WPFModelViewer.csproj",
          "labels": [
            "desktop"
          ],
          "ecosystem": "nuget"
        }
      ],
      "confidence": "high",
      "host_extension": false,
      "runs_as_process": true,
      "consumed_by_code": true
    },
    "metrics_version": "2.5.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-08-05T17:52:55.143587Z",
  "schema_version": "0.31.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/g/gregkwaste/NMSMV.svg",
  "full_name": "gregkwaste/NMSMV",
  "license_state": "absent",
  "license_spdx": null
}

评分是信号,而非担保。 评分反映的是 GitHub 上公开可见的实践——不是代码审计,也不是安全保证。

缺失数据将被剔除并重新归一化权重,绝不按零分计。方法论已版本化并公开:指标 v2.5.0、模式 v0.31.0—— 完整方法论 · 指标知识库.

单项结果在整体记录中的位置: 汇总统计.