JSON-Rohbericht maschinenlesbar
{
"data": {
"repo": {
"topics": [
"devops",
"gitops",
"software-deployment",
"windows-administration"
],
"is_fork": false,
"size_kb": 13922,
"has_wiki": true,
"homepage": null,
"languages": {
"C#": 2085537,
"Dockerfile": 1030,
"PowerShell": 249474
},
"pushed_at": "2026-07-22T19:31:01Z",
"created_at": "2025-03-16T01:20:17Z",
"owner_type": "Organization",
"updated_at": "2026-07-22T19:31:29Z",
"description": "Cimian is a managed software deployment system for .msi, .msix, .exe, .nupkg, and pwsh scripts for Windows written in C#",
"is_archived": false,
"is_disabled": false,
"license_spdx": "Apache-2.0",
"default_branch": "main",
"license_spdx_raw": "Apache-2.0",
"primary_language": "C#",
"significant_languages": [
"C#",
"PowerShell"
]
},
"owner": {
"blog": null,
"name": "Windows Admins Open Source",
"type": "Organization",
"login": "windowsadmins",
"company": null,
"location": null,
"followers": 10,
"avatar_url": "https://avatars.githubusercontent.com/u/184785556?v=4",
"created_at": "2024-10-12T21:24:42Z",
"is_verified": null,
"public_repos": 14,
"account_age_days": 650
},
"license": {
"state": "standard",
"spdx_id": "Apache-2.0",
"raw_spdx": "Apache-2.0",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v0.1.7",
"kind": "patch",
"published_at": "2026-07-21T19:15:09Z"
},
{
"tag": "v0.1.6",
"kind": "patch",
"published_at": "2026-07-20T21:53:45Z"
},
{
"tag": "v0.1.4",
"kind": "patch",
"published_at": "2026-07-20T06:48:33Z"
},
{
"tag": "v0.1.3",
"kind": "patch",
"published_at": "2026-07-19T00:25:36Z"
},
{
"tag": "v0.1.2",
"kind": "patch",
"published_at": "2026-06-24T05:34:47Z"
},
{
"tag": "v0.1.1",
"kind": "patch",
"published_at": "2026-06-23T13:10:51Z"
},
{
"tag": "v0.1.0",
"kind": "minor",
"published_at": "2026-06-20T01:05:27Z"
},
{
"tag": "v0.0.9",
"kind": "patch",
"published_at": "2026-06-19T23:14:39Z"
},
{
"tag": "v0.0.8",
"kind": "patch",
"published_at": "2026-06-11T08:22:08Z"
},
{
"tag": "v0.0.7",
"kind": "patch",
"published_at": "2026-06-10T01:59:55Z"
},
{
"tag": "v0.0.5",
"kind": "patch",
"published_at": "2026-06-05T02:38:34Z"
},
{
"tag": "v0.0.4",
"kind": "patch",
"published_at": "2026-06-04T12:39:14Z"
},
{
"tag": "v0.0.3",
"kind": "patch",
"published_at": "2026-05-11T05:11:13Z"
},
{
"tag": "v0.0.2",
"kind": "patch",
"published_at": "2026-05-07T18:23:04Z"
},
{
"tag": "v0.0.1",
"kind": "patch",
"published_at": "2026-05-06T17:46:09Z"
}
],
"recent_commits": [
{
"oid": "292065323c81fe2cf1e3e9e97daf20222990c599",
"body": "…P wrapper-MSI detection is not stripped (#76)\n\nThe client (managedsoftwareupdate) supports an ARP DisplayName fallback on\ntype=msi installs entries for wrapper MSIs that keep no Windows Installer\nregistration (Mozilla Firefox), but makecatalogs' and makepkginfo's InstallItem\nmodels omitted the display_name field, so it was stripped out of generated\ncatalogs and the feature was inert fleet-wide.",
"is_bot": false,
"headline": "makecatalogs/makepkginfo: carry installs[].display_name through so AR…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-07-22T19:31:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "478c54998711e718542d6e361ba50b45cff1a855",
"body": "…B#3754) (#75)\n\nThe agent stamps builds as yyyy.MM.dd.HHmm (e.g. 2026.07.20.0632); older builds\nemitted a 3-component yyyy.M.DDHH form with day+hour merged (2026.7.2006 = 2026-07-20\n06:00). Element-wise numeric comparison mis-orders the merged form: 2026.7.2006 ->\n[2026,7,2006] sorts newer than 2026\n[…]\now delegates to CompareVersions so both share the fix.\n\nTests: existing VersionService cases unchanged (regression guard) plus stamp decode,\ncross-encoding ordering, and non-stamp rejection. 106 pass.",
"is_bot": false,
"headline": "VersionService: compare Cimian calendar build stamps by build time (A…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-07-22T19:30:29Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "fd730458a62fdc69d1171c83b4de61fe63422748",
"body": "…amespacing, pack-time script validation\n\nThe pinned cimipkg (c53833e) still matched bare $VAR placeholders, so the\narch-matrix .env (architecture=x64) rewrote $architecture in the packaged\npostinstall to 'x64 = ...' - a runtime error that failed every Cimian Tools\n2138 install with MSI 1603 (cimian-pkg#32/#33/#34).",
"is_bot": false,
"headline": "Bump cli/cimipkg to 101563d: braced-only placeholders, CIMIPKG_ env n…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-07-21T18:58:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "223917d96b3adf8a9b57f9138648840908337318",
"body": "…ntenance items (#71)\n\nIdempotent maintenance nopkg scripts (cache clears, time sync, account/user\nchecks) are designed to run every session, so their installcheck legitimately\nreturns install-needed run after run. LoopGuard counted those same-version\nrepeats as an install loop and suppressed them w\n[…]\noopGuard the same\nway OnDemand does, but WITHOUT OnDemand's never-installed/no-receipt semantics,\nso the item still tracks version normally.\n\nCo-authored-by: rodchristiansen <nigel@dashboards.systems>",
"is_bot": false,
"headline": "managedsoftwareupdate: recurring loop-exempt field for idempotent mai…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-07-20T21:12:14Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "095826726362ebe2b7543cd46fbb8b3b7fc3a641",
"body": "…ientIdentifier/SoftwareRepoURL (#73)\" (#74)\n\nThis reverts commit e5ec7771bb173375c91ba9db418161d051775b2f.",
"is_bot": false,
"headline": "Revert \"ApplyPolicyOverrides: never let policy override per-device Cl…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-07-20T17:47:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e5ec7771bb173375c91ba9db418161d051775b2f",
"body": "…tifier/SoftwareRepoURL (#73)\n\nThe MDM policy override (HKLM\\SOFTWARE\\Policies\\Cimian) previously overrode\nClientIdentifier and SoftwareRepoURL in addition to InstallerTimeout. Both are\nper-device / runtime values that preflight recomputes every cycle: ClientIdentifier\nfrom the serial via Snipe-IT, \n[…]\nde to genuinely fleet-static settings (InstallerTimeout only).\nGuardrail so no future profile mistake can orphan the fleet via these fields.\n\nCo-authored-by: rodchristiansen <nigel@dashboards.systems>",
"is_bot": false,
"headline": "ApplyPolicyOverrides: never let policy override per-device ClientIden…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-07-20T17:35:59Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c4b7dc593b1a07c57a767ca69e612eb77391e014",
"body": "…ression (#72)\n\nThe top escalation tier suppressed a looping package with DateTime.MaxValue —\npermanent until a manual per-device 'managedsoftwareupdate --clear-loop' or a\npkgsinfo fingerprint change. A transient failure that persisted for 8+ sessions\n(e.g. the Front Door download outage) therefore \n[…]\naxTime is a global config knob (parallels LoopGuardEnabled).\n\nBuilds clean; SameVersion_EightAttempts test updated to assert the finite cap.\n\nCo-authored-by: rodchristiansen <nigel@dashboards.systems>",
"is_bot": false,
"headline": "LoopGuard: finite backoff cap (LoopMaxTime) instead of permanent supp…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-07-20T06:30:42Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7cb7b14424c6c6e9c9b128a174616a56e99dd472",
"body": "…Policies\\Cimian (#70)\n\nThe CimianPrefs Intune profile ingests a Cimian ADMX and delivers\nSoftwareRepoURL, ClientIdentifier and InstallerTimeout via the Policy CSP\ninto HKLM\\SOFTWARE\\Policies\\Cimian. LoadConfig now applies those values\nover Config.yaml (policy wins), so fleet-wide client settings sh\n[…]\nuration profile instead of per-device file edits. The\nprevious profile targeted a bare Policy/Config/Software/Cimian area that\nthe CSP rejects without ADMX ingestion, so nothing consumed it (AB#3709).",
"is_bot": false,
"headline": "managedsoftwareupdate: merge MDM policy overrides from HKLM\\SOFTWARE\\…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-07-19T00:08:07Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "665eff5fe4c0856f3f52f764399d17a5ea0a0c5b",
"body": "…elf (#69)\n\nThe running sbin-installer.exe locks its own image while installing the\nSbinInstaller MSI, so the file replace either fails with 1603 or waits on\na reboot that lab machines never take. The installed version pins at the\nold build and the item reinstall-loops every session until LoopGuard\nsuppresses it (73 devices, AB#3709). Route the self-update through\nmsiexec directly - sbin-installer is not running in that path, so the\nbinary replaces cleanly.",
"is_bot": false,
"headline": "Install SbinInstaller MSI via msiexec, not through sbin-installer its…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-07-19T00:08:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5b1d5f2b2ca59af237ec2cb32501d7cdc8f49a1f",
"body": "… (#64)",
"is_bot": false,
"headline": "import: don't emit hidden-wrapper ProductCode for installer-type MSIs…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-06-24T05:15:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "eb31df877c0eaac78f2be846547b29eff7080416",
"body": "…, stateless deployer)",
"is_bot": false,
"headline": "submodule: bump cli/cimipkg to c53833e8 (PR#27 — drop SetReinstallAll…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-06-23T12:54:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "85b67bc91ca41670a1485c0852f668905fb326da",
"body": "- actions/checkout → v6\n- actions/cache → v5\n- actions/setup-dotnet → v5\n- actions/upload-artifact → v7\n- actions/download-artifact → v8\n- softprops/action-gh-release v1 → v2\n- Remove FORCE_JAVASCRIPT_ACTIONS_TO_NODE24 env vars",
"is_bot": false,
"headline": "Upgrade GitHub Actions to Node24-compatible versions",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-06-20T19:08:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9ce1d77f06a431ec42100352558b4b84b7274768",
"body": "… (#57)\n\n* msc: marshal service events to UI thread; navigate to Updates on operation start\n\nInstallInfoService (FileSystemWatcher), TriggerService (flag-file poll loop),\nProgressServer/ProgressPipeClient (socket read loops) all raised events on\nthreadpool threads. Viewmodel handlers set XAML-bound \n[…]\n under pwsh. The start-anchored regex never matched a marker\nemitted via stderr. Strip ANSI and walk to the last marker occurrence on\nthe line so stderr-emitted warnings are captured like stdout ones.",
"is_bot": false,
"headline": "MSC improvements: per-row stages, removal UX, failure surfacing (WIP)…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-06-20T00:34:25Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "093b0778065a4c86113dd5a0ef966c48a2ca0e67",
"body": "…ld in OS eligibility gate (#63)",
"is_bot": false,
"headline": "osversion: match Windows 11 marketing version against 10.0.22000+ bui…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-06-20T00:00:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "43c7543ebe1a8eb6649f82992f9a324c55a0a8ab",
"body": "* managedsoftwareupdate: 404 fallback chain for primary manifest (Orphaned/site_default)\n\n* manifest: address review on 404 fallback chain\n\n- Resolve the serial-number candidate lazily so the WMI query only runs\n when the chain actually reaches it (not when the configured identifier\n resolves firs\n[…]\nack chain probes quietly (Debug),\n so the include/specific-manifest semantics are unchanged.\n\nAddresses Copilot review on #58.\n\nClaude-Session: https://claude.ai/code/session_01Mv9Qx1AMqtGYf6iYFxacHr",
"is_bot": false,
"headline": "managedsoftwareupdate: 404 fallback chain for primary manifest (#58)",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-06-19T21:16:57Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b1367ee6b5533e3b01f93bb4541fd9d351fbf47d",
"body": "…t-wide (#59)\n\n* loopguard: add LoopGuardEnabled config to disable suppression fleet-wide\n\nAdds a global admin opt-out for install-loop prevention. Previously\nLoopGuard could only be skipped during bootstrap or bypassed per-package\nvia --item/--clear-loop; there was no config switch to turn it off\ne\n[…]\nation behavior; soften wiki wording about the\n exact log message and session-log visibility.\n\nAddresses Copilot review on #59.\n\nClaude-Session: https://claude.ai/code/session_01Mv9Qx1AMqtGYf6iYFxacHr",
"is_bot": false,
"headline": "loopguard: global LoopGuardEnabled config to disable suppression flee…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-06-19T21:16:35Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1ac9f3f3a8a2dff4bfd2454ac89bb76cda953931",
"body": "… (#61)\n\n* cimiimport: stamp _metadata created_by/creation_date at import (local user + local time)\n\n* cimiimport: do not stamp blank created_by\n\nWhen USERPROFILE is unset and Environment.UserName is empty (unusual\nservice/CI hosts), leave created_by absent rather than persisting an\nempty string, so the prod-checks missing-metadata backfill can still\nfill it later. Addresses Copilot review on #61.\n\nClaude-Session: https://claude.ai/code/session_01Mv9Qx1AMqtGYf6iYFxacHr",
"is_bot": false,
"headline": "cimiimport: stamp _metadata (created_by/creation_date) at import time…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-06-19T21:16:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "778fc9038f0a46bddd2e4e3c0fd267d5697483b0",
"body": "Advances cli/cimipkg 17694a0 -> 63150e6 so generated MSIs supersede prior same-product builds and always re-lay payload on re-install (cimian-pkg #26), rolling up #23-#25.\n\nClaude-Session: https://claude.ai/code/session_01CpzSpVGbLJG9B9aDrF7mi2",
"is_bot": false,
"headline": "submodule: bump cli/cimipkg to 63150e6 (msi supersede + reinstall) (#62)",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-06-19T20:52:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e410d45523bc8dfd9f43c7b1401bbd6bece2aa82",
"body": "* managedsoftwareupdate: honour OnDemand items (always reinstall, never receipt)\n\nClaude-Session: https://claude.ai/code/session_01AaUS8UfLZJcqodyG6MjLXJ\n\n* managedsoftwareupdate: warn (not debug) when stale OnDemand receipt removal fails\n\nClaude-Session: https://claude.ai/code/session_01AaUS8UfLZJcqodyG6MjLXJ",
"is_bot": false,
"headline": "managedsoftwareupdate: honour OnDemand items (#60)",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-06-19T19:03:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "57204a880c1e713922f4543eb3a24ed33a1013bc",
"body": "* stale-usage: Munki-parity scoping and default-on\n\n- UsageStaleUninstallEnabled now defaults to true; per-item opt-in via\n days_untouched_before_uninstall is still required.\n- Scope the pass like Munki unused-software removal: self-serve installs\n and unsubscribed optional items are eligible (sub\n[…]\nts YAML\nserializers each time and gave each instance its own file-lock semaphore.\nHoist a single lazily-created instance so all subscription mutations in a\nrun share one serializer state and one lock.",
"is_bot": false,
"headline": "stale-usage: intent-based scoping and default-on (#54)",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-06-13T07:07:17Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6db776cb00fcaa884c12b5fceaafdf0fc9a6e06d",
"body": null,
"is_bot": false,
"headline": "review: gate wrapper hint on empty File table, one-way ARP match (#56)",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-06-13T01:26:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "685f23f29968b2a42a0bf6b77d7ef1c657b824bd",
"body": "* cimiimport: add --emit-installs for autopkg installs generation\n\n* wrapper MSI: ARP display_name fallback for detection and verification",
"is_bot": false,
"headline": "cimiimport --emit-installs and wrapper-MSI display_name fallback (#55)",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-06-12T23:03:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4d69ad8723c2c1a188522d00c79e2296567695aa",
"body": "…agents (#53)",
"is_bot": false,
"headline": "Drain git pull pipes and bound the wait; deadlocked cimiimport on CI …",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-06-11T20:55:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7539fe8f9c3cdb71ab2c31b7a978f96c2b008607",
"body": "* schema: stale-usage removal fields + IUsageDataSource abstraction\n\nPhase 1 of Munki-style \"uninstall if unused for N days\", sourcing usage\ndata from ReportMate usagetracker rather than building a parallel\ntracker. This PR is schema + abstraction only -- no behavior change;\nthe engine pass lands se\n[…]\n\", which NormalizeItemStatus does\n not recognize (falls through to raw). Switched to the normalized\n \"pending\"; StatusReasonCode.StaleUsageUninstall + needsAction already\n identify it as a removal.",
"is_bot": false,
"headline": "engine: stale-usage removal pass behind UsageStaleUninstallEnabled (#52)",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-06-11T08:00:24Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "70d6f207c1925110be573a9a12a7010c38c9c612",
"body": "…#51)\n\n* schema: stale-usage removal fields + IUsageDataSource abstraction\n\nPhase 1 of Munki-style \"uninstall if unused for N days\", sourcing usage\ndata from ReportMate usagetracker rather than building a parallel\ntracker. This PR is schema + abstraction only -- no behavior change;\nthe engine pass l\n[…]\nskip the pass.\n Two new tests pin both sides of the tolerance window.\n- LogWarning calls dropped the exception object, losing stack traces in\n structured logs. Pass ex to the (ex, message) overload.",
"is_bot": false,
"headline": "usage: ReportMateUsageDataSource reading usagetracker per-user JSON (…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-06-11T08:00:11Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6bf90f9a9d3474e0e0c34a6f0dc12d0badf0f2e4",
"body": "* schema: stale-usage removal fields + IUsageDataSource abstraction\n\nPhase 1 of Munki-style \"uninstall if unused for N days\", sourcing usage\ndata from ReportMate usagetracker rather than building a parallel\ntracker. This PR is schema + abstraction only -- no behavior change;\nthe engine pass lands se\n[…]\nldFromInstaller end-to-end pin: options -> PkgsInfo -> YAML for\n unattended_uninstall and the three stale-usage fields, guarding against\n a repeat of the silently-dropped --unattended_uninstall bug.",
"is_bot": false,
"headline": "schema: stale-usage removal fields + IUsageDataSource abstraction (#50)",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-06-11T07:53:01Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1828237cfca21fcf6f58354572424d05ffd58fe5",
"body": "…NING (#49)\n\nThe refactored firmware pkginfos (EnableSecureBoot, UpdateSecureBootCert,\nLenovoBiosPowerOn, DellBiosPowerOn, EnableBitLocker) intentionally run\ntheir postinstall every session and exit with a CIMIAN-WARNING: marker\nuntil the device is remediated externally (user enables SecureBoot, adm\n[…]\nnull at the\n success branch. Hard-failure branch unchanged.\n- 4 new tests covering: no state created, no rapid-fire trip, mix with\n real attempts still trips on 3rd real, default preserves behavior.",
"is_bot": false,
"headline": "loopguard: skip counters when postinstall self-reports via CIMIAN-WAR…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-06-11T07:52:58Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "06beaafcb09743ce197d7386052c98985bb0cd92",
"body": "Remove the 'by @user' suffixes and the New Contributors section that the\ngenerate-notes API injects, so release notes stay attribution-free.",
"is_bot": false,
"headline": "Strip user attribution from generated release notes",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-06-11T06:27:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d6a0c3021b48d35aa341c282e41b43ebfb21e50a",
"body": "…output)",
"is_bot": false,
"headline": "ci/release: revert filter back to Cimian-* (matches build.ps1 actual …",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-06-10T01:40:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "de582e25394d0e4bc0f091616407e7d3aec5be16",
"body": "…S step",
"is_bot": false,
"headline": "ci/release: filter for CimianTools-* artifacts; drop unused SHA256SUM…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-06-10T01:19:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4c7cdd3e689efb364ba22c62bdb299c08fe59605",
"body": "…pts (#48)\n\n* script-runner: add Warning outcome path + ReportMate cache reader helper\n\nLets pkginfo postinstall scripts signal Warning (exit code 2 or\nCIMIAN-WARNING: marker) for cases like wrong BIOS password or\nneeds-physical-confirm, distinct from hard failure. Ships\nReportMateCache.psm1 so pkgi\n[…]\nng Copilot from posting its review. Added the third\ndiscard at each site; UninstallAsync still returns the 2-tuple and is\nunchanged.\n\n* address copilot review: drop cross-layer cref + add marker tests",
"is_bot": false,
"headline": "script-runner: CIMIAN-WARNING: marker convention for postinstall scri…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-06-10T00:12:33Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6f71c214ca95468bc62c1472079b486c07ad5a2e",
"body": "…e [hotfix] (#47)\n\nbuild.ps1:861 used \"$Architecture: $payloadMB MB\" inside a double-quoted\nstring. PowerShell's tokenizer treats \"$Var:\" as a scope qualifier (Variable,\nEnv, etc.) and fails at parse time when the qualifier isn't recognised, so\nevery release-tag build broke at line 861 before the sc\n[…]\nable as ${Architecture} delimits the name and lets the\nliteral colon through.\n\nCaught by the v0.0.6 release run that failed seconds in. Validated with\n[Parser]::ParseFile — no remaining syntax errors.",
"is_bot": false,
"headline": "build: brace $Architecture in payload-size log to avoid PS scope pars…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-06-07T02:59:07Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f3b23ff19accf5dbc1b7f36d5765f08b002ef4a9",
"body": "…e install path (#46)\n\n* fix: walk requires + update_for during classification, not only inside install path\n\n* respect uninstall/profile/app manifest actions; pre-index update_for",
"is_bot": false,
"headline": "fix: walk requires + update_for during classification, not only insid…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-06-06T16:45:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d40ae27f06d19b4158c5d7e2a37295732e5e803c",
"body": "* msc: merge rapid self-serve clicks + contextual progress label\n\nTwo coupled fixes for the self-serve install flow that lands the click on a\nflag file consumed by CimianWatcher:\n\n1. Multi-item race. TriggerService used to overwrite the .cimian.bootstrap\n flag file on every click, so a second Inst\n[…]\neck/Install convenience triggers. Doc\n re-worded to describe the actual lifecycle (\"set on write, cleared on\n consume or failure\").\n\nBuild clean (MSC). 20/20 BootstrapArgsBuilder tests still pass.",
"is_bot": false,
"headline": "msc: merge rapid self-serve clicks + contextual progress label (#45)",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-06-06T14:04:42Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "24d8cfd1e2f1f8b6b494fe48f4e36a5b31511619",
"body": "* watchdog: --self-check task + cimian_missing marker for ReportMate\n\n* watchdog: route self-check through CimianPaths + treat write-fail as exit 3\n\nFour Copilot review fixes:\n\n1. SelfCheck() hardcoded \"C:\\Program Files\\Cimian\" and\n \"C:\\ProgramData\\ManagedInstalls\", which falsely report drift on\n \n[…]\nould keep showing\n \"success\" while silently no longer updating the marker. Now treated\n as exit 3 (internal error) so Task Scheduler surfaces it.\n\nBuild clean (dotnet build managedsoftwareupdate).",
"is_bot": false,
"headline": "watchdog: --self-check task + cimian_missing marker (#44)",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-06-06T14:04:38Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "238e72a64fe1b2b750136b91d40bcff7c66f97de",
"body": "* installer: msiexec retry on 1618, rotated logs, self-serialise\n\n* installer: address Copilot review on msiexec retry/rotation\n\nFive fixes from the PR #43 review:\n\n1. RotateMsiInstallLogs ran before the semaphore was acquired, so two\n concurrent InstallMsiAsync calls could rotate each other's log\n[…]\n owns OS handles. Disposed\n each instance in finally so 1618 retry logging doesn't leak handles\n on hosts with chatty Windows Installer activity.\n\nBuild clean (dotnet build managedsoftwareupdate).",
"is_bot": false,
"headline": "installer: msiexec retry on 1618, rotated logs, self-serialise (#43)",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-06-06T14:04:34Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5c03fd1a2e7490eb875f7fcf90555168a0ef4138",
"body": "* build: strip pdb+xml from MSI payload, add size guard\n\n* build: compare payload caps against unrounded bytes; clarify soft-cap intent\n\nCopilot review fix: rounding `$payloadMB` to 0.1 MB before the cap check\nlet a 250.04 MB payload slip past a 250 MB soft cap (rounded down to\n250.0). Comparison now uses `$payloadBytes` directly against\n`$capMB * 1MB`; the rounded value is kept only for log output. Updated\nthe leading comment to reflect actual behavior — warn on soft cap, fail\non hard cap.",
"is_bot": false,
"headline": "build: strip pdb+xml from MSI payload, add size guard (#42)",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-06-06T14:04:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "416bf536ffdcf076ab08d4cd7f1bb46b13810698",
"body": "* release: emit SHA256SUMS.txt and opt-in signtool verify gate\n\n* release: gate SIGN_VERIFY on vars (not step env) + correct MSI name in doc\n\nTwo Copilot review fixes:\n\n1. release.yml: `if: env.SIGN_VERIFY` cannot see env defined inside the same\n step — GitHub evaluates step `if:` before the step'\n[…]\nferenced `CimianTools-<arch>-<ver>.msi`,\n but the build/release pipeline emits `Cimian-<ver>-<arch>.msi`. Aligned\n the doc with the actual artifact naming and noted the SIGN_VERIFY\n opt-in gate.",
"is_bot": false,
"headline": "release: emit SHA256SUMS.txt + opt-in signtool verify (#41)",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-06-06T14:04:26Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "36f798e6edd95471e6b38713c7172d57932e7b55",
"body": null,
"is_bot": false,
"headline": "release: ship Cimian-<datestamp>-<arch>.zip alongside .msi/.nupkg (#40)",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-06-05T02:19:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5736bfae54d3237bd1a67bfc59b21f08ec5beffb",
"body": "…hing runtime) (#39)",
"is_bot": false,
"headline": "build: make all CLIs self-contained (build-time invocation needs matc…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-06-04T12:22:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0c75a4bb45a607e619ab7da18d8ceb3b1544f35e",
"body": "…ff when not self-contained (NETSDK1102) (#38)",
"is_bot": false,
"headline": "build: override PublishTrimmed/IncludeNativeLibrariesForSelfExtract o…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-06-04T09:56:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "53a5b37913a9cf91da2cb382276d31bb33145fce",
"body": "…endent CLIs (#37)",
"is_bot": false,
"headline": "build: override EnableCompressionInSingleFile=false for framework-dep…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-06-04T08:16:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b36b0081e41b913689359d42b273e33d33ecc35a",
"body": "…(#36)\n\n* ci: drop NuGet cache entirely (actions/cache@v4 throws on Node 24)\n\n* build: skip EnableCompressionInSingleFile when not self-contained (NETSDK1176)",
"is_bot": false,
"headline": "ci/build: drop NuGet cache; skip compression when not self-contained …",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-06-04T07:38:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0d7c9a4dc8886fa9fa1c54a0f673cdc7e242eee2",
"body": "…ared (#35)",
"is_bot": false,
"headline": "managedsoftwareupdate: skip display-name fallback when MSI codes decl…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-06-04T06:27:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ef428069e1f6e58cc6ab42be916157e35837c330",
"body": "* ci: use setup-dotnet built-in NuGet cache, drop actions/cache@v4\n\nactions/cache@v4 began failing under FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true\nonce the runner image flipped to a Node-24-default build — its post-restore\npath hits DEP0169 (url.parse deprecation) and exits non-zero, skipping\nRestore/\n[…]\nthe standalone\nactions/cache@v4 block, which crashes under Node 24 (DEP0169\nurl.parse) because FORCE_JAVASCRIPT_ACTIONS_TO_NODE24 is set on\nthis workflow as well.\n\nSpotted by Copilot review on PR #34.",
"is_bot": false,
"headline": "ci: use setup-dotnet built-in NuGet cache (#34)",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-06-04T06:27:07Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8cc15ca13c417bf2f8e63db3494db649748db154",
"body": "…tatus fallback fix) (#33)\n\n* selfservice: merge SelfServeManifest in MSU and trigger fast --item runs from MSC\n\nMSC writes user requests to SelfServeManifest.yaml but the managedsoftwareupdate\nCLI never read it, so clicking Install on an optional item in MSC did nothing —\nthe run finished without q\n[…]\n2 SHIP files: PROJECT_STRUCTURE apps/ -> gui/ and .NET 10 only;\nREPOCLEAN --auto short flag -y not -a.\n\n* wiki: remove Home.md links to deleted pages, surface importing-exe-bundle and managed-profiles",
"is_bot": false,
"headline": "Wire self-service installs end-to-end (MSU merge, fast MSC trigger, s…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-06-04T06:27:00Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "403e828ba361a87f5ee1abfc16507b2254dcf3a2",
"body": "* cimiimport: extract user interaction behind IImportPrompter\n\nPulls every Console.WriteLine / Write / ReadLine out of ImportService and\nroutes it through IImportPrompter so the same import workflow can run from:\n\n- the CLI (ConsolePrompter — exact prior behaviour)\n- unattended scripts via --nointer\n[…]\nds \"[WARN] \" and the original Console.WriteLine had no prefix.\n- Tests: parameterized coverage for NormalizeRepoSubPath\n (forward-slash normalization, leading-separator strip, UNC/drive\n rejection).",
"is_bot": false,
"headline": "cimiimport: extract user interaction behind IImportPrompter (#26)",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-06-04T06:26:53Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b7b8c40af0211dd1004d2b5fb55134dcfa22fb3a",
"body": "Brings in windowsadmins/cimian-pkg#22 — installer-type wrapper MSIs now set\nARPSYSTEMCOMPONENT=1 so they no longer duplicate the vendor's own entry in\nPrograms and Features. Detection via MsiPropertyReader is unchanged.",
"is_bot": false,
"headline": "cimipkg: bump submodule to ca4a656..17694a0",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-29T21:46:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fd95450250fb1aace3f82281b02518232c70f2a7",
"body": "* Expand cimian:// deep links: item/category/updatedetail/myitems + path form\n\n* Use typed CategoryNavigationRequest; canonicalize category name",
"is_bot": false,
"headline": "Expand cimian:// deep links (#32)",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-26T18:28:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f493e38d09d028f5327cd05fc5c25a0f20417182",
"body": null,
"is_bot": false,
"headline": "Fix toast COM ExeServer to match Managed Software Center.exe",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-26T17:24:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "482c7c32d8b0a29fbb79d55b6dcf1b5b288c56f9",
"body": null,
"is_bot": false,
"headline": "wiki: importing .exe bundle installers",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-26T05:35:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "60b8080ef24b0096f14f8abf00271f56684b32fe",
"body": "… (#30)\n\n* makepkginfo: auto-populate installs[].version from MSI ProductVersion\n\nCimipkg compresses date-format catalog versions (YYYY.MM.DD.HHMM) into\nMSI's strict 3-part ProductVersion (YY.M.DDxHH, e.g. 2026.05.06.1248 ->\n26.5.612). That truncated form is what lands in the Windows uninstall\nregis\n[…]\nthe prior change had no\nautomated coverage because BuildFromInstaller depended on a real MSI on\ndisk. The helper takes an MsiMetadata record directly, so the tests run\nwithout any filesystem fixtures.",
"is_bot": false,
"headline": "makepkginfo: auto-populate installs[].version from MSI ProductVersion…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-16T19:41:28Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3426ee1d846f93adf808f82e6eae46b179bc6aaa",
"body": "…ven auto-detect in cimiimport (#31)\n\n* msi: verify on-disk file version after ARP check (key_path)\n\nmanagedsoftwareupdate's MSI verification path in CheckInstallsArray\ntrusts the Windows Installer ARP DisplayVersion as authoritative. If\nsomething silently overwrites installed files without updating\n[…]\nsion metadata. Now filter to versioned files only —\n unversioned binaries fall back to ARP-only verification.\n\nBuild clean (0 warnings); cimiimport + managedsoftwareupdate tests\nall green (292/292).",
"is_bot": false,
"headline": "msi: verify on-disk file version after ARP check (key_path) + BOM-dri…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-16T19:19:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "dfafc9a4b38c1c162bcdfd6f502c6ce8a24d2b07",
"body": "Add Metadata to PkgsInfo, teach YamlUtils to splice the trailing _metadata: block in/out via reflection, and have ImportService preserve any existing block before overwrite. Fixes the autopkg / cimian-promoter stamp-stripping CimianStudio's wizard surfaced.",
"is_bot": false,
"headline": "pkginfo: round-trip _metadata block via PkgsInfo.Metadata (#29)",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-15T21:52:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "497507459034f0c91d4afbc61d51ecc37578ac13",
"body": "Five tools (cimiimport, makecatalogs, makepkginfo, manifestutil,\nmanagedsoftwareupdate) had their own SerializerBuilder. Same job, subtly\ndifferent configs — files churned diffs every save. Centralize on\nshared/core/Services/YamlUtils.cs so CimianStudio and every CLI route\nthrough one canonical writ\n[…]\n.3 won't bind aliased \"_metadata\").\n\nNet -355 lines from callsites; +15 new YamlUtilsTests that pin every\ncanonical-form decision. 674/674 tests pass; .\\build.ps1 -Sign -Binaries\ngreen on x64 + arm64.",
"is_bot": false,
"headline": "shared/core: consolidate Cimian YAML serialization in YamlUtils (#28)",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-15T06:51:23Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b8c3be5092c255ef3ddc7d62a9d6fe04e2829b15",
"body": "…#27)\n\nRun-scoped bypass only - persistent suppression state in cimian.state.json\nis left intact, so future runs without --item still honor it. All other\ngates (CheckStatus, OS/agent eligibility, install_window, force deadlines,\ndependencies, installcheck_script) continue to apply normally.\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "managedsoftwareupdate: --item bypasses LoopGuard for the named item (…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-14T01:05:18Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "4e14b80d5819504cdb6d428b59f6ee6baa15967b",
"body": "cimipkg v2026.05.10.1707 splits the embedded payload across N\nproductN.cab streams so payloads larger than makecab.exe's ~2 GB\nsingle-cabinet limit (e.g. Unreal Engine 5.6.1 at ~25.6 GB) build\ncorrectly. Single-cabinet payloads keep the historical product.cab\nname; backward-compatible for the common case.\n\ncimipkg PR #20 / commit ca4a656.",
"is_bot": false,
"headline": "Bump cimipkg: multi-CAB payload split (lifts ~2 GB cabinet ceiling)",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-11T00:18:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c87b4809092b173cc0bbac4c39a91ff88990a484",
"body": "cli/cimipkg 3540f188..72f23c8f, 4 commits:\n- MsiBuilder: schedule CimianPreinstall before InstallValidate (1398)\n- ci: align release notes with Cimian format and pin TZ=America/Vancouver\n- ci: restore tests project explicitly (no .sln to roll them up)\n- Split CI into ci.yml + release.yml\n\nThe MsiBui\n[…]\nstall time from ~2:22 to ~30s by\nrunning the service-stop preinstall script before InstallValidate's\nFiles-In-Use check, eliminating a ~110s timeout when cimiwatcher.exe\nholds files during an upgrade.",
"is_bot": false,
"headline": "Bump cimipkg: MsiBuilder runs CimianPreinstall before InstallValidate",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-10T01:59:30Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "affd3b58a9f5aa7f137c34cd516ce6290f444691",
"body": null,
"is_bot": false,
"headline": "ci: align release notes with Cimian format and pin TZ=America/Vancouver",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-10T01:30:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fe82a14ef81dfccc570605df0a267f0d4b810437",
"body": "Two related fixes to reports/items.json so it reflects what the run\nactually did, and so LoopGuard suppressions stop hiding behind a\ncurrent_status=\"Installed\" lie.\n\nFix 1 — Per-run finalization (real install outcomes):\n- managedsoftwareupdate now captures per-item ItemOutcome from\n PerformInstalla\n[…]\nreports/loop_suppressed.json alongside\n items.json — sibling file lists every active suppression including\n prior-run backoffs.\n\nTests: 11 new unit tests covering both fixes. Full suite: 652 passed.",
"is_bot": false,
"headline": "items.json: per-run finalization + LoopGuard suppression surfacing (#25)",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-07T17:54:25Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "431baa693dc72247c0b22a9066fbb95f86c82c42",
"body": "…mipkg ver inline",
"is_bot": false,
"headline": "release: drop redundant component/distribution-version block; keep ci…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-06T18:56:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "15c11b63a5df2052b9835c2d8143cfba9a7a5a5b",
"body": "…#24)\n\n* managedsoftwareupdate: don't skip auto run when a user is logged in\n\nThe early-exit at the top of UpdateEngine.RunAsync bailed out of the\nentire --auto run as soon as any user was active, which meant\nunattended_install items (e.g. WinAdminsAccount) never installed on\nmachines with someone l\n[…]\n treating these packages as pending work rather than completed.\n- Rename skippedUnattended to deferredForUser to match the log\n message and reduce confusion when correlating counts.\n\nTests: 641 pass.",
"is_bot": false,
"headline": "managedsoftwareupdate: don't skip auto run when a user is logged in (…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-06T18:54:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ae966fea14c87f1ac91bd914cd6981a5f5ef096e",
"body": "…in middle",
"is_bot": false,
"headline": "release: Munki-style build info on top, signing at bottom, changelog …",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-06T18:35:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "308ae922de759a010c91a18c94314ba40e571de9",
"body": "…r all binaries",
"is_bot": false,
"headline": "release: signtool example uses $cert/$timestampUrl vars and loops ove…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-06T18:29:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0803763a2bd2eaa43fc9799ebcd604a2727e5589",
"body": null,
"is_bot": false,
"headline": "release: drop redundant title header from notes body",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-06T18:27:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "71239714a779c8be222f892fe76e0603357decfb",
"body": "…nce to body",
"is_bot": false,
"headline": "release: title 'Cimian YYYY.MM.DD.HHMM' + add unsigned/SignTool guida…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-06T18:21:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a5bedde5adacdbb6da8cf5340311ad49d102115b",
"body": "…e LASTEXITCODE",
"is_bot": false,
"headline": "build.ps1: explicit exit 0 on success path so CI doesn't inherit stal…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-06T17:31:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b1d83250bada116805837e50078796b470860d4e",
"body": null,
"is_bot": false,
"headline": "ci: opt into Node 24 runtime via FORCE_JAVASCRIPT_ACTIONS_TO_NODE24",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-06T17:26:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e5baf2c62f3c693ac2a4b4a7d29098928225b4a5",
"body": "The parent repo tracks its own .claude/ (agents, hooks) intentionally,\nbut this submodule does not — Claude Code creates .claude/worktrees/ in\nthe working tree, which surfaces in the parent as\n'modified: packages/CimianTools (untracked content)' and prevents a clean\ngit status. Pointer updates from the parent already worked; this just\nsilences the false-positive dirty flag.",
"is_bot": false,
"headline": ".gitignore: ignore .claude/ in this submodule",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-06T17:01:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fdaf2c288ab49e9a021f050126b632b678258430",
"body": null,
"is_bot": false,
"headline": "ci: drop solution-level RID; let test step rebuild with -r win-x64",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-06T05:26:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "375c9056fc6df98ca07f7d14c297adaf5cddf403",
"body": "…tput paths",
"is_bot": false,
"headline": "ci: pin --runtime win-x64 across restore/build/test for consistent ou…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-06T05:22:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "102e3eef3e118f42a61eac6b48c1b2416c85e1f2",
"body": null,
"is_bot": false,
"headline": "ci: checkout submodules recursively (cli/cimipkg)",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-06T05:19:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a88a5ee5a42621999aa0986072d6a1ce5eb9c32a",
"body": "…ered C# pipeline\n\nci.yml runs dotnet restore/build/test on PRs and pushes to main with\nNuGet caching. release.yml now triggers on v* tag push, runs\nbuild.ps1 -NoSign for both arches, and creates a GitHub Release titled\n\"Cimian <tag> - build <YYYY.MM.DD.HHMM>\" with MSI/nupkg/pkg/intunewin\nartifacts. Unsigned for now; signing pending Azure Trusted Signing\nadoption (see wiki/azure-trusted-signing-future.md).",
"is_bot": false,
"headline": "ci: add PR build/test workflow, replace Go-era release with tag-trigg…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-06T05:12:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f3f560de1454c8136bec5e934118b3998107c8af",
"body": "… build time\n\nThe Build-NuGetPackage function previously rewrote build/nupkg/nupkg.{arch}.nuspec\nfrom a here-string on every run, baking the build version into the source-controlled\nfile and leaving a dirty working tree after each build (latest example: 26.5.5.2013).\n\nSwitch to the codebase's existi\n[…]\n. Source templates are never touched.\n\nVerified end-to-end with a full .\\build.ps1 -Sign run: produced\nCimianTools-{arm64,x64}.26.5.5.2058.nupkg + matching .msi, exit 0, working tree\nclean afterwards.",
"is_bot": false,
"headline": "build.ps1: use {{VERSION}} placeholder in nuspec, generate sibling at…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-06T04:17:22Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7894630c2bfe4c2b43ad2b28af44d2b80987612f",
"body": "* managedsoftwareupdate: infer installs[] type from identity fields\n\nCurrently CheckInstallsArray and the post-install verifier in\nInstallerService key off `installItem.Type?.ToLowerInvariant()`. When a\nhand-written pkginfo omits `type:` on an installs entry, Type defaults\nto \"\" (InstallCheckItem) a\n[…]\nvice: typeless ProductCode entry -> DetectionMethod.Msi\n + ProductCodeMissing\n - StatusService: empty installs entry -> error/CheckFailed\n - IsUninstallable: typeless ProductCode entry -> true",
"is_bot": false,
"headline": "Infer installs[] type from identity fields; drop redundant version (#23)",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-06T03:36:40Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "18160519d2f9ade6aa2a3c08e4655370fc50903e",
"body": "…#21)\n\n* Move MSI ProductCode/UpgradeCode from installer block to installs[]\n\nProducer fix:\n- cimiimport/makepkginfo no longer emit product_code/upgrade_code on\n the top-level installer: block; the GUIDs now live exclusively in\n installs[] of type=msi (Munki convention).\n- makepkginfo previously w\n[…]\nhape.\n\nMake InstallItem.Path nullable (omitted for type=msi which has no path)\nand convert empty extractor results to null at assignment so OmitNull\nsuppresses the keys when the source MSI lacks them.",
"is_bot": false,
"headline": "Move MSI ProductCode/UpgradeCode from installer block to installs[] (…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-06T02:34:38Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "66c7b859505325599811158e821bd98f2ce88527",
"body": "Lenovo Win32_ComputerSystem.Model returns the raw MTM code (e.g.\n11JQS6CH00); the friendly model name (e.g. \"ThinkCentre M75q Gen 2\")\nlives on Win32_ComputerSystemProduct.Version. Expose it as a separate\npredicate fact so manifest authors can write\nmodel_version CONTAINS \"M75q\" without having to enumerate MTM prefixes.\n\nAB#259",
"is_bot": false,
"headline": "Add model_version fact from Win32_ComputerSystemProduct.Version (#22)",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-06T02:32:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a4fb7fdb33df2f93a05077ded32af5aacd576937",
"body": null,
"is_bot": false,
"headline": "Removed the name explanation",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-01T23:11:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3abb6e624b37d0fd5504caceb140a553da385c98",
"body": null,
"is_bot": false,
"headline": "A few minor edits",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-01T23:10:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e6b8a7941d8331887413bd1e276e58b6634a2f79",
"body": "…t (#20)\n\n* Add minimum_cimian_version pkginfo field and enforce at install time\n\nWhen set, packages are skipped unless the running agent version is at\nleast the declared minimum. Adds the field to the pkginfo schema across\nall model files, exposes --minimum_cimian_version on makepkginfo and\ncimiimp\n[…]\nssemblyFileVersion when the informational version is missing. In the\ncomparison wiki, move minimum_cimian_version out of the parity-list\nsentence into its own paragraph as a Cimian-specific extension.",
"is_bot": false,
"headline": "Add minimum_cimian_version pkginfo field with install-time enforcemen…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-01T23:06:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1a2a1c7edb1f04cd52484809ff2b52896dd1b584",
"body": "* Enforce minimum_os_version and maximum_os_version gates in UpdateEngine\n\nThe fields existed in the pkginfo schema across all model files but were\nnever read at install time. Wire them into IdentifyActions and the\ndependency-resolution path so packages declaring an OS-version range are\nskipped on o\n[…]\ng the placeholder\nstring-empty tests with real boundary, in-range, below-min, and\nabove-max assertions. Loosen the GetCurrentOsVersion test to a regex\ncheck so it does not pin the major version to 10.",
"is_bot": false,
"headline": "Enforce minimum_os_version and maximum_os_version gates (#19)",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-01T22:59:37Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6712cb0d5bd44dd8d3982a37bc3a736fd973bbfe",
"body": "git worktree add does not recurse into submodules even with\nsubmodule.recurse=true configured, so new worktrees are missing\ncli/cimipkg and the build fails until the contributor runs git\nsubmodule update --init manually. Wrap the canonical\ngit worktree add --recurse-submodules call in a small script so the\ncommon path stays a one-liner, and document it in the README.",
"is_bot": false,
"headline": "Add scripts/new-worktree.ps1 to auto-init nested cli/cimipkg submodule",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-01T20:40:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b6b68ef74aac649dd0b0121096be0ba44410cd84",
"body": "The test was looking for a \"Script-only\" log substring that the\ninstaller no longer emits; the success path now logs the more accurate\n\"No install_script defined; nothing to run\". Update the assertion to\nmatch the current log message so the test reflects production\nbehaviour.",
"is_bot": false,
"headline": "Fix InstallerServiceTests.InstallAsync_ScriptOnlyItem_Succeeds assertion",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-01T20:39:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4c06cd821981d590cb0608617e96322f6b5d0683",
"body": "…ne planning",
"is_bot": false,
"headline": "Add CI build timing benchmark documentation for GitHub Actions pipeli…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-01T00:30:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a5a5d3487a6520e8925b5679724589ef9684436c",
"body": null,
"is_bot": false,
"headline": "Add deploy-showcase script and showcase-installinfo.yaml for MSC setup",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-01T00:29:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "be32f4a5052ff5781128b581ee09225fe91dd405",
"body": "Without an installs[] entry of type=msi carrying ProductCode/UpgradeCode,\nmanagedsoftwareupdate's VerifyInstallationBeforeRegistry has nothing to\ncheck against and falls through to \"No installs array for X — cannot\nverify, assuming success\" for every MSI it installs.\n\nAdd ProductCode/UpgradeCode fie\n[…]\nady in makepkginfo and makecatalogs models), and have ImportService\nauto-emit a type=msi installs entry when extracted MSI metadata carries\neither GUID. exe/msix branches keep their existing behavior.",
"is_bot": false,
"headline": "cimiimport: emit installs[] entry for MSI packages (#18)",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-01T00:19:00Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "713f9e2664c5796daec219f07321740ff188a56c",
"body": "Items appearing in multiple manifest sections (e.g. PowerShell as\nmanaged_install in CoreApps and as optional_install in an Assigned\nmanifest) now resolve to the strongest action regardless of encounter\norder, so managed_installs supersedes optional_installs.\n\nPrecedence: install > uninstall > updat\n[…]\nofile/app.\nSame-action collisions still fall through to the existing version\ncomparison.\n\nAdds ManifestServiceTests covering each precedence rule, position\npreservation, and version-tiebreak behavior.",
"is_bot": false,
"headline": "ManifestService: action precedence in DeduplicateItems (#17)",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-01T00:13:41Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8d95d066ab04989b857cd51c3d401d7e6d66be75",
"body": "…s (#16)\n\nProcessInstallWithDependenciesAsync only consulted the in-memory\ninstalledItems/scheduledItems lists when handling 'requires', so deps\nalready present on disk but not yet recorded got reinstalled every run.\nCall StatusService.CheckStatus on each dep (installs array, installcheck,\nreceipts) and skip when NeedsAction is false, matching the existing\nupdate_for path.",
"is_bot": false,
"headline": "UpdateEngine: check filesystem state before reinstalling requires dep…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-05-01T00:10:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6f10e8f686102a525375bbcb4e598db1e52d7552",
"body": "…#14)\n\n* UpdateEngine: exclude unsubscribed-catalog items from status tables\n\nManifest items whose pkginfo lives only in catalogs the device does not\nsubscribe to were rendered with version \"Unknown\" in MANAGED INSTALLS /\nUPDATES / UNINSTALLS. The device cannot act on those items, so showing\nthem is\n[…]\ns actually loaded instead of saying \"(none configured)\".\n- Skip filtering when catalogMap is empty (e.g. catalog download failed)\n so the section degrades gracefully instead of disappearing entirely.",
"is_bot": false,
"headline": "UpdateEngine: exclude unsubscribed-catalog items from status tables (…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-04-30T21:36:32Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f066e354fad29e6ad2f2cf0c14646bf6eb0ebc64",
"body": "…gories\n\n- ViewModels/CategoriesViewModel: refresh Segoe MDL2 glyphs across existing\n categories and add new ones (animation, browsers, modeling/cad,\n rendering, plus extensions/addons aliasing to plugins).\n- ViewModels/ItemDetailViewModel: add InstallButtonLabel and\n InstallButtonGlyph observabl\n[…]\nno change notification, so a later assignment wouldn't\n refresh the bound Image.\n- Views/ItemDetailPage and SoftwarePage: bind the new label/glyph\n properties and surface the expanded category list.",
"is_bot": false,
"headline": "msc: add Install/Update button switch, expand category icons and cate…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-04-30T16:57:31Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "517a450eb396889a2d9a3965518bdf75015cc770",
"body": null,
"is_bot": false,
"headline": "Bump cli/cimipkg to main (PRs #18, #19 merged)",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-04-30T06:36:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9849226c7ddb0877138f0fd649a4c6d7d1565b35",
"body": "* cimiimport: stop rewriting semver as date versions\n\nParseVersion treated any 3-part version with major <100, minor 1-12,\npatch 1-31 as a Chocolatey-truncated date, so semvers like 5.2.1 were\nwritten to pkginfo as 2005.02.01. The 4-digit-year branch was similarly\nrisky for releases starting 2000-21\n[…]\navior in XML doc\n\nCopilot review on #12: doc said \"as-is\" but ParseVersion returns \"\" when\nversionStr is null. Update the summary to call out the null-to-empty\nbehavior so callers know what to expect.",
"is_bot": false,
"headline": "cimiimport: stop rewriting semver as date versions (#12)",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-04-30T06:29:42Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "bdde3ca336209e2b138c4b06d82b324df09c0595",
"body": null,
"is_bot": false,
"headline": "Updating the MSC showcase screenshots",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-04-28T21:15:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e5d2debf0712da95b0c6be7935e4ea8d819bf054",
"body": "Two changes that together fix a deploy.ps1 hang where a captured\n`& cimiimport ... 2>&1` never returned even though cimiimport had exited:\n\n1. cimiimport: under --nointeractive, skip the post-import \"open in editor\"\n step. The editor (VS Code / Notepad) inherits the parent's stdio, and\n when cim\n[…]\n pipe open and deadlock the caller.\n\n2. build.ps1: pass --skip-import to all cimipkg invocations (MSI + .pkg)\n so cimipkg never shells out to an interactive cimiimport with\n inherited stdio in CI.",
"is_bot": false,
"headline": "cimiimport/cimipkg: make import path fully headless",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-04-28T19:56:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "cc434076adbfed0b86c8eedf3e66f6702ca55e3b",
"body": "…uct_code (#11)\n\n* managedsoftwareupdate: honour installer.product_code/upgrade_code for MSI status detection\n\nYAML pkginfos with a top-level `installer.product_code` and `installer.upgrade_code` were\nbeing silently dropped at parse — InstallerInfo had no fields for them — so CheckStatus\nfell throug\n[…]\nse —\n · MSI + product_code → true (synthesis path engages),\n · MSI without product_code → false (no GUID, nothing for msiexec /x),\n · non-MSI carrying product_code → false (gated on type == \"msi\").",
"is_bot": false,
"headline": "managedsoftwareupdate: synthesize MSI uninstaller from installer.prod…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-04-28T16:39:25Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "223a1f04a2c5eae9904f971c25df86a703ed1c00",
"body": "… MSI status detection (#10)\n\n* managedsoftwareupdate: honour installer.product_code/upgrade_code for MSI status detection\n\nYAML pkginfos with a top-level `installer.product_code` and `installer.upgrade_code` were\nbeing silently dropped at parse — InstallerInfo had no fields for them — so CheckStatu\n[…]\n for the original bug — no_checks fall-through),\n · MSI item with no codes → keeps NoChecks fall-through (regression guard),\n · non-MSI item carrying a product_code is not routed through MSI lookup.",
"is_bot": false,
"headline": "managedsoftwareupdate: honour installer.product_code/upgrade_code for…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-04-28T16:39:00Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a88a9fa1e07d898767b46f18158b30560ce272d1",
"body": "…lize-paths\n\nCentralize system paths in Cimian.Core.CimianPaths",
"is_bot": false,
"headline": "Merge pull request #9 from windowsadmins/feature/work-item-256-centra…",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-04-28T03:50:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "600075ab45ccc7dcb7a87fee89a588312640f8db",
"body": "ConfigureInteractive now loops the RepoPath prompt until the user enters\n(or accepts a detected default of) a non-empty value. ConfigureNonInteractive\nthrows InvalidOperationException with a helpful message when the resolver\ncan't detect a deployment, instead of silently saving an empty path that\ndo\n[…]\ngs didn't take one\nat all — both relied on makecatalogs reading Config.yaml itself, which\ndiverges from the active import target if Config.yaml is stale.\n\nAddresses Copilot review follow-ups on PR #9.",
"is_bot": false,
"headline": "cimiimport: refuse empty RepoPath, thread repo path to makecatalogs",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-04-28T00:46:10Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1eb9d28493cf2d8fdc34b8175d664b8cdebcbeb2",
"body": "ReadToEnd() blocked until stdout EOF, which only happens at child\nexit, so the subsequent WaitForExit(2000) was effectively dead code:\na stalled git (credential prompt, slow remote) would hang the resolver\nindefinitely. Switched to ReadToEndAsync + WaitForExit(timeout) +\nKill-on-timeout so 2 seconds\n[…]\nue with no\nreader can deadlock the child once the OS pipe buffer fills (~4-64KB\ndepending on Windows version). The remote URL we care about is on\nstdout regardless.\n\nAddresses Copilot review on PR #9.",
"is_bot": false,
"headline": "RepoResolver: hard-cap git timeout, avoid stderr-pipe deadlock",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-04-28T00:23:20Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2aa2b22ba18d8ec9d12b540e6dcc588c012a278f",
"body": "Adds shared/core/CimianPaths.cs as the single source of truth for\nProgramData\\ManagedInstalls and Program Files\\Cimian locations, derived\nat runtime via Environment.GetFolderPath. ~30 inline path literals\nacross cli/ and shared/core/ now reference these constants.\n\ncimiimport's GetDefaultConfig no l\n[…]\nand makepkginfo,\nwhich prepended C:\\Users\\%USERPROFILE% — already-double-anchored\nsince %USERPROFILE% expands to C:\\Users\\<name> — producing\nunusable paths. Now emits %USERPROFILE% only.\n\nRefs AB#256.",
"is_bot": false,
"headline": "Centralize system paths in Cimian.Core.CimianPaths",
"author_name": "Rod Christiansen",
"author_login": "rodchristiansen",
"committed_at": "2026-04-27T23:52:09Z",
"body_truncated": true,
"is_coding_agent": false
}
],
"releases_count": 15,
"commits_last_year": 500,
"latest_release_at": "2026-07-21T19:15:09Z",
"latest_release_tag": "v0.1.7",
"releases_from_tags": false,
"days_since_last_push": 2,
"active_weeks_last_year": 37,
"days_since_latest_release": 3,
"mean_days_between_releases": 4.6
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": false,
"health_percentage": 50,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": []
},
"popularity": {
"forks": 2,
"stars": 19,
"watchers": 3,
"fork_history": {
"days": [
{
"date": "2026-03-14",
"count": 1
},
{
"date": "2026-07-04",
"count": 1
}
],
"complete": true,
"collected": 2,
"total_forks": 2
},
"star_history": null,
"open_issues_and_prs": 5
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [],
"has_llms_txt": false,
"has_dockerfile": true,
"has_mcp_signal": false,
"bootstrap_files": [],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [
"build/nupkg/CimianTools.arm64.csproj",
"build/nupkg/CimianTools.x64.csproj",
"cli/cimiimport/Cimian.CLI.cimiimport.csproj",
"cli/cimistatus/Cimian.CLI.cimistatus.csproj",
"cli/cimitrigger/Cimian.CLI.cimitrigger.csproj",
"cli/cimiwatcher/Cimian.CLI.cimiwatcher.csproj",
"cli/makecatalogs/Cimian.CLI.makecatalogs.csproj",
"cli/makepkginfo/Cimian.CLI.makepkginfo.csproj",
"cli/managedsoftwareupdate/Cimian.CLI.managedsoftwareupdate.csproj",
"cli/manifestutil/Cimian.CLI.manifestutil.csproj",
"cli/repoclean/Cimian.CLI.repoclean.csproj",
"gui/CimianStatus/Cimian.GUI.CimianStatus.csproj",
"gui/ManagedSoftwareCenter/Cimian.GUI.ManagedSoftwareCenter.csproj",
"shared/core/Cimian.Core.csproj",
"shared/engine/Cimian.Engine.csproj",
"shared/import/Cimian.Import.csproj",
"shared/infrastructure/Cimian.Infrastructure.csproj",
"tests/Cimian.Tests.csproj",
"tests/Cimian.Tests/Cimian.Tests.csproj"
],
"largest_source_bytes": 151769,
"source_files_sampled": 171,
"oversized_source_files": 4,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"dependencies": {
"manifests": [
"tests/Cimian.Tests.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": "System.CommandLine",
"manifest": "cli/cimiimport/Cimian.CLI.cimiimport.csproj",
"ecosystem": "nuget",
"version_constraint": "2.0.0-beta4.22272.1"
},
{
"name": "System.CommandLine",
"manifest": "cli/cimistatus/Cimian.CLI.cimistatus.csproj",
"ecosystem": "nuget",
"version_constraint": "2.0.0-beta4.22272.1"
},
{
"name": "System.ServiceProcess.ServiceController",
"manifest": "cli/cimistatus/Cimian.CLI.cimistatus.csproj",
"ecosystem": "nuget",
"version_constraint": "9.0.1"
},
{
"name": "System.CommandLine",
"manifest": "cli/cimitrigger/Cimian.CLI.cimitrigger.csproj",
"ecosystem": "nuget",
"version_constraint": "2.0.0-beta4.22272.1"
},
{
"name": "System.ServiceProcess.ServiceController",
"manifest": "cli/cimitrigger/Cimian.CLI.cimitrigger.csproj",
"ecosystem": "nuget",
"version_constraint": "9.0.0"
},
{
"name": "System.CommandLine",
"manifest": "cli/cimiwatcher/Cimian.CLI.cimiwatcher.csproj",
"ecosystem": "nuget",
"version_constraint": "2.0.0-beta4.22272.1"
},
{
"name": "Microsoft.Extensions.Hosting.WindowsServices",
"manifest": "cli/cimiwatcher/Cimian.CLI.cimiwatcher.csproj",
"ecosystem": "nuget",
"version_constraint": "10.0.0-preview.*"
},
{
"name": "System.ServiceProcess.ServiceController",
"manifest": "cli/cimiwatcher/Cimian.CLI.cimiwatcher.csproj",
"ecosystem": "nuget",
"version_constraint": "10.0.0-preview.*"
},
{
"name": "System.CommandLine",
"manifest": "cli/makecatalogs/Cimian.CLI.makecatalogs.csproj",
"ecosystem": "nuget",
"version_constraint": "2.0.0-beta4.22272.1"
},
{
"name": "System.CommandLine",
"manifest": "cli/makepkginfo/Cimian.CLI.makepkginfo.csproj",
"ecosystem": "nuget",
"version_constraint": "2.0.0-beta4.22272.1"
},
{
"name": "WixToolset.Dtf.WindowsInstaller",
"manifest": "cli/makepkginfo/Cimian.CLI.makepkginfo.csproj",
"ecosystem": "nuget",
"version_constraint": "5.*"
},
{
"name": "CommandLineParser",
"manifest": "cli/managedsoftwareupdate/Cimian.CLI.managedsoftwareupdate.csproj",
"ecosystem": "nuget",
"version_constraint": "2.9.1"
},
{
"name": "WixToolset.Dtf.WindowsInstaller",
"manifest": "cli/managedsoftwareupdate/Cimian.CLI.managedsoftwareupdate.csproj",
"ecosystem": "nuget",
"version_constraint": "5.*"
},
{
"name": "Microsoft.Extensions.Configuration.CommandLine",
"manifest": "cli/managedsoftwareupdate/Cimian.CLI.managedsoftwareupdate.csproj",
"ecosystem": "nuget",
"version_constraint": "10.0.0-preview.*"
},
{
"name": "Microsoft.PowerShell.SDK",
"manifest": "cli/managedsoftwareupdate/Cimian.CLI.managedsoftwareupdate.csproj",
"ecosystem": "nuget",
"version_constraint": "7.5.0"
},
{
"name": "System.Management",
"manifest": "cli/managedsoftwareupdate/Cimian.CLI.managedsoftwareupdate.csproj",
"ecosystem": "nuget",
"version_constraint": "10.0.0-preview.*"
},
{
"name": "System.CommandLine",
"manifest": "cli/manifestutil/Cimian.CLI.manifestutil.csproj",
"ecosystem": "nuget",
"version_constraint": "2.0.0-beta4.22272.1"
},
{
"name": "Newtonsoft.Json",
"manifest": "cli/repoclean/Cimian.CLI.repoclean.csproj",
"ecosystem": "nuget",
"version_constraint": "13.0.3"
},
{
"name": "System.CommandLine",
"manifest": "cli/repoclean/Cimian.CLI.repoclean.csproj",
"ecosystem": "nuget",
"version_constraint": "2.0.0-beta4.22272.1"
},
{
"name": "Microsoft.Extensions.Hosting.WindowsServices",
"manifest": "gui/CimianStatus/Cimian.GUI.CimianStatus.csproj",
"ecosystem": "nuget",
"version_constraint": "10.0.0-preview.*"
},
{
"name": "Newtonsoft.Json",
"manifest": "gui/CimianStatus/Cimian.GUI.CimianStatus.csproj",
"ecosystem": "nuget",
"version_constraint": "13.0.3"
},
{
"name": "CommunityToolkit.Mvvm",
"manifest": "gui/CimianStatus/Cimian.GUI.CimianStatus.csproj",
"ecosystem": "nuget",
"version_constraint": "8.2.2"
},
{
"name": "ModernWpfUI",
"manifest": "gui/CimianStatus/Cimian.GUI.CimianStatus.csproj",
"ecosystem": "nuget",
"version_constraint": "0.9.6"
},
{
"name": "Microsoft.Xaml.Behaviors.Wpf",
"manifest": "gui/CimianStatus/Cimian.GUI.CimianStatus.csproj",
"ecosystem": "nuget",
"version_constraint": "1.1.122"
},
{
"name": "CommunityToolkit.Mvvm",
"manifest": "gui/ManagedSoftwareCenter/Cimian.GUI.ManagedSoftwareCenter.csproj",
"ecosystem": "nuget",
"version_constraint": "8.4.0"
},
{
"name": "Microsoft.Extensions.DependencyInjection",
"manifest": "gui/ManagedSoftwareCenter/Cimian.GUI.ManagedSoftwareCenter.csproj",
"ecosystem": "nuget",
"version_constraint": "10.0.0"
},
{
"name": "Microsoft.WindowsAppSDK",
"manifest": "gui/ManagedSoftwareCenter/Cimian.GUI.ManagedSoftwareCenter.csproj",
"ecosystem": "nuget",
"version_constraint": "1.8.260209005"
},
{
"name": "System.ComponentModel.Annotations",
"manifest": "shared/core/Cimian.Core.csproj",
"ecosystem": "nuget",
"version_constraint": "5.0.0"
},
{
"name": "Microsoft.Extensions.Logging.Abstractions",
"manifest": "shared/core/Cimian.Core.csproj",
"ecosystem": "nuget",
"version_constraint": "10.0.0"
},
{
"name": "Microsoft.Extensions.Logging.Abstractions",
"manifest": "shared/engine/Cimian.Engine.csproj",
"ecosystem": "nuget",
"version_constraint": "10.0.0-preview.*"
},
{
"name": "System.Drawing.Common",
"manifest": "shared/import/Cimian.Import.csproj",
"ecosystem": "nuget",
"version_constraint": "9.0.5"
},
{
"name": "WixToolset.Dtf.WindowsInstaller",
"manifest": "shared/import/Cimian.Import.csproj",
"ecosystem": "nuget",
"version_constraint": "5.*"
},
{
"name": "Microsoft.Extensions.Http",
"manifest": "shared/infrastructure/Cimian.Infrastructure.csproj",
"ecosystem": "nuget",
"version_constraint": "10.0.0"
},
{
"name": "Microsoft.Extensions.Http.Polly",
"manifest": "shared/infrastructure/Cimian.Infrastructure.csproj",
"ecosystem": "nuget",
"version_constraint": "10.0.0"
},
{
"name": "System.Management",
"manifest": "shared/infrastructure/Cimian.Infrastructure.csproj",
"ecosystem": "nuget",
"version_constraint": "10.0.0"
},
{
"name": "Polly",
"manifest": "shared/infrastructure/Cimian.Infrastructure.csproj",
"ecosystem": "nuget",
"version_constraint": "8.4.*"
},
{
"name": "Polly.Extensions.Http",
"manifest": "shared/infrastructure/Cimian.Infrastructure.csproj",
"ecosystem": "nuget",
"version_constraint": "3.0.0"
},
{
"name": "AWSSDK.S3",
"manifest": "shared/infrastructure/Cimian.Infrastructure.csproj",
"ecosystem": "nuget",
"version_constraint": "3.7.403"
},
{
"name": "Azure.Storage.Blobs",
"manifest": "shared/infrastructure/Cimian.Infrastructure.csproj",
"ecosystem": "nuget",
"version_constraint": "12.22.1"
}
],
"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": 3,
"merged_prs": 69,
"open_issues": 2,
"closed_ratio": 0,
"closed_issues": 0,
"closed_unmerged_prs": 2
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "rodchristiansen",
"commits": 1192,
"avatar_url": "https://avatars.githubusercontent.com/u/7052526?v=4"
},
{
"type": "User",
"login": "1dustindavis",
"commits": 292,
"avatar_url": "https://avatars.githubusercontent.com/u/6790250?v=4"
},
{
"type": "User",
"login": "ChefAustin",
"commits": 15,
"avatar_url": "https://avatars.githubusercontent.com/u/24925402?v=4"
},
{
"type": "User",
"login": "discentem",
"commits": 15,
"avatar_url": "https://avatars.githubusercontent.com/u/2560432?v=4"
},
{
"type": "User",
"login": "oktN",
"commits": 12,
"avatar_url": "https://avatars.githubusercontent.com/u/18445050?v=4"
},
{
"type": "User",
"login": "danhutchings",
"commits": 10,
"avatar_url": "https://avatars.githubusercontent.com/u/45679525?v=4"
},
{
"type": "User",
"login": "clburlison",
"commits": 4,
"avatar_url": "https://avatars.githubusercontent.com/u/2831320?v=4"
},
{
"type": "User",
"login": "natewalck",
"commits": 4,
"avatar_url": "https://avatars.githubusercontent.com/u/867868?v=4"
},
{
"type": "User",
"login": "gleason86",
"commits": 3,
"avatar_url": "https://avatars.githubusercontent.com/u/24429528?v=4"
},
{
"type": "User",
"login": "andrewjharms",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/16355999?v=4"
}
],
"contributors_sampled": 12,
"top_contributor_share": 0.769
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"ci.yml",
"release.yml"
],
"has_docs_dir": true,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": 5,
"reason": "branch protection is not maximal on development and all release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": 9,
"reason": "22 out of 24 merged PRs checked by a CI test -- score normalized to 9",
"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": 3,
"reason": "project has 1 contributing companies or organizations -- score normalized to 3",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"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": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 10,
"reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"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": 0,
"reason": "dependency not pinned by hash detected -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "SAST tool is not run on all commits -- score normalized to 0",
"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": 0,
"reason": "detected GitHub workflow tokens with excessive permissions",
"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": "292065323c81fe2cf1e3e9e97daf20222990c599",
"ran_at": "2026-07-25T13:45:55Z",
"aggregate_score": 4.2,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-22T19:34:54Z",
"oldest_open_prs": [
{
"number": 13,
"created_at": "2026-04-30T06:28:46Z",
"last_comment_at": "2026-06-06T17:01:25Z",
"last_comment_author": "rodchristiansen"
},
{
"number": 65,
"created_at": "2026-07-04T23:47:01Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 66,
"created_at": "2026-07-05T00:11:18Z",
"last_comment_at": null,
"last_comment_author": null
}
],
"last_merged_pr_at": "2026-07-22T19:31:01Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": [
{
"number": 67,
"created_at": "2026-07-05T01:47:13Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 68,
"created_at": "2026-07-05T02:01:44Z",
"last_comment_at": null,
"last_comment_author": null
}
]
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/windowsadmins/cimian",
"host": "github.com",
"name": "cimian",
"owner": "windowsadmins"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": "The weighted overall 57 is calibrated to 60 on the published index scale (record calibration 2026-08-02).",
"notes": [
{
"code": "overall_calibration",
"params": {
"raw": 57,
"calibrated": 60,
"calibration": "2026-08-02"
}
}
],
"value": 60,
"inputs": {
"security": 42,
"vitality": 90,
"community": 35,
"governance": 38,
"calibration": "2026-08-02",
"engineering": 74,
"ai_readiness": 59,
"weighted_overall_raw": 57
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "excellent",
"name": "Vitality",
"value": 90,
"weight": 0.21,
"metrics": [
{
"key": "development_activity",
"band": "excellent",
"name": "Development activity",
"note": null,
"notes": [],
"value": 90,
"inputs": {
"commits_last_year": 500,
"human_commit_share": 1,
"days_since_last_push": 2,
"active_weeks_last_year": 37
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 2 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 2
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "37/52 weeks with commits",
"points": 25.6,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 37
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "500 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 500
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "excellent",
"name": "Release discipline",
"note": null,
"notes": [],
"value": 90,
"inputs": {
"releases_count": 15,
"latest_release_tag": "v0.1.7",
"releases_from_tags": false,
"days_since_latest_release": 3,
"mean_days_between_releases": 4.6
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "15 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 15
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 3 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 3
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~4.6 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 4.6
}
}
],
"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": "maintained",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": null,
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": 11,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "last human commit 11 days ago",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_maintained",
"params": {
"days": 11
}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "weak",
"name": "Community & Adoption",
"value": 35,
"weight": 0.17,
"metrics": [
{
"key": "popularity",
"band": "at_risk",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 22,
"inputs": {
"forks": 2,
"stars": 19,
"watchers": 3,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "19 stars",
"points": 20.4,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 19
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "2 forks",
"points": 0,
"status": "missed",
"details": [
{
"code": "forks",
"params": {
"count": 2
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "3 watchers",
"points": 1.7,
"status": "partial",
"details": [
{
"code": "watchers",
"params": {
"count": 3
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "moderate",
"name": "Community health",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"has_readme": true,
"has_license": true,
"readme_badges": null,
"has_contributing": false,
"has_issue_template": false,
"has_code_of_conduct": false,
"readme_badge_services": [],
"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": "recognized license (Apache-2.0)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "Apache-2.0"
}
}
],
"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": 38,
"weight": 0.23,
"metrics": [
{
"key": "maintainer_resilience",
"band": "at_risk",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 31,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 12,
"top_contributor_share": 0.769
},
"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 77% of commits",
"points": 5.2,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 77
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "12 contributors",
"points": 13.5,
"status": "met",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 12
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 3,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "at_risk",
"name": "Issue & PR responsiveness",
"note": "Excluded from scoring (no data or not applicable): Newcomer PR acceptance. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"newcomer_pr_acceptance"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 34,
"inputs": {
"merged_prs": 69,
"open_issues": 2,
"closed_issues": 0,
"prs_merged_7d": null,
"prs_decided_7d": null,
"prs_merged_30d": null,
"prs_decided_30d": null,
"issue_closed_ratio": 0,
"closed_unmerged_prs": 2,
"first_time_authors_30d": null,
"first_time_prs_merged_30d": null,
"first_time_prs_decided_30d": null
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "0% of issues closed",
"points": 0,
"status": "missed",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 0
}
}
],
"max_points": 42
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "69/71 decided PRs merged",
"points": 29.2,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 69,
"decided": 71
}
}
],
"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": null,
"notes": [],
"value": 50,
"inputs": {
"followers": 10,
"owner_type": "Organization",
"is_verified": null,
"owner_login": "windowsadmins",
"public_repos": 14,
"account_age_days": 650
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "organization-owned",
"points": 30,
"status": "met",
"details": [
{
"code": "owner_organization",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "10 followers of windowsadmins",
"points": 7.5,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 10,
"login": "windowsadmins"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "14 public repos, account ~1 yr old",
"points": 12.1,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 14
}
},
{
"code": "account_age_years",
"params": {
"years": 1
}
}
],
"max_points": 25
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "good",
"name": "Engineering Quality",
"value": 74,
"weight": 0.19,
"metrics": [
{
"key": "engineering_practices",
"band": "good",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 66,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": "2 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 2
}
}
],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 24,
"status": "met",
"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": "22 out of 24 merged PRs checked by a CI test -- score normalized to 9",
"points": 18,
"status": "partial",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "excellent",
"name": "Documentation",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"topics": [
"devops",
"gitops",
"software-deployment",
"windows-administration"
],
"has_wiki": true,
"homepage": null,
"has_readme": true,
"has_docs_dir": true,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 25,
"status": "met",
"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": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": "4 topics",
"points": 10,
"status": "met",
"details": [
{
"code": "topics_count",
"params": {
"count": 4
}
}
],
"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": "weak",
"name": "Security",
"value": 42,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "weak",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Packaging. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"packaging"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 42,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 17,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 1,
"scorecard_aggregate": 4.2
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "branch protection is not maximal on development and all release branches",
"points": 3.8,
"status": "partial",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "22 out of 24 merged PRs checked by a CI test -- score normalized to 9",
"points": 2.2,
"status": "partial",
"details": [],
"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 1 contributing companies or organizations -- score normalized to 3",
"points": 0.8,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"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 detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 7.5,
"status": "met",
"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": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "SAST tool is not run on all commits -- score normalized to 0",
"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": "detected GitHub workflow tokens with excessive permissions",
"points": 0,
"status": "missed",
"details": [],
"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": 7
},
"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": "moderate",
"name": "AI Readiness",
"value": 59,
"weight": 0.04,
"metrics": [
{
"key": "ai_agent_context",
"band": "weak",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 0.9,
"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": "90 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 90,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "moderate",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 58,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [],
"has_dockerfile": true,
"typed_language": true,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [],
"agent_commit_share": 0.01,
"toolchain_manifests": [
"build/nupkg/CimianTools.arm64.csproj",
"build/nupkg/CimianTools.x64.csproj",
"cli/cimiimport/Cimian.CLI.cimiimport.csproj",
"cli/cimistatus/Cimian.CLI.cimistatus.csproj",
"cli/cimitrigger/Cimian.CLI.cimitrigger.csproj",
"cli/cimiwatcher/Cimian.CLI.cimiwatcher.csproj",
"cli/makecatalogs/Cimian.CLI.makecatalogs.csproj",
"cli/makepkginfo/Cimian.CLI.makepkginfo.csproj",
"cli/managedsoftwareupdate/Cimian.CLI.managedsoftwareupdate.csproj",
"cli/manifestutil/Cimian.CLI.manifestutil.csproj",
"cli/repoclean/Cimian.CLI.repoclean.csproj",
"gui/CimianStatus/Cimian.GUI.CimianStatus.csproj",
"gui/ManagedSoftwareCenter/Cimian.GUI.ManagedSoftwareCenter.csproj",
"shared/core/Cimian.Core.csproj",
"shared/engine/Cimian.Engine.csproj",
"shared/import/Cimian.Import.csproj",
"shared/infrastructure/Cimian.Infrastructure.csproj",
"tests/Cimian.Tests.csproj",
"tests/Cimian.Tests/Cimian.Tests.csproj"
],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "build/nupkg/CimianTools.arm64.csproj, build/nupkg/CimianTools.x64.csproj, cli/cimiimport/Cimian.CLI.cimiimport.csproj (toolchain convention, no task runner)",
"points": 12.6,
"status": "partial",
"details": [
{
"code": "toolchain_convention",
"params": {
"files": "build/nupkg/CimianTools.arm64.csproj, build/nupkg/CimianTools.x64.csproj, cli/cimiimport/Cimian.CLI.cimiimport.csproj"
}
}
],
"max_points": 18
},
{
"key": "automated_tests",
"name": "Automated tests",
"detail": null,
"points": 22,
"status": "met",
"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": "Dockerfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Dockerfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "1 of the last 100 commits agent-authored or agent-credited",
"points": 2,
"status": "partial",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 1,
"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": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"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": 151769,
"source_files_sampled": 171,
"oversized_source_files": 4
},
"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": "4/171 source files over 60KB",
"points": 53.7,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 171,
"oversized": 4
}
}
],
"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": {
"labels": [
"cli"
],
"scores": {
"cli": 4
},
"primary": "cli",
"evidence": [
{
"tier": "dependencies",
"label": "cli",
"source": "dep:System.CommandLine",
"weight": 4
}
],
"artifacts": [],
"confidence": "low",
"host_extension": false,
"runs_as_process": true,
"consumed_by_code": false
},
"metrics_version": "2.3.1"
},
"warnings": [
"Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
"Could not fetch nuget package 'CimianTools-x64' from its registry",
"Could not fetch nuget package 'CimianTools-arm64' from its registry",
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
],
"report_type": "repository",
"generated_at": "2026-07-25T13:46:12.860344Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/w/windowsadmins/cimian.svg",
"full_name": "windowsadmins/cimian",
"license_state": "standard",
"license_spdx": "Apache-2.0"
}