Public record
Software health reportschema 0.27.0 · metrics 1.13.0 · 2026-07-23 14:07 UTC

jeff377 / bee-library

Bee.NET — A modular, definition-driven .NET framework for enterprise apps. N-Tier + Clean Architecture + MVVM.

C#MIT★ 10 stars⑂ 5 forkssince Apr 2025View on GitHub ↗

jeff377/bee-library holds a health index of 61 out of 100, placing it in the Moderate band. It scores highest on Vitality (93/100) and lowest on Community & Adoption (35/100). It was last updated today. A single contributor accounts for most of its recent work.

61
overall / 100
Moderate

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At risk ceiling of 49. AI Readiness sits outside the overall score.

61
Excellent85-100Exemplary; meets essentially all checked criteria
Good70-84Healthy; minor gaps
Moderate50-69Acceptable with notable gaps; review recommended
At risk30-49Significant weaknesses; adoption warrants caution
Critical1-29Severe problems (abandoned, single-maintainer, no hygiene)
VitalityCommunity &AdoptionSustainability &GovernanceEngineeringQualitySecurityAI Readiness

Score profile

Each axis is a category. The shape matters more than the average — a healthy subject fills the whole shape, while a spike-and-crater profile means strength in one dimension is masking risk in another.

Ownership

JeffPersonal account
7 followers14 public repossince Nov 2015Taiwan

This repository is owned by a personal account. A single-owner project carries more continuity risk than an organization-backed one.

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publishTags
NuGetBee.Cli4.15.0-90 days agobee.netclidotnet-tooldefines

Metrics by category

Vitality

Is the project alive — is code being written and are releases shipping?

93Excellent · 22% of overall
How it's scored
36/36Push recency — last push 0 days ago
24.9/36Commit cadence — 36/52 weeks with commits
18/18Commit volume — 1,710 commits in the last year
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year1,710
human_commit_share1
days_since_last_push0
active_weeks_last_year36

Release discipline

100Excellent
How it's scored
27/27Ships releases — 60 releases published
36/36Release recency — latest release 0 days ago
27/27Release cadence — a release every ~4.9 days
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count60
latest_release_tagv4.15.0
releases_from_tagsno
days_since_latest_release0
mean_days_between_releases4.9
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.

Community & Adoption

Does the project have users, downloads, attention, and a welcoming setup for contributors?

35At risk · 18% of overall
How it's scored
15.5/60Stars — 10 stars
5/25Forks — 5 forks
0/15Watchers — 2 watchers
Inputs used
forks5
stars10
watchers2
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (MIT)
0/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
How it's scored
30.5/80Total downloads — 870 downloads all-time across nuget
0/20Registry dependents — not reported by this ecosystem
Inputs used
packagesBee.Cli
dependents
ecosystemsnuget
total_downloads870
monthly_downloads
Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.

Sustainability & Governance

Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?

47At risk · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
2.1/22.5Commit distribution — top contributor authored 91% of commits
2.7/13.5Contributor breadth — 2 contributors
6/10OpenSSF Scorecard: Contributors — project has 2 contributing companies or organizations -- score normalized to 6
Inputs used
bus_factor1
contributors_sampled2
top_contributor_share0.908
How it's scored
0/46.8Issue resolution — no issues or no data
20.3/38.3PR acceptance — 89/168 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Inputs used
merged_prs89
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs79
Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.
How it's scored
10/30Ownership backing — personal (user) account
0/20Verified domain — not applicable to user accounts
6.5/25Owner reach — 7 followers of jeff377
20.6/25Track record — 14 public repos, account ~10 yr old
Inputs used
followers7
owner_typeUser
is_verified
owner_loginjeff377
public_repos14
account_age_days3,892
Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.
How it's scored
25/25Published & resolvable — 1 package(s) on nuget
35/35Publish recency — latest publish 0 days ago
20/20Version history — 9 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packagesBee.Cli
ecosystemsnuget
any_deprecatedno
min_days_since_publish0

Engineering Quality

Are baseline engineering and documentation practices in place?

71Good · 20% of overall
How it's scored
24/24CI workflows — 3 workflow(s)
24/24Tests present
0/16Linter config
0/9.6Pre-commit hooks
6.4/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — no data
Inputs used
has_ciyes
has_testsyes
has_editorconfigyes
has_linter_configno
has_precommit_configno
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.
How it's scored
30/30README
25/25Documentation directory
0/15Documentation / homepage site
10/10Repository description
10/10Topics — 5 topics
0/10Wiki
Inputs used
topicsclear-architecture, mvvm, n-tier, erp, enterprise-architecture
has_wikino
homepage
has_readmeyes
has_docs_diryes
has_descriptionyes

Security

Are visible security and supply-chain practices strong, without unresolved high-risk jurisdiction exposure?

53Moderate · 16% of overall
How it's scored
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — no data
0/2.5CI-Tests — no data
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
1.5/2.5Contributors — project has 2 contributing companies or organizations -- score normalized to 6
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5License — license file detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
5/5Pinned-Dependencies — all dependencies are pinned
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — no data
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate5.3
Excluded from scoring (no data or not applicable): branch_protection, ci_tests, signed_releases. Remaining weights renormalized.

AI Readiness

How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score.

73Good · 0% of overall
How it's scored
45/45Agent instructions — .claude/CLAUDE.md
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 100 of 100 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share1
agent_instruction_files.claude/CLAUDE.md
agent_instruction_max_bytes5,759
How it's scored
12.6/18One-command bootstrap — apps/Bee.Northwind/Bee.Northwind.Android/Bee.Northwind.Android.csproj, apps/Bee.Northwind/Bee.Northwind.Browser/Bee.Northwind.Browser.csproj, apps/Bee.Northwind/Bee.Northwind.Desktop/Bee.Northwind.Desktop.csproj (toolchain convention, no task runner)
22/22Automated tests
0/11Lint / format config
11/11Static type checking — C# (statically typed)
0/10Reproducible environment
10/10Demonstrated agent practice — 100 of the last 100 commits agent-authored or agent-credited
0/8Automated maintenance — no automated dependency updates observed
10/10OpenSSF Scorecard: Pinned-Dependencies — all dependencies are pinned
Inputs used
has_nixno
has_testsyes
lockfiles
has_dockerfileno
typed_languageyes
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share1
toolchain_manifestsapps/Bee.Northwind/Bee.Northwind.Android/Bee.Northwind.Android.csproj, apps/Bee.Northwind/Bee.Northwind.Browser/Bee.Northwind.Browser.csproj, apps/Bee.Northwind/Bee.Northwind.Desktop/Bee.Northwind.Desktop.csproj, apps/Bee.Northwind/Bee.Northwind.Server/Bee.Northwind.Server.csproj, apps/Bee.Northwind/Bee.Northwind.UI/Bee.Northwind.UI.csproj, apps/Bee.Northwind/Bee.Northwind.iOS/Bee.Northwind.iOS.csproj, samples/Avalonia.Demo/Avalonia.Demo.csproj, samples/Avalonia.DemoCenter/Avalonia.DemoCenter.csproj, samples/Bee.Samples.Shared/Bee.Samples.Shared.csproj, samples/Blazor.Server.Demo/Blazor.Server.Demo.csproj, samples/Blazor.Wasm.Demo.Host/Blazor.Wasm.Demo.Host.csproj, samples/Blazor.Wasm.Demo/Blazor.Wasm.Demo.csproj, samples/Maui.Demo/Maui.Demo.csproj, samples/QuickStart.Console/QuickStart.Console.csproj, samples/QuickStart.Server/QuickStart.Server.csproj, src/Bee.Api.AspNetCore/Bee.Api.AspNetCore.csproj, src/Bee.Api.Client/Bee.Api.Client.csproj, src/Bee.Api.Contracts/Bee.Api.Contracts.csproj, src/Bee.Api.Core/Bee.Api.Core.csproj, src/Bee.Base/Bee.Base.csproj, src/Bee.Business/Bee.Business.csproj, src/Bee.Db/Bee.Db.csproj, src/Bee.Definition/Bee.Definition.csproj, src/Bee.Expressions/Bee.Expressions.csproj, src/Bee.Hosting/Bee.Hosting.csproj, src/Bee.ObjectCaching/Bee.ObjectCaching.csproj, src/Bee.Repository.Abstractions/Bee.Repository.Abstractions.csproj, src/Bee.Repository/Bee.Repository.csproj, src/Bee.UI.Avalonia/Bee.UI.Avalonia.csproj, src/Bee.UI.Core/Bee.UI.Core.csproj, src/Bee.UI.Maui/Bee.UI.Maui.csproj, src/Bee.Web.Blazor.Server/Bee.Web.Blazor.Server.csproj, src/Bee.Web.Blazor.Wasm/Bee.Web.Blazor.Wasm.csproj, tests/Bee.Api.AspNetCore.UnitTests/Bee.Api.AspNetCore.UnitTests.csproj, tests/Bee.Api.Client.UnitTests/Bee.Api.Client.UnitTests.csproj, tests/Bee.Api.Core.UnitTests/Bee.Api.Core.UnitTests.csproj, tests/Bee.Base.UnitTests/Bee.Base.UnitTests.csproj, tests/Bee.Business.UnitTests/Bee.Business.UnitTests.csproj, tests/Bee.Db.UnitTests/Bee.Db.UnitTests.csproj, tests/Bee.Definition.UnitTests/Bee.Definition.UnitTests.csproj, tests/Bee.Expressions.UnitTests/Bee.Expressions.UnitTests.csproj, tests/Bee.Hosting.UnitTests/Bee.Hosting.UnitTests.csproj, tests/Bee.ObjectCaching.UnitTests/Bee.ObjectCaching.UnitTests.csproj, tests/Bee.Repository.UnitTests/Bee.Repository.UnitTests.csproj, tests/Bee.Tests.Shared/Bee.Tests.Shared.csproj, tests/Bee.UI.Avalonia.UnitTests/Bee.UI.Avalonia.UnitTests.csproj, tests/Bee.UI.Core.UnitTests/Bee.UI.Core.UnitTests.csproj, tests/Bee.UI.Maui.UnitTests/Bee.UI.Maui.UnitTests.csproj, tests/Bee.Web.Blazor.Server.UnitTests/Bee.Web.Blazor.Server.UnitTests.csproj, tests/Bee.Web.Blazor.Wasm.UnitTests/Bee.Web.Blazor.Wasm.UnitTests.csproj, tools/Bee.Cli/Bee.Cli.csproj, tools/DefineEditor/Bee.DefineEditor.csproj
dependency_bot_commit_share0
How it's scored
45/45Type-checkable code — C# (statically typed)
55/55Manageable file sizes — 0/1,545 source files over 60KB
Inputs used
primary_languageC#
largest_source_bytes54,586
source_files_sampled1,545
oversized_source_files0
How it's scored
0/40API schema (OpenAPI/GraphQL/proto)
0/20MCP server
40/40Runnable examples — samples
Inputs used
example_dirssamples
has_mcp_signalno
api_schema_files

Key facts

10GitHub stars
2contributors
1,710commits, last 12 months
0days since last push
60releases
1bus factor
0open issues
package ecosystems

Data collection warnings

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

More detail

Star and fork history 0 ★ / 5 ⇿
0Stars
5Forks
46Releases

When each star and fork was added, collected from GitHub and bucketed by day. Cumulative growth sits directly above the daily additions it is made of, so the two read against each other: steady organic accretion looks nothing like an abrupt, short-lived burst. Where that difference is measurable, it is reported as growth authenticity.

2334455522025-072026-012026-06
Major 0Minor 14Patch 24
OpenSSF Scorecard 5.3 / 10
5.3aggregate

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).Scorecard v5.5.0 · 2026-07-23 14:07 UTC

10Binary-Artifactsno binaries found in the repo
n/aBranch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
n/aCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
6Contributorsproject has 2 contributing companies or organizations -- score normalized to 6
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
10Pinned-Dependenciesall dependencies are pinned
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
n/aSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Direct dependencies 16
RegistryPackageVersion constraintManifest
NuGetMessagePack3.1.7src/Bee.Definition/Bee.Definition.csproj
NuGetMicrosoft.Extensions.Localization.Abstractions10.0.8src/Bee.Definition/Bee.Definition.csproj
NuGetDynamicExpresso.Core2.19.3src/Bee.Expressions/Bee.Expressions.csproj
NuGetMicrosoft.Extensions.DependencyInjection10.0.0src/Bee.Hosting/Bee.Hosting.csproj
NuGetMicrosoft.Extensions.Hosting.Abstractions10.0.0src/Bee.Hosting/Bee.Hosting.csproj
NuGetMicrosoft.Extensions.Caching.Memory10.0.0src/Bee.ObjectCaching/Bee.ObjectCaching.csproj
NuGetAvalonia12.0.0src/Bee.UI.Avalonia/Bee.UI.Avalonia.csproj
NuGetAvalonia.Controls.DataGrid12.0.0src/Bee.UI.Avalonia/Bee.UI.Avalonia.csproj
NuGetMicrosoft.Maui.Controls10.0.20src/Bee.UI.Maui/Bee.UI.Maui.csproj
NuGetMicrosoft.AspNetCore.Components.WebAssembly10.0.0src/Bee.Web.Blazor.Wasm/Bee.Web.Blazor.Wasm.csproj
NuGetAvalonia12.0.4tools/DefineEditor/Bee.DefineEditor.csproj
NuGetAvalonia.Desktop12.0.4tools/DefineEditor/Bee.DefineEditor.csproj
NuGetSemi.Avalonia12.0.3tools/DefineEditor/Bee.DefineEditor.csproj
NuGetAvalonia.Fonts.Inter12.0.4tools/DefineEditor/Bee.DefineEditor.csproj
NuGetAvaloniaUI.DiagnosticsSupport2.2.1tools/DefineEditor/Bee.DefineEditor.csproj
NuGetCommunityToolkit.Mvvm8.4.1tools/DefineEditor/Bee.DefineEditor.csproj
All dependencies not collected

The resolved dependency set could not be collected for this report: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Raw JSON report machine-readable
{
  "data": {
    "repo": {
      "topics": [
        "clear-architecture",
        "mvvm",
        "n-tier",
        "erp",
        "enterprise-architecture"
      ],
      "is_fork": false,
      "size_kb": 9415,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "C#": 6058756,
        "CSS": 596,
        "HTML": 17741,
        "Shell": 8617,
        "Swift": 5065,
        "JavaScript": 426
      },
      "pushed_at": "2026-07-23T13:50:51Z",
      "created_at": "2025-04-16T05:42:33Z",
      "owner_type": "User",
      "updated_at": "2026-07-23T13:45:06Z",
      "description": "Bee.NET — A modular, definition-driven .NET framework for enterprise apps. N-Tier + Clean Architecture + MVVM.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "C#",
      "significant_languages": [
        "C#"
      ]
    },
    "owner": {
      "blog": "https://hackmd.io/@jeff377",
      "name": "Jeff",
      "type": "User",
      "login": "jeff377",
      "company": "Taiwan",
      "location": "Taipei",
      "followers": 7,
      "avatar_url": "https://avatars.githubusercontent.com/u/16026012?v=4",
      "created_at": "2015-11-26T02:42:33Z",
      "is_verified": null,
      "public_repos": 14,
      "account_age_days": 3892
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v4.15.0",
          "kind": "minor",
          "published_at": "2026-07-23T13:55:19Z"
        },
        {
          "tag": "v4.14.0",
          "kind": "minor",
          "published_at": "2026-07-09T15:45:34Z"
        },
        {
          "tag": "v4.13.0",
          "kind": "minor",
          "published_at": "2026-07-01T16:05:00Z"
        },
        {
          "tag": "v4.12.1",
          "kind": "patch",
          "published_at": "2026-06-26T17:18:39Z"
        },
        {
          "tag": "v4.12.0",
          "kind": "minor",
          "published_at": "2026-06-26T06:05:04Z"
        },
        {
          "tag": "v4.11.0",
          "kind": "minor",
          "published_at": "2026-06-24T03:46:17Z"
        },
        {
          "tag": "v4.10.0",
          "kind": "minor",
          "published_at": "2026-06-15T09:35:28Z"
        },
        {
          "tag": "v4.9.0",
          "kind": "minor",
          "published_at": "2026-06-12T06:43:20Z"
        },
        {
          "tag": "v4.8.0",
          "kind": "minor",
          "published_at": "2026-06-09T15:49:23Z"
        },
        {
          "tag": "v4.7.0",
          "kind": "minor",
          "published_at": "2026-06-09T06:29:59Z"
        },
        {
          "tag": "v4.6.0",
          "kind": "minor",
          "published_at": "2026-05-26T07:09:53Z"
        },
        {
          "tag": "v4.5.0",
          "kind": "minor",
          "published_at": "2026-05-23T08:47:47Z"
        },
        {
          "tag": "v4.4.0",
          "kind": "minor",
          "published_at": "2026-05-16T03:44:38Z"
        },
        {
          "tag": "v4.3.0",
          "kind": "minor",
          "published_at": "2026-05-13T15:08:00Z"
        },
        {
          "tag": "v4.2.0",
          "kind": "minor",
          "published_at": "2026-05-13T12:06:34Z"
        },
        {
          "tag": "v4.1.0",
          "kind": "minor",
          "published_at": "2026-05-05T13:53:46Z"
        },
        {
          "tag": "v4.0.2",
          "kind": "patch",
          "published_at": "2026-04-23T14:40:44Z"
        },
        {
          "tag": "v4.0.1",
          "kind": "patch",
          "published_at": "2026-04-09T16:20:05Z"
        },
        {
          "tag": "v3.6.2",
          "kind": "patch",
          "published_at": "2025-11-07T03:49:01Z"
        },
        {
          "tag": "BeeSettingsEditor-v1.0.8",
          "kind": "other",
          "published_at": "2025-10-28T15:32:24Z"
        },
        {
          "tag": "v3.6.1",
          "kind": "patch",
          "published_at": "2025-10-28T15:09:55Z"
        },
        {
          "tag": "v3.6.0",
          "kind": "minor",
          "published_at": "2025-10-24T14:16:34Z"
        },
        {
          "tag": "v3.5.2",
          "kind": "patch",
          "published_at": "2025-10-15T08:13:26Z"
        },
        {
          "tag": "BeeSettingsEditor-v1.0.7",
          "kind": "other",
          "published_at": "2025-10-05T03:23:47Z"
        },
        {
          "tag": "v3.5.1",
          "kind": "patch",
          "published_at": "2025-10-05T03:01:32Z"
        },
        {
          "tag": "v3.5.0",
          "kind": "minor",
          "published_at": "2025-09-25T15:05:56Z"
        },
        {
          "tag": "v3.4.9",
          "kind": "patch",
          "published_at": "2025-09-25T08:19:43Z"
        },
        {
          "tag": "v3.4.8",
          "kind": "patch",
          "published_at": "2025-09-24T05:06:03Z"
        },
        {
          "tag": "BeeSettingsEditor-v1.0.6",
          "kind": "other",
          "published_at": "2025-09-24T04:45:49Z"
        },
        {
          "tag": "v3.4.7",
          "kind": "patch",
          "published_at": "2025-09-23T07:28:54Z"
        },
        {
          "tag": "v3.4.6",
          "kind": "patch",
          "published_at": "2025-09-22T14:52:18Z"
        },
        {
          "tag": "v3.4.5",
          "kind": "patch",
          "published_at": "2025-09-22T08:52:18Z"
        },
        {
          "tag": "v3.4.4",
          "kind": "patch",
          "published_at": "2025-09-22T06:27:09Z"
        },
        {
          "tag": "v3.4.3",
          "kind": "patch",
          "published_at": "2025-09-21T03:20:24Z"
        },
        {
          "tag": "v3.4.2",
          "kind": "patch",
          "published_at": "2025-09-18T02:46:48Z"
        },
        {
          "tag": "v3.4.1",
          "kind": "patch",
          "published_at": "2025-09-16T14:31:15Z"
        },
        {
          "tag": "v3.4.0",
          "kind": "minor",
          "published_at": "2025-09-05T12:58:14Z"
        },
        {
          "tag": "v3.3.1",
          "kind": "patch",
          "published_at": "2025-09-04T02:49:07Z"
        },
        {
          "tag": "v3.3.0",
          "kind": "minor",
          "published_at": "2025-09-03T14:09:59Z"
        },
        {
          "tag": "v3.2.8",
          "kind": "patch",
          "published_at": "2025-09-03T06:08:43Z"
        },
        {
          "tag": "v3.2.7",
          "kind": "patch",
          "published_at": "2025-08-19T12:12:33Z"
        },
        {
          "tag": "BeeSettingsEditor-v1.0.5",
          "kind": "other",
          "published_at": "2025-08-18T00:25:13Z"
        },
        {
          "tag": "BeeSettingsEditor-v1.0.4",
          "kind": "other",
          "published_at": "2025-08-17T03:09:53Z"
        },
        {
          "tag": "v3.2.6",
          "kind": "patch",
          "published_at": "2025-08-17T02:29:34Z"
        },
        {
          "tag": "v3.2.5",
          "kind": "patch",
          "published_at": "2025-08-14T08:08:34Z"
        },
        {
          "tag": "v3.2.4",
          "kind": "patch",
          "published_at": "2025-08-08T11:44:19Z"
        },
        {
          "tag": "v3.2.3",
          "kind": "patch",
          "published_at": "2025-08-05T03:50:15Z"
        },
        {
          "tag": "BeeSettingsEditor-v1.0.3",
          "kind": "other",
          "published_at": "2025-08-01T15:43:40Z"
        },
        {
          "tag": "v3.2.2",
          "kind": "patch",
          "published_at": "2025-08-01T15:27:52Z"
        },
        {
          "tag": "BeeSettingsEditor-v1.0.2",
          "kind": "other",
          "published_at": "2025-07-28T02:51:22Z"
        },
        {
          "tag": "BeeSettingsEditor-v1.0.1",
          "kind": "other",
          "published_at": "2025-07-27T05:31:57Z"
        },
        {
          "tag": "v3.2.1",
          "kind": "patch",
          "published_at": "2025-07-27T05:32:51Z"
        },
        {
          "tag": "BeeDbUpgrade-v1.0.0",
          "kind": "other",
          "published_at": "2025-07-25T13:27:46Z"
        },
        {
          "tag": "BeeSettingsEditor-v1.0.0",
          "kind": "other",
          "published_at": "2025-07-25T03:33:23Z"
        },
        {
          "tag": "v3.2.0",
          "kind": "minor",
          "published_at": "2025-07-24T14:37:20Z"
        },
        {
          "tag": "v3.1.7",
          "kind": "patch",
          "published_at": "2025-07-22T14:02:43Z"
        },
        {
          "tag": "v3.1.6",
          "kind": "patch",
          "published_at": "2025-07-19T12:07:16Z"
        },
        {
          "tag": "v3.1.5",
          "kind": "patch",
          "published_at": "2025-07-19T02:10:39Z"
        },
        {
          "tag": "v3.1.4",
          "kind": "patch",
          "published_at": "2025-07-13T11:14:52Z"
        },
        {
          "tag": "v3.1.3",
          "kind": "patch",
          "published_at": "2025-07-12T14:45:11Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "a240a4ee71d9b0c4710e8f5deacedf39b7616448",
          "body": "發版前 wire/API 收斂。兩組 breaking change(pre-stable、無外部消費者,以\nminor 發佈):\n\n- MessagePack 合約序列化由整數 [Key] 改 property-name key(72 型別;ADR-030),\n  JSON/MessagePack 統一以屬性名為 wire 合約。[Union]/集合容器/SerializableData*\n  維持整數鍵。\n- Bee.Api.Contracts 合約介面依 System/Form/AuditLog 三軸移入子命名空間,\n  根命名空間僅留 ExecFunc。純 source-level,對 wire 無影響。\n\n更新 CHANGELOG(雙語)+ 明細檔 docs/changelogs/4.15.0{,.zh-TW}.md,\n版號 4.14.0 → 4.15.0(Directory.Build.props)。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): 4.15.0 — MessagePack property-name key + 合約介面軸分命名空間",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-23T13:43:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4eb6f98404f71373a78da3f853f9bcd762b11c65",
          "body": "commit 7671b81d 將 CreateLogBusinessObject 加入 IBusinessObjectFactory\n時,samples 的 DemoBusinessObjectFactory 漏補此方法,導致 CS0535。因\nsamples/ 不在 build-ci.yml 觸發路徑,CI 未攔到而長期未被發現。\n\n實作直接回框架 LogBusinessObject(稽核日誌 BO 無 demo 客製需求),與正式\nBusinessObjectFactory 一致。連帶修好相依 Bee.Samples.Shared 的\nQuickStart.Server、Blazor.Server.Demo、Blazor.Wasm.Demo.Host。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(samples): 補 DemoBusinessObjectFactory 遺漏的 CreateLogBusinessObject",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-23T13:26:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b1e32ecf1c6bd1688b922a10f7ee4f5259093427",
          "body": "三軸重構 + README 落地;ADR 依使用者決定不新增,CHANGELOG 併發版 draft。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(plan): contracts 命名空間軸對齊 plan 標記完成",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-23T09:31:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c633577b82756750344553fbecb84da0f294e928",
          "body": "更新 Bee.Api.Contracts README(雙語):新增「軸分命名空間」設計慣例,\n重畫目錄結構為 System/Form/AuditLog 子資料夾 + ExecFunc 留根,對映三軸對齊結果。\n\nCHANGELOG 依 releasing 慣例併下一個 major 發版時以 /changelog-draft 統整\n(commit 已帶 BREAKING CHANGE footer),此處不預先起 major 段落。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(contracts): README 反映合約介面軸分命名空間",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-23T09:29:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d924e63741e40cdf355c04bb21ede058924f06cd",
          "body": "將 Bee.Api.Contracts 的 AuditLog 軸合約介面(13)與 DTO(RecordFieldChange)\n移入 AuditLog/ 子資料夾,命名空間 Bee.Api.Contracts → Bee.Api.Contracts.AuditLog,\n對齊 Bee.Business.AuditLog 與 Bee.Api.Core.Messages.AuditLog 兩層既有的軸分法。\n\n至此三軸對齊完成:根命名空間 Bee.Api.Contracts 僅保留跨 BO 泛用的 ExecFunc\n(IExecFuncRequest/Response,鏡像 Messages 根層\n[…]\n改為\nBee.Api.Contracts.AuditLog,外部消費者需更新 using。純 source-level 變更,對 wire\n無影響(序列化實作類別命名空間不變、MessagePack 採 property-name key)。\n綁下一個 major 發佈。階段 3/3。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(contracts)!: AuditLog 軸合約介面移入 Bee.Api.Contracts.AuditLog",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-23T09:26:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "07109d16b7255c08c1cb2931c7504bfc2420dc5a",
          "body": "將 Bee.Api.Contracts 的 Form 軸合約介面(12:IDelete/IGetData/IGetList/\nIGetLookup/IGetNewData/ISave 各 Request/Response)移入 Form/ 子資料夾,命名空間\nBee.Api.Contracts → Bee.Api.Contracts.Form,對齊 Bee.Business.Form 與\nBee.Api.Core.Messages.Form 兩層既有的軸分法。消費端(Messages.Form /\nBusiness.Form)補對應 using。\n\nBREAKING CHANGE: Form \n[…]\ni.Contracts.Form,外部消費者需更新 using。純 source-level 變更,對 wire\n無影響(序列化實作類別命名空間不變、MessagePack 採 property-name key)。\n綁下一個 major 發佈。階段 2/3(AuditLog 待續)。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(contracts)!: Form 軸合約介面移入 Bee.Api.Contracts.Form",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-23T09:24:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a68fc52fef0998440003eb442a83927a2837f42e",
          "body": "將 Bee.Api.Contracts 的 System 軸合約介面(29)與 DTO(3:PackageDelivery /\nPackageUpdateInfo / PackageUpdateQuery)移入 System/ 子資料夾,命名空間\nBee.Api.Contracts → Bee.Api.Contracts.System,對齊 Bee.Business.System 與\nBee.Api.Core.Messages.System 兩層既有的軸分法。\n\n消除「合約實作已入軸、合約介面卻平放」的不對稱(僅存在於介面層)。\n消費端(Messages.System / Business.S\n[…]\nacts.System,外部消費者需更新 using。純 source-level 變更,\n序列化實作類別命名空間不變、MessagePack 採 property-name key,對 wire 無影響。\n綁下一個 major 發佈。階段 1/3(Form、AuditLog 待續)。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(contracts)!: System 軸合約介面移入 Bee.Api.Contracts.System",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-23T09:23:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "38829fec4ddf255ba90ee29f25003105142dcf7e",
          "body": "bunit 2.7.2 傳遞帶入 AngleSharp 1.4.0;新 advisory GHSA-pgww-w46g-26qg\n(< 1.5.0 脆弱)使 CI strict build 的 NuGetAudit gate 失敗。於兩個 Blazor\n測試專案加直接 PackageReference 覆蓋至 1.5.2(patched 版)。\n\n與 MessagePack name-based key 改動無關,屬新發布 advisory 的即時修補。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "build(deps): 釘 AngleSharp 1.5.2 修正 NU1902 安全稽核(Blazor 測試)",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-23T01:54:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6cd64aea0c09bc02cb7adba4f8d86d1702c02db7",
          "body": "migration 已執行並驗證。文件更新:\n- ADR-030 → 已採納,新增「執行結果與最終範圍」(category-aware 範圍表 +\n  [Union] ⊥ keyAsPropertyName 約束記錄)。\n- ADR-004 交叉註記 → superseded-in-part(整數鍵改 property-name key,\n  Union/DataSet plumbing 例外)。\n- plan → 已完成,記錄 [Union] 關鍵發現與驗證結果。\n- api-bo-contract-design(雙語)範例 [Key(100)] → keyAsPropertyName,\n  補 [Union] 例外說明。\n\nRefs: ADR-030\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: ADR-030 轉已採納 + 記錄 [Union] 約束與最終範圍",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-23T01:26:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1a5fe836bffcc3d47b7762d39ad3789cc7c021ae",
          "body": "Batch 2(接續 879105ee):15 個型別轉 keyAsPropertyName、移除整數 [Key(n)]:\n- Group A 純 DTO:PackageUpdateInfo/Query、RecordFieldChange、CompanyInfo、\n  DepartmentTree、PagingInfo/Options\n- Group C 非-Union 集合 item:AllowedCurrencyItem、CashRoundingItem、\n  NumberFormatItem、CurrencyItem、UnitItem、SortField、DepartmentNode、P\n[…]\n化 201、Api.Core 序列化+合約+Filter 237 全過;全 solution\nRelease build 0 error / 0 warning。\n\nRefs: ADR-030, docs/plans/plan-messagepack-name-based-keys.md\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor!: Bee.Definition/Contracts DTO + 集合 item 改採 property-name key",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-23T01:23:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "879105ee060e0b49b94d7dcc00157259b4053ddc",
          "body": "57 個 Bee.Api.Core.Messages 合約型別 [MessagePackObject] →\n[MessagePackObject(keyAsPropertyName: true)],移除整數 [Key(n)];\nApiMessageBase.Parameters 一併移除 [Key(0)](改以屬性名序列化,由 derived\n的 keyAsPropertyName formatter 以名處理,[IgnoreMember] 成員仍排除)。\n\n消滅整數鍵的 ctor-order 對號 footgun 與跨繼承 key 編號協調;JSON 與\nMessagePack 統一以屬性名\n[…]\n JSON round-trip 保真)全過驗證。\nPhase 0 已證 reflection-only(AOT)下 keyAsPropertyName 亦正常。\n\nRefs: ADR-030, docs/plans/plan-messagepack-name-based-keys.md\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(api-core)!: 合約型別 MessagePack 改採 property-name key",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-23T01:20:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "05e8a965e0c8ffb2803db27bb2cb825cc728fb37",
          "body": "Phase 0 讓 migration 更便宜(免 source-gen)但未改變主成本(對已發佈套件的\nbreaking wire change),決議不做獨立 breaking release、綁進下一個 major。\nplan 標暫緩、adr-030 維持提議中直到隨 major 落地。現況 hybrid 正常運作。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(adr): 記錄 ADR-030 go/no-go 決議為暫緩(綁下一個 major)",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-23T01:01:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d522a1592a9288267e4a737452a0d57b65e44cb0",
          "body": "以 runtimeconfig IsDynamicCodeSupported=false 桌面重現行動端 AOT 的\nreflection-only 路徑,對 MessagePackCodec 跑合約 round-trip:整數 key、\n整數 key+集合、keyAsPropertyName 三型別皆 PASS。\n\n結論:MessagePack 3.x 有 reflection-based fallback,source generator 非\nmigration 前置條件(Phase 4 判定不需要)。誠實界定未涵蓋:trimming(half-A,\n與鍵策略無關)、iOS 實機。adr-030 據此下修「source-gen 退路」急迫性,B 決策\n仍維持(其餘三條理由不受影響)。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(adr): 記錄 ADR-030 Phase 0 AOT 冒煙結果",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-23T00:59:42Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e2f504f708eaa290e0adb54710944d9495964ed6",
          "body": "記錄「合約 wire 鍵改 name-based(keyAsPropertyName,非純去標記 contractless)」\n的決策方向與取捨,狀態提議中、gated on go/no-go(對已發佈套件為 breaking\nwire change)。adr-004 加交叉引用指向 ADR-030;plan-messagepack-name-based-keys\n補文件階段與 AOT 冒煙(Phase 0)。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(adr): ADR-030 MessagePack 合約改採 property-name key(提議中)",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-23T00:53:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5a56c7fbe190c147a030909de068c91f7e4493ea",
          "body": "反射列舉 Bee.Api.Core 組件內所有 ApiRequest/ApiResponse 子型別,以\nMessagePack(MessagePackCodec)與 JSON(JsonCodec)雙格式做 round-trip\n保真比對(serialize == serialize∘deserialize∘serialize),自動涵蓋現有\n與未來合約。57 型別 × 2 格式 = 114 tests;全專案 459 綠無回歸。\n\n對齊 sibling repo 的 ApiContractSerializationTests 做法;差異:bee 無\nJsonPayloadSerializer 故 JSON 走 JsonCodec、SerializeState private setter\n以 SetMethod.IsPublic 過濾繞開、DataSet/DataTable 欄位特判留 null。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(api-core): 新增全合約反射掃描 MessagePack/JSON 序列化測試",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-23T00:53:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ea3a49755317a160e1760ee4a019a1d35b9c55a7",
          "body": "以 dotnet format style --diagnostics IDE0005 清掉 tools 與 samples 兩方案\n共 16 檔的無效 using。主方案 src/tests 因 EnforceCodeStyleInBuild +\nTreatWarningsAsErrors 早已無殘留,未受影響。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(cleanup): 移除 tools/samples 未使用的 using(IDE0005)",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-22T13:26:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0ae76d0f4fd4b2de4a4e0e508c3b885b91802818",
          "body": "新增 14 個 *CoverageTests,鎖定 SonarCloud 標記為未覆蓋的純邏輯分支\n(序列化、值轉換、運算式、DiffGram 解析、scope 過濾、SQL builder、\nJSON-RPC 錯誤路徑、版本資訊、快取 dispatch):\n\n- Bee.Base: DataTableJsonConverter(全型別 round-trip)、ValueUtilities\n- Bee.Definition: FormExpressionCalculator、FormRowDefaults、FormSchema\n- Bee.Business: ChangeDiffGramRea\n[…]\nch / 不可達\n分支(DynamicExpresso ParseException dead-catch、ValueUtilities 型別轉換\ncatch、JsonRpcExecutor async 分支等)已於 code review 確認無法在不改 src\n下觸發,維持未覆蓋。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(coverage): 補純邏輯單元測試提升覆蓋率至 90% 以上",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-11T10:27:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "321b030c03b752e86fa6569a3575d1bedb05e0db",
          "body": "- S125 x2(FormView.cs:282,385): 為合法 WHY 註解,依 code-style.md §S125 防誤判\n  改寫為完整英文句子、反引號包識別字、句尾 . 不用 ;,保留 WHY 同時避開誤判\n- CA2263(DynamicExpressoEvaluatorTests): 改用泛型多載 Evaluate<decimal>\n  (泛型內部即委派 Evaluate(expr, vars, typeof(T)),轉換路徑相同、覆蓋不變)\n- S107(DbAccess.WriteDbAnomaly): 5 個互斥選用參數收斂為 DbAnomalyDetail struct,\n  簽章 8→4 參數,4 個呼叫端改用物件初始化\n\nskip.json 清空本次相關項目,僅留兩項既有人工 review(S1135 TODO、S2342 PermissionAction)\n\nby /sonar-fix\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(sonar-fix): 清掉剩餘 4 項 issue(S125 x2、CA2263、S107)",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-11T09:36:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "221ebe4a644e21dc552405fc4ff2a3a8d4a69f9b",
          "body": "- S3776 x4(認知複雜度): FormExpressionCalculator.ApplyFieldExpressions/\n  ValidateRules 抽 per-table/per-rule helper;NumberFormatApplier.Bake 抽\n  EnumerateFields;ChangeDiffGramReader.Read 抽 IndexBeforeRows/AppendUnmatchedDeletes\n- S3267 x4(foreach→Where): NumberFormatApplier、FormLiveComputation、ScopeResol\n[…]\n改 Assert.False\n\n暫緩(skip.json): S125 x2(FormView WHY 註解,False Positive)、\nCA2263(測試刻意驗 Type 多載)、S107(WriteDbAnomaly private helper)\n\nby /sonar-fix\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(sonar-fix): 處理 20 項 SonarCloud issue、4 項移入人工/暫緩清單",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-10T17:09:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cb189e063008690a013a0587d3c29244b52970bc",
          "body": "nuget-publish.yml / build-ci.yml 的 pack 清單為逐一列舉(非 glob),漏了新套件\nBee.Expressions → 4.14.0 發佈時未推上 NuGet(消費端 restore Bee.Business/Definition/\nUI.Avalonia 4.14.0 會因缺相依失敗)。補進兩個 workflow。\n\ndocs 同步新套件:\n- dependency-map(雙語):mermaid 加 Bee.Expressions 節點 + 相依邊、外部套件表、\n  說明、專案數 17→18\n- README(雙語):Shared 套件表加 Bee.Expressions.dll\n- .claude/CLAUDE.md:專案數 17→18\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(release): 補 Bee.Expressions 至 CI/發佈 pack 清單 + docs 同步新套件",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-09T15:41:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b28e0e3e306c2b734b51ff4f63209c49d1bea8ba",
          "body": "運算式與規則引擎(新套件 Bee.Expressions)+ 稽核軌跡/日誌查詢子系統 +\nDataSet 欄名小寫正規化(breaking wire/API,pre-stable 政策以 minor 發佈)。\n雙語 CHANGELOG(主檔 + docs/changelogs/4.14.0 明細)+ Directory.Build.props → 4.14.0。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): 4.14.0 — CHANGELOG + 版本號",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-09T15:03:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "dcec8ada5bfb2d08f7f568c84b9b3ac81d918cf8",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(expression): Phase 2 完成 — Northwind demo 使用者實測正常,5d 收尾",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-09T14:45:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b2bfe11505cacd1a9771b98630bec879019c1223",
          "body": "Avalonia 核心與 Semi 等周邊套件非同步釋出:不立同版號硬規則、也不無腦升\n核心到最新;Semi 慢半拍時整組停在其支援版本線,等所有相關套件出對應版且\nruntime 驗證主題不跑版後再整組升。build 過 ≠ 相容。\n\nCLAUDE.md 僅新增 @rules/avalonia.md import,維持本文放大原則、細則走 rule 檔。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(rules): 新增 rules/avalonia.md,立「升級 UI 套件前必先評估相容性」規則",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-09T14:12:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a1f4f634d1bc8a6e62ec35262716224aa69c0098",
          "body": "依 ADR-029,讓定義/資料/UI 三層欄名一律小寫,從源頭消除大小寫敏感名稱比對\n(運算式引擎、早期 UI 繫結)反覆咬人的問題。趁其他 UI head 尚未實作先遷移。\n\nBREAKING CHANGE: 記憶體 DataSet 欄名由大寫改小寫,JSON/MessagePack payload key\n隨之變小寫(如 SYS_ROWID → sys_rowid)。以字面大寫 key 讀取的 JS/TS 前端須改小寫;\nC# 端不受影響(DataColumnCollection 查找本就大小寫無關)。\n\n- DataTableExtensions.AddColumn:ToUpper →\n[…]\n / ObjectCaching 149);\n  SQLite 真 DB round-trip 通過(Bee.Db 209 / Bee.Repository 10)\n- 文件:ADR-029 + database-naming-conventions §6(雙語)+ plan 狀態更新\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(data)!: DataSet 欄名正規化為小寫(ADR-029,破壞性 wire 變更)",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-09T13:26:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c83d18606cb659c0c38b5436ba78a4717c0e5e98",
          "body": "大小寫敏感的名稱比對(早期 UI 繫結、運算式引擎)反覆咬人;確立欄名於定義/資料/\nUI 三層一律小寫 snake_case 為單一標準,從源頭消除整類問題。\n\n- docs/adr/adr-029-lowercase-field-names.md:拍板全層小寫(已採納);記憶體 DataSet\n  欄名對齊小寫為破壞性 wire 變更,執行見 plan\n- docs/database-naming-conventions.md(.zh-TW):新增 §6 跨層欄名一致性(雙語同步)\n- docs/plans/plan-dataset-lowercase-columns.md:遷移評估(Phase 0 稽核→決策→切換→\n  wire/前端→相容回歸);策略由 ADR-029 定為全小寫\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(naming): 立「欄名一律小寫」規則於命名規範 + ADR-029 + 遷移 plan",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-09T13:07:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "96821c04dec439ab226032035825c6d520051621",
          "body": "demo-smoke 於 Northwind Order 存檔抓到 -32000(InternalError):伺服器\nDynamicExpresso 拋 UnknownIdentifierException('quantity' / 'customer_rowid')。\n\n根因:DataTableExtensions.AddColumn 把欄名存成大寫(QUANTITY),BuildVariables 卻\n用 column.ColumnName(大寫)當變數名;運算式引用宣告的欄名(小寫 quantity),而\nDynamicExpresso 識別字區分大小寫 → 未知識別字。前後端共用 B\n[…]\nains 本就大小寫無關,\n寫回 row[field.FieldName] 不受影響。\n\n- 測試:Definition 902(+大寫欄名 ApplyComputedRow / ValidateRules 回歸)、\n  Avalonia 334(+大寫欄名 Recompute 回歸)\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(expression): 變數以宣告欄名為 key,修大寫 DataColumn 名致 UnknownIdentifier",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-09T12:33:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e2623195e2b55dadd8c32c1d22bef041a0fe6369",
          "body": "前修(string→Guid)用 Guid.Parse,但空字串 Guid 欄(未選的鍵、TEXT 型別空 GUID\n欄)→ Guid.Parse(\"\") → FormatException。造成:\n- client:recompute 的 BuildVariables 對空 Guid 欄拋 FormatException → RunGuarded\n  latch 停用預覽 → 「欄位沒即時運算」(不崩潰但從此不算)\n- server:同一空 Guid → 存檔 DoBeforeSave 無 guard → 未處理例外 → JSON-RPC -32000\n\n空/空白字串 Guid → Guid\n[…]\nBNull→預設值政策)。\n\n- 測試:Expressions 33(+空/空白 string→Guid.Empty、空 string→空 byte[])、\n  Avalonia 333(Northwind 重現改用空字串 product_rowid,斷言不 degrade + 有算)\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(expression): 空字串 Guid/Binary 欄 coerce 為預設值,修 Northwind 即時運算/存檔",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-09T12:18:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "71bbf88a12a7788f8797d78dffceb5680be04a21",
          "body": "demo-smoke 於 Northwind Order 明細抓到:ExpressionPolicy.CoerceValue 用\nConvert.ChangeType 轉 Guid,但 Guid / byte[] 非 IConvertible → 拋 InvalidCastException。\n後端未踩到(DB 直接回 Guid 型別);client 端 wire/SQLite 把 GUID 存 TEXT → 欄位值為\nstring,BuildVariables 對每欄 coerce(含運算式未引用的 Guid 鍵欄)時即崩潰。\n\n- ExpressionPolicy.CoerceValue:\n[…]\nueChanged handler 內弄壞表單\n- 測試:Expressions 30(+string→Guid / Guid→Guid / base64→byte[])、\n  Avalonia 333(+Northwind 重現:string 型別 Guid 鍵欄不使數值計算欄崩潰)\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(expression): CoerceValue 支援 string→Guid/byte[],修 client 即時運算崩潰",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-09T09:08:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "954578964924bcfbe953b815ab66bd61a048963f",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(expression): 更新 plan 狀態 — Phase 2 核心 5a–5d(A) 完成",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-09T08:52:20Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c925ae7b1c5783866bb6eb477c3df84572886127",
          "body": "實測 DynamicExpresso 在 reflection-only(IsDynamicCodeSupported=false,重現\niOS/WASM AOT)下正常:Expression.Compile 自動退回直譯器,計算欄/條件規則/\nDetectIdentifiers 全部正確 → 行動端/WASM 即時運算無需停用(見 plan AOT 段)。\n\ngraceful degrade(為客戶運算式撰寫錯誤,非 AOT):FormLiveComputation 對\nExpressionEvaluationException latch 停用預覽(IsDegraded),避免在 Fiel\n[…]\ne/ApplyDefaults/InitializeNewRow 包 try/catch degrade\n- 測試:Avalonia 332(+求值失敗不拋、IsDegraded、後續 no-op)\n\n5d-B(Northwind 明細金額 demo-smoke 端到端)待驗收時進行。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(expression): Phase 2 PR5d-A 行動端/WASM AOT 實測 + graceful degrade",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-09T08:44:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e7975b0c7731283f43279cd801aaaee44a2d297c",
          "body": "前端即時運算預覽的捨入與顯示位數對齊後端:計算欄依幣別/單位/公司位數捨入、\n金額/數量欄位依幣別位數顯示,取代 Tier 1 的框架預設位數。\n\n- ClientDefineAccess 加 GetCurrencySettingsAsync / GetUnitSettingsAsync(未部署回 null → graceful)\n- ClientInfo 快取 EnterCompany 回應的 CompanyInfo(原僅存 Capabilities、丟棄 Company),\n  ClearCompanyContext 一併清除\n- FormView.ResolveRoundingConte\n[…]\ntation(重算逐位)\n  與 GridControl / NumericEdit(display 逐位,Bind 前設定)\n- 測試:Avalonia 331(+Tier 2 BHD 3 位捨入)、UI.Core Company 快取、Api.Client 取設定 no-throw\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(expression): Phase 2 PR5c Tier 2 client 逐位對齊後端",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-09T08:39:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0cabf3044a2af80dc807653986fcf86947621a05",
          "body": "FormView 訂閱 FormDataObject.FieldValueChanged / RowAdded,經 FormLiveComputation\n即時重算計算欄並回寫。master 由 field editor 自動刷新;detail realized cell 不追蹤\nDataRow 寫入,故對應 GridControl 以 Dispatcher.Post(Background) RefreshRows(比照\n既有 in-cell 模式,避開編輯管線 re-entrancy)。\n\n- FieldValueChanged → Recompute(re-entrancy guard +\n[…]\nte-all,單一 guard 區段)\n- FormView 追蹤 detail grids(每次 Rebuild 重填,依 table name 對映)\n- 測試:Avalonia 330(+3 端到端接線:master 編輯重算 / NewAsync 預設 / detail 重算)\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(expression): Phase 2 PR5b Avalonia 即時運算綁定接線",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-09T08:20:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4e14dfb10c29a8865068cbf8e1f263eead89d44c",
          "body": "抽出後端 FormRuleProcessor 的純計算邏輯至 Bee.Definition.Forms.\nFormExpressionCalculator(鏡射 FormRowDefaults 的 schema 驅動 + DataRow +\n前後端共用前例),後端 FormRuleProcessor 瘦身為 adapter 委派,杜絕漂移。\n\n- Bee.Definition 加 Bee.Expressions 參考(無循環,Bee.Expressions 僅依賴 Bee.Base)\n- FormExpressionCalculator:全集合 pass(ApplyFieldExpressio\n[…]\nsions 參考 + FormLiveComputation 服務骨架\n  (相依圖快取 + re-entrancy guard + 計算欄自身不觸發 + Tier 1 框架預設位數捨入)\n- 測試:Definition 900、Avalonia 327、Business 250 全綠\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(expression): Phase 2 PR5a 共用 row-level 計算器 + 前端即時運算骨架",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-09T08:09:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1c40dae38d6146f27ac73a561530185e4835d8db",
          "body": "依 Avalonia 綁定層探勘結論,把 Phase 2 從設計要點擴寫為可開工規格:\n統一 hook 點 FormDataObject.FieldValueChanged、master 自動刷新 vs detail 需\nRefreshRows、client 捨入設定缺口與 Tier 1/2 分級、共用 row-level 計算器決策、\nre-entrancy 與 row-edit 壓制窗口、AOT 分級與 graceful degrade,及 5a–5d PR 切分。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(expression): Phase 2 前端即時運算執行級規格",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-09T07:37:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "281f6cdec9b5949a5bf1f7e5d0be81ff528c00cc",
          "body": "完成 plan-expression-rule-engine Phase 1d(文件 + 示範),並讓引擎支援 Guid:\n\n- 引擎:DynamicExpressoEvaluator 註冊 Guid 型別,讓驗證式可寫\n  `customer_rowid != Guid.Empty`(Guid 為值型別、無 IO 面)。+ 對應測試。\n- Northwind OrderBO 遷移(override Save → override DoBeforeSave):\n  - 明細 amount 改 ValueExpression(quantity * unit_price * (1 - discou\n[…]\nmd(設計決策)、\n  docs/expression-rules.md(客戶自訂運算式/規則指引)。\n\nPhase 1(後端)全數完成;Phase 2(Avalonia 前端即時運算)待做。\nBee.Expressions 27 測試通過;Northwind.Server 建置通過。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(expression): 文件 + Northwind OrderBO 遷移示範(PR4)",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-09T04:15:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a553cd933502ded8a1a62f8c98217f28564c0653",
          "body": "把運算式與規則引擎接進 FormBusinessObject 的模板方法,完成後端 schema 驅動的\n零 per-form 程式碼(plan-expression-rule-engine Phase 1c):\n\n- 新增 IFormRuleProcessor / FormRuleProcessor(Bee.Business):\n  - 預設值運算式(Added 列、僅空欄填)\n  - 欄位運算(Added/Modified 列,全精度求值後委派 NumberFormatResolver.RoundByKind\n    依 NumberKind 捨入;同列後續計算欄看得到前面結果,支援宣告順\n[…]\nRuleProcessor(singleton)。Bee.Business / Bee.Hosting\n  加 Bee.Expressions 參考。\n\n新增 FormRuleProcessorTests(10 通過);Bee.Business.UnitTests 全數 250 通過。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(expression): 規則處理器接入 BO 生命週期(PR3 step 2)",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-09T03:55:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0d5d175929b676b3b9970843e95cb94144102dc5",
          "body": "把 FormBusinessObject.Save / Delete 重構為模板方法,為規則引擎接入預留可覆寫的\n生命週期控管點(plan-expression-rule-engine Phase 1c 前置重構,行為不變):\n\n- Save = 編排層(AuthorizeSave / EnforceWriteScope / change-audit 固定不可覆寫)\n  + DoBeforeSave / DoSave / DoAfterSave 三個 protected virtual 覆寫點。\n- Delete = 編排層 + DoBeforeDelete / DoDelete / DoAf\n[…]\n no-op,DoSave/DoDelete base = 既有持久化。\n\n三段式控管點讓框架擴增功能落在編排層或特定 Do*,不與子類「override 整個 Save」\n互相打架。規則引擎於 step 2 接入 base DoBeforeSave / DoBeforeDelete。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(business): Save/Delete 拆為模板方法(PR3 step 1)",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-09T03:44:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e2259ea6f4e6ab6601743fbbd8f84cab986d90ed",
          "body": "自訂運算式與規則引擎的求值核心(plan-expression-rule-engine Phase 1b):\n\n- 新專案 src/Bee.Expressions(net10.0,只依賴 Bee.Base + DynamicExpresso.Core\n  2.19.3,無 server-only 相依),供後端 BO 與未來前端(Avalonia)共用同一引擎\n  與同一政策,確保前端預覽值 = 後端存檔值。\n- IExpressionEvaluator:Evaluate / Evaluate<T> / GetReferencedVariables 抽象。\n- DynamicExpressoE\n[…]\n策(FieldDbType→CLR、DBNull→型別\n  預設 0/空)。捨入不在此,PR3 於寫回時委派 NumberFormatResolver.RoundByKind。\n\n新增 Bee.Expressions.UnitTests(25 通過)。尚未接 BO 生命週期(PR3)。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(expression): Bee.Expressions 可攜共用求值引擎(PR2)",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-09T02:06:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f17c128d2465bc5237e848464342c72ca878a9b1",
          "body": "自訂運算式與規則引擎的定義層地基(plan-expression-rule-engine Phase 1a):\n\n- FormField 新增 ValueExpression(計算欄)、DefaultValueExpression(預設值運算式),\n  兩者為 [XmlAttribute] 純量、空值省略;並補入 Clone。\n- 新增 FormRule / FormRuleCollection / FormRuleTrigger:宣告式驗證與生命週期\n  guard(When 兩段式適用性 + Condition 驗證 + Message 中斷訊息,Trigger 首階段\n  BeforeS\n[…]\nyField。\n\nFormSchema 以 XML 為唯一傳輸序列化路徑(後端 XmlCodec.Serialize → 前端\nXmlCodec.Deserialize),測試聚焦 XML 往返 + 空值省略 + Clone 深拷貝。\n\n尚未接引擎與 BO 生命週期(PR2/PR3)。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(expression): 定義層運算式屬性與 FormRule 規則集合(PR1)",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-09T01:48:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1ed06342f060cbb80b116f1f473cc778def49c85",
          "body": "… 已涵蓋)\n\nGetRecordHistory 功能上等同 GetChangeLog 帶 ProgId+RowKey filter,明細兩者皆走\nGetChangeDetail,屬冗餘的便利包裝。套件未發佈、無外部使用者,故直接拔除以精簡\nAPI surface。單筆記錄歷程改用 GetChangeLog(帶 ProgId+RowKey)。\n\n移除:GetRecordHistory 合約(IGetRecordHistoryRequest/Response)、wire\n(GetRecordHistoryRequest/Response)、BO(GetRecordHistoryArgs/Resu\n[…]\n應測試。\n\nGetChangeLog 文件補明典型用法:某表單某期間、某人某期間、或單筆記錄(ProgId+RowKey)。\nAuditLog 軸方法數 10 → 9;BoApiSurface baseline、api-method-reference(+zh-TW)、plan 同步。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(audit): 移除冗餘 GetRecordHistory(GetChangeLog + GetChangeDetail…",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-08T09:15:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "942f2e320359cb7f958c3af39a428c6ce4c32f31",
          "body": "讀取側主體(情境 1–5、AuditLog 軸 10 方法)交付完畢,plan 整體狀態改 ✅。\n異常趨勢圖、權限強化、跨年 log_YYYY 聚合均為有需求再另案的延後項。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(plan): 稽核查詢讀取側標記完成(趨勢圖 / 權限強化 / 跨年聚合延後)",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-08T09:01:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "626150130c87f414ce893bed2805916b13379362",
          "body": "把異常從逐筆清單提升到監控用的彙總檢視(標準 GROUP BY,不碰 dialect 時間桶):\n\n- GetApiAnomalySummary(from,to) — st_log_anomaly_api GROUP BY anomaly_kind COUNT(*)\n- GetDbAnomalySummary(from,to)  — st_log_anomaly_db 同上(跨公司,表無 company)\n- GetTopApiMethods(from,to,topN) — GROUP BY method + MAX(elapsed_ms),ORDER BY COUNT(*) DESC 取前 \n[…]\n-safe\n- docs:api-method-reference(+zh-TW) +3;BoApiSurface baseline +3;plan Phase 3a 標記完成\n\n時間分桶「趨勢圖」(需 DateBucketBuilder dialect helper)留待有需求再做。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(audit): 稽核查詢 Phase 3a — 異常彙總(Summary + TopN)",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-08T08:47:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0c615c3a0b68efab93ba4008732819864e0b19b2",
          "body": "跨年年份分庫的讀取聚合移出本計畫範圍;Phase 3 收斂為「異常監控細分、權限強化」等\n有需求再做的進階項。同步更新階段表與 §3 Q4 決策紀錄。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(plan): 稽核查詢 Phase 3 移除跨年 log_YYYY 聚合(延後到有需求再做)",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-08T08:28:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1c67b525b5fbdc9270f7ac2961901e2a8c718fc0",
          "body": "沿用 2a 的 typed filter + 分頁基礎,補齊其餘四軸的清單查詢(純標頭、無 DiffGram):\n\n- GetLoginLog(st_log_login)      — time/user/event\n- GetAccessLog(st_log_access)    — time/user/progId/rowKey\n- GetApiAnomalyLog(st_log_anomaly_api) — time/user/method/anomaly-kind\n- GetDbAnomalyLog(st_log_anomaly_db)   — time/databaseId/anom\n[…]\ntch(四 action)、[DbFact] 真 DB 各軸過濾(SQL Server + PostgreSQL)\n- docs:api-method-reference(+zh-TW) +4 方法;BoApiSurface baseline +4;plan Phase 2b 標記完成\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(audit): 稽核查詢 Phase 2b — login / access / anomaly 清單",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-08T07:07:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "435db2ebb8498ab6104504be963522b1221059df",
          "body": "依討論把異動記錄查詢拆成「清單只回標頭 + 明細按需還原」,避免逐列還原 DiffGram\n(量體大、payload 爆)。change 軸現為三方法:\n\n- GetChangeLog(typed filter + 分頁) → 標頭 DataTable + PagingInfo(跨記錄清單)\n- GetChangeDetail(sysRowId) → 單筆 changes_xml 還原為結構化 before/after\n- GetRecordHistory 改為標頭清單(headers-only + 分頁),明細統一走 GetChangeDetail\n  (Phase 1 的「全還原」版與 R\n[…]\neById\n  (SQL Server + PostgreSQL)\n- docs:api-method-reference(+zh-TW) AuditLog 軸更新為三方法 + 清單/明細說明;\n  BoApiSurface baseline +2;plan Phase 2a 標記完成\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(audit): 稽核查詢 Phase 2a — change 軸清單/明細二段式",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-08T06:29:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7671b81d2d91cddec73298048d59e7c25f230a79",
          "body": "新增 AuditLog BO 軸(LogBusinessObject)與 GetRecordHistory(progId, rowKey):查詢單筆\n記錄的 st_log_change 異動歷程,伺服器端把 changes_xml DiffGram 還原為結構化欄位級\nbefore/after。稽核軌跡讀取側(寫入側項 0–4 已上線;見 ADR-027)。\n\n- 新軸接線:SysProgIds.AuditLog、LogActions、IBusinessObjectFactory.CreateLogBusinessObject、\n  JsonRpcExecutor dispatch 分支\n- \n[…]\neserved-names(+zh-TW) 登記\n  AuditLog progId、BoApiSurface baseline、plan Phase 1 標記完成\n\n資料夾用 AuditLog/(非 Log/)——.gitignore 的 [Ll]og/ 會整個忽略 Log/ 目錄。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(audit): 稽核日誌查詢讀取側 Phase 1 — GetRecordHistory + DiffGram 還原",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-08T05:51:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c5f0a6a28ce63b6ebc1329803f50e71450111cdd",
          "body": "稽核軌跡寫入側(項 0–4)完成後,讀取/查詢側另立 plan:\n記錄異動歷程 + DiffGram 還原、各 log 表列表查詢、異常監控;\n含查詢層形狀 / DiffGram 還原 / log DB 路由 / 權限 / 分頁等待定案點與三階段。\n母計畫加指向連結。待逐項定案後實作。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(plan): 稽核日誌查詢(讀取側)plan 草稿",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-08T04:34:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3ed6a24856d2640eb67c6855975832e2300a2965",
          "body": "把散在 plan-audit-* 的關鍵決策收斂成長存的 ADR:背景(log 分類原為空、\nTracer 屬 dev-time、DbAccessAnomalyLogOptions 原無消費者)、7 項被否決的替代方案\n(執行記錄全記 / EAV 預設 / outbox / Tracer 作稽核 / user_rowid 正規化 /\nAPI+DB 合表 / DbAccessFactory 直接注入循環相依)、7 項核心決策(D1–D7)與後果。\nframework-reserved-names §1.3 加指向 ADR-027 的連結(英/繁)。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(adr): ADR-027 資料軌跡 / 稽核日誌(六軸 st_log_* 設計)",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-08T04:15:16Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1584b1f657cc76b5d424336fae24e0674913a615",
          "body": "稽核軌跡六軸完成後,同步各公開文件(英/繁雙語):\n\n- database-settings-guide:log 分類「典型表」由「視應用而定」改列 5 張 st_log_*\n  (事實修正);澄清 opt-in 稽核表與 single-tenant 可略過 log 的前提;情境圖具體化一次\n- terminology:日誌章節補 IAuditLogWriter / AuditEntry / AuditColumn / NullAuditLogWriter\n  / 各 entry / AuditLogOptions;列舉補 LoginEvent / ChangeKind / AnomalyKi\n[…]\nnaming-conventions:點名 st_log_* 日誌表子群與 log 分類\n- architecture-overview §12:新增 audit trail 為框架能力\n- api-method-reference:新增「稽核副作用」小節(哪些方法寫哪張 log 表)\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: 同步稽核軌跡至公開文件(log 表 / 型別 / 命名 / 架構 / API 副作用)",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-08T04:11:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7c81839ee6574d27aaf6ebb35f9d85e0a8ab2e8c",
          "body": "呼應「log 分類原為空」的缺口——稽核軌跡六軸完成後,log 資料庫現有:\nst_log_login / st_log_change / st_log_access / st_log_anomaly_api / st_log_anomaly_db。\n§1 引言補上 log 資料庫、新增 §1.3(opt-in、自足去正規化、可依年份分庫)。英/繁雙語同步。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(reserved-names): 登記 log 分類 5 張 st_log_* 稽核表",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-08T03:34:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e70fc824e2f8ad4bf30e1aca690be81f62eabf97",
          "body": "軸④/⑤異常記錄(取代原「執行記錄全記」與「系統/錯誤」),opt-in、best-effort:\n\n- 兩表兩視角:st_log_anomaly_api(method + who)、st_log_anomaly_db\n  (database_id + command,精簡無 who —— DbAccess 無 session)\n- AnomalyKind(Error/Timeout/Slow/LargeAffected/LargeResult)、ApiAnomalyEntry、DbAnomalyEntry\n- AuditEntry 重構:抽出可覆寫 AddCommonColumns(向後相容\n[…]\n\n四個 anomaly [DbFact];DefaultsTests 27→29、TableSchema 14→16。\n本機實跑真實 DB(5 方言)全綠,audit [DbFact] 10/10。\n\n設計與決策見 docs/plans/plan-audit-4-anomaly.md。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(audit): 異常記錄(項 4)— API/DB 分表 st_log_anomaly_api/db",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-08T03:21:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f49c79c50450f3cece9524ab372580258b639d32",
          "body": "- 系統/錯誤本質是 observability(維運/除錯),非業務資料軌跡:\n  歸 ILogWriter / host ILogger(檔案/Seq/APM),不建 st_log_trace 稽核表。\n  對齊 SAP SM21 / Odoo ir.logging 與業務稽核分離的定位。\n- 修正先前「ITraceWriter → st_log_trace」的誤用:Tracer/TraceContext 是\n  開發階段偵錯執行流程用,不可作為稽核來源。\n- 索引重整:移除系統列、執行記錄遞補為項 4(暫緩,範圍待決定)。\n\n稽核軌跡主體已交付:登入(①) / 異動(③+安全⑥) / 檢視(②)。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(audit): 軸⑤系統/錯誤移出稽核範圍、修正 Tracer 定位",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-08T00:49:26Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "703669e4a72d57be59627270a9f7f341b87a113f",
          "body": "軸②檢視記錄,opt-in + best-effort:\n\n- st_log_access(log 分類):共通欄 + prog_id + row_key,record-level 不記欄位\n  (一次 GetData 明細檢視=一列:誰看了哪筆)+ row_key 索引\n- AccessAuditEntry\n- FormBusinessObject.GetData:檢視成功後記一筆(AccessEnabled gating);只掛 GetData,\n  GetList 清單不掛(量體)。目前全記所有表單,未來加 per-form 稽核規則\n- 重構共用 ResolveAuditIdentit\n[…]\n視升為項 3\n\n測試:AccessAuditEntry 欄位、st_log_access [DbFact] 端到端;\nDefaultsTests 數量 26→27、TableSchema 13→14。\n\n設計與決策見 docs/plans/plan-audit-3-access.md。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(audit): 檢視記錄(項 3)— st_log_access 與 GetData 埋點",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-07T15:40:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1bd5cdd1c1342c7a64f2dba45324c11f8a1c264f",
          "body": "軸③異動記錄(含軸⑥安全旗標),採 DataSet DiffGram 單表 + best-effort 非同步:\n\n- st_log_change(log 分類):共通欄 + prog_id/table_name/row_key/change_kind/\n  is_sensitive + changes_xml(DiffGram,master+detail 新舊值全含)+ row_key 索引\n- ChangeAuditEntry / ChangeKind\n- FormBusinessObject.Save:repository.Save 前 GetChanges() 擷取、commit 後 \n[…]\n位、DiffGram round-trip(驗證新舊值保留)、\nst_log_change [DbFact] 端到端;DefaultsTests 數量 25→26、TableSchema 12→13。\n\n設計與決策見 docs/plans/plan-audit-2-change.md。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(audit): 異動記錄(項 2)— st_log_change 與 DataSet DiffGram",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-07T14:45:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "73954e74a89d4e6995d706c796aa35244bf97e11",
          "body": "項 1 在 log 分類新增 st_log_login,SharedDatabaseState 因此會 provision log DB。\nCI 原僅建立/授權 common + company;MySQL 的 testuser 對 log 無權限,\n碰到 log 即 Access denied → 整個 MySQL setup 中止,連帶 NorthwindSeed /\nUserCompany 等 MySQL 測試失敗(common/company 未 seed)。\n\n比照 company 補建 log:\n- SQL Server / PostgreSQL:建 log DB(idempotent;兩者 testuser 本就有建庫權)\n- MySQL:root 建 log DB + GRANT testuser(關鍵修正)\n\n其他方言(SQLite / Oracle)本就正常。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: 為 log 測試資料庫補建 + MySQL 授權(st_log_login 落地)",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-07T09:27:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8af30ee0204e6b0fff5bc2e61b28d4d048a4f17e",
          "body": "軸①登入記錄,第一個實際使用 IAuditLogWriter 的軸:\n\n- st_log_login(log 分類)+ DbCategorySettings 註冊(Defaults + tests/Define)\n- LoginAuditEntry / LoginEvent(成功 / 失敗 / 鎖定 / 登出,列舉自帶結果,無 result 欄)\n- SystemBusinessObject.Login/Logout 四出口埋點,Services escape-hatch 取 writer、\n  Enabled + LoginEnabled gating(不改 ctor、不影響 Authent\n[…]\nernal static,供 [DbFact] 端到端寫入讀回驗證\n- .gitignore 放行 TableSchema/log/(通用 [Ll]og/ 規則誤傷 CategoryId 命名的資料夾)\n\n設計與決策見 docs/plans/plan-audit-1-login.md。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(audit): 登入記錄(項 1)— st_log_login 與 Login/Logout 埋點",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-07T08:38:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "abbff6fc512c98390613d228f5d3a77b34698e02",
          "body": "資料軌跡日誌的共用基礎設施,六軸日誌的前置工作項:\n\n- Bee.Definition.Logging:IAuditLogWriter / AuditEntry / AuditColumn / NullAuditLogWriter\n- AuditLogOptions(預設關閉,opt-in)掛入 BackendConfiguration\n- Bee.Hosting.Audit:AuditLogDbSink(落固定 log DB + 檔案 fallback)、\n  背景 AuditLogWriterService(bounded channel,滿載退化同步)、SynchronousAuditL\n[…]\nroundWriter 註冊;停用時走 NullAuditLogWriter(零回歸)\n- 單元測試:共通欄位組裝、滿載退化同步不丟失、背景 drain\n\n設計與排程見 docs/plans/plan-audit-trail.md、plan-audit-0-foundation.md。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(audit): 日誌基礎設施(項 0)— IAuditLogWriter 與背景寫入",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-05T15:42:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2f37c94b79eb49ad9ead43f2b7d971b23acac430",
          "body": "一輪掃描所有公開文件(docs/、各 src README、ADR)與程式碼的落差,\n修正因多波重構未同步的過時引用,並補齊缺件。均為文件更新,唯一程式碼\n變更為 SQL Server 預設約束命名對齊全小寫慣例。\n\n文件(雙語成對):\n- src README:*Func→Utilities/Extensions、RepositoryInfo(已刪)、\n  *Provider→*Factory、CacheFunc→ICacheContainer、RemoteDefineAccess→\n  ClientDefineAccess、LocalDefineAccess→CacheDefineAcce\n[…]\n→df_(對齊 snake_case 全小寫\n  慣例;drop 靠 sys.default_constraints 動態查找,不依名字,零相容風險)\n- 對應 2 個測試斷言更新\n\n驗證:Bee.Db.UnitTests Release 1398 passed / 0 failed。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: 全面校正文件與程式碼一致性,並修正 df_ 約束命名大小寫",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-05T04:42:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a81216ba3910b2a05914d9b73d1cd881ed9c81aa",
          "body": "兩個問題:\n1. 預設 Cost.Read 未勾 → 單價欄依設計被藏,導致「一打開看不到單價」的\n   反教學。改為預設全授權(完整表單),取消勾選才觀察降級。\n2. root 用水平 StackPanel(無界寬度)可能讓明細 DataGrid 鋪不開欄位。\n   改為 Grid 兩欄(左 Auto 授權面板、右 Star 表單),DataGrid 取得有界\n   寬度、正常排所有欄。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(democenter): 權限模擬器預設全授權 + Grid 版面,明細欄位正常顯示",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-05T03:03:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7da0bece39d1babab8c72217462cd5abfd8738c8",
          "body": "欄位權限範例擴充為 master-detail:主檔敏感欄(承辦人身分證=PersonalData)\n示範 隱藏/唯讀/可編輯 三態;明細用真實 GridControl,敏感欄(單價=Cost)\n無 Read 時整欄隱藏——展示 ResolveField 帶明細表名反查 SensitiveCategory。\n\n明細以 in-memory FormDataObject + GridControl 綁定(沿用 SampleFormData 模式),\ncapability 在 bind 前套到 layout 欄位(inline 複製 LayoutCapabilityApplier,\n因其為 lib internal)。仍純前端、不需後端。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(democenter): 權限模擬器改為主檔/明細,示範明細 Grid 敏感欄降級",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-05T02:52:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bf595f4d4cce286d9705e57d8b79581cff57b004",
          "body": "放寬「主表最多一個 Owner、一個 Dept 欄」限制——某些單據一筆資料合理\n屬於多個部門/擁有者(如調職單的調出/調入部門,兩邊主管都要看得到)。\n\n- FormTable 新增 GetOwnerFields()/GetDeptFields()(回全部;保留單數版為\n  first-match 便利方法,向後相容)\n- ScopeResolver 改為對所有標記欄取扁平 OR 聯集:\n  Own = 各 owner 欄 IN 身分;Dept/DeptAndSub = 各 dept 欄 =/IN 子樹,再 OR Own\n- PermissionBindingValidator 移除 \">1\n[…]\nner/Dept 報錯\" 上限\n- 讀取與寫入 re-query 共用同一 ResolveFilter,故兩側一致\n- N=1 行為與先前完全相同(既有 ScopeResolver 測試全數不變通過)\n- 測試:多 Dept OR 聯集、多欄 validator 放行;雙語文件同步更新\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(permission): record scope 支援多個 Owner/Dept 欄(OR 聯集)",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-05T02:37:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "92cae0c356b15132694787e4f3aed47cf6523102",
          "body": "DemoCenter 新增「權限 Capability」類別的互動模組:左側勾選模擬 EnterCompany\n會回傳的 capability 快照,右側「採購單」表單即時降級——無權命令按鈕隱藏、\n敏感欄依 Read/Update 呈現 隱藏/唯讀/可編輯 三態;關掉「啟用」→ 快照 null\n→ 全放行。\n\n不需後端:capability 快照就是一個 Dictionary,demo 在記憶體手工造,餵給\n與正式 View 相同的 ElementCapabilityResolver / PermissionScope。純 UX 示範。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(democenter): 新增互動權限模擬器(前端 capability 範例)",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-04T16:19:22Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "19645c503ec7a40d7325310061e1b65957e43acf",
          "body": "欄權限本就分兩個獨立子 gate:Read 管可見、Update 管可編輯,所以能表達\n「看得到成本、但不能改成本」。文件把這個區分補成一等公民:\n\n- 總表欄權限列改為「隱藏(無 Read)/ 唯讀(無 Update)」\n- 第 9 節加三態表(隱藏 / 唯讀 / 可編輯)並舉成本為例\n- 修正授權範例:編輯需同時授 Read + Update(只授 Update 會被隱藏)\n- 雙語同步\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(permission): 明示欄權限的檢視 vs 編輯兩個子 gate",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-04T15:59:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "706837aed6091566b606430ed8fdd4ebc3701dd7",
          "body": "原總表把「動作=後端、欄=前端」切割得太乾淨,低估了動作權限也會投影\n到前端決定工具列命令/按鈕狀態。改為「三維度 × 兩把關點」框架:\n\n- 動作維度:後端權威 gate + 前端按鈕/命令狀態(兩處都套用)\n- 列維度:僅後端\n- 欄維度:僅前端(UX,非資料邊界)\n\n- 總表改為 後端 / 前端 兩欄,動作列兩處皆 ✅\n- Part 2 標題改為「動作命令 + 欄權限」,明示前端呈現兩個維度\n- ADR-019 對應段落同步;雙語同步\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(permission): 釐清動作維度同時套用於前端(三維度 × 兩把關點)",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-04T15:55:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ec22ec6ef1cf08ec0f133e0e325a6d20d1910ef8",
          "body": "把公開權限指南從「兩層」重構為「三維度」框架,並將已完成的前端\ncapability(欄權限)正式納入文件;ADR-019 非目標段落轉正。\n\n- 動作權限(後端權威)、列權限(後端權威)、欄權限(前端 UX 降級)\n- 新增第二部分:敏感欄位標記、well-known 分類 model、capability 快照\n  如何搭 EnterCompany 到前端、client 如何降級、host opt-in 接線\n- 明確警語:欄權限是 UX、非資料邊界(後端未遮罩敏感欄值)\n- 雙語同步(.md / .zh-TW.md);ADR-019 前端 capability 標記 ✅ 已實作\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(permission): 權限指南重構為三維度,補齊前端欄權限(capability)",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-04T14:44:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7d80485458e95e6e3a3e528196a1c75ac811fae1",
          "body": "detail Grid 與 master 同屬一個 aggregate:明細列能否編輯應跟隨表單編輯\n模式(AllowEdit),而「能否進入編輯」已被主 model 的 Create/Update 在\n工具列命令擋掉。對 Grid 動作再套一次 capability 是多餘且概念錯位。\n\n- 移除 IElementCapabilityResolver.ResolveGridActions 與其實作\n- LayoutCapabilityApplier.ApplyGrid 只保留敏感欄位(column)降級,\n  不再改 LayoutGrid.AllowActions\n- 移除對應 resolver 測試(保留敏感欄位判定)\n\nGrid 內敏感欄位(如明細單價/成本)仍依 SensitiveCategory 降級——那是\n資料分類,與 aggregate 編輯權正交。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(permission): 移除 Grid 動作 capability 降級(改由表單模式驅動)",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-04T14:27:45Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "42cecad40ea5b4f9212367031f22ad46c2352f65",
          "body": "搭 EnterCompany 這班車把 per-model action mask 快照送到前端,零額外往返;\n前端以 opt-in 方式降級工具列命令、Grid 動作與敏感欄位。安全邊界仍在後端。\n\n- 後端:CompanyRolePermissions.GetAllowedByModel 算 per-model mask;\n  EnterCompany 填 EnterCompanyResult.Capabilities,經 ApiOutputConverter\n  自動 copy 到 EnterCompanyResponse.Capabilities([Key(101)],三棲序列化)\n-\n[…]\nnterCompany MessagePack 5 全綠;Avalonia 320 無回歸。DB 綁定的\nEnterCompany 整合測試待 CI(本機無 docker)。\n\nRefs docs/plans/plan-permission-capability.md, ADR-019\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(permission): 前端權限 capability(element 細粒度降級,Avalonia 消費端)",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-04T13:13:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9709f8ebe0db4820074e673ff0492fc17a458352",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(docs): 封存已完成 plan-sqlserver-datetime2 至 docs/archive",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-03T14:04:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "282b1a507ff58ea9e8789b82d51231eee0e8b4e8",
          "body": "KeyCollectionBase / Dictionary 原用 CurrentCultureIgnoreCase、StringHashSet\n用 InvariantCultureIgnoreCase,三者不一致。這些集合裝的是識別碼(欄位名、\nProgId、表名、property key),文化相依比較會踩 Turkish-I 問題——tr-TR 地區\n設定下 \"ID\" ≠ \"id\",使同一份序列化定義在不同 server 地區行為不一致。\n\n統一改為文化無關的 OrdinalIgnoreCase(最快、無 Turkish-I),並連同\nStringUtilities.IsEquals(KeyCollectionItem 的 key 變更判斷所依賴)一併由\nCurrentCulture 收斂為 Ordinal。對現有 ASCII key 零行為變化。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(base): string key 不區大小寫比較統一收斂為 OrdinalIgnoreCase",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-03T02:06:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8626fdde0df5753af72eceac911774435a2d3709",
          "body": "前一 commit 把 DbTypeMapper.Infer 全域改為 DbType.DateTime2,導致 PostgreSQL /\nOracle 的 Northwind seed 在 CI fresh 容器上回歸(Npgsql 對 Kind=Utc 值在\nDateTime2 下解析型別改變、seed 交易 rollback → 0 rows)。本機因 shared DB 留有\n舊 seed 資料未重現,CI fresh 容器才炸。\n\n正解:DbTypeMapper.Infer 還原為 DbType.DateTime(跨 provider 行為與改動前一致),\n改在 provider-aw\n[…]\nion timezone 影響而脆弱的 PG round-trip 測試(PG/Oracle DateTime 寫入已由\nseed 測試覆蓋);新增 NormalizeDbType 的 SQL Server-only 改寫與非 SQL Server\npass-through 單元測試。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(db): datetime2 參數改寫改為 SQL Server-only,修 PG/Oracle seed 回歸",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-03T00:56:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7df805f4dde72428f79b39d88fe7b428cb33b946",
          "body": "對齊 .NET DateTime 的精度(100ns)與範圍(0001~9999)。三處改動:\n\n- SQL Server dialect:DDL 輸出 [datetime2](7);reverse-map 認得 datetime2\n  並讀入 fractional-seconds scale;預設值剝括號涵蓋 datetime2。\n- comparer:DbField.Compare 對 DateTime 加 scale 正規化(未設→canonical 7),\n  既有 datetime(scale 3)與 datetime2(scale 7)差異 → 下次 upgrade 自動\n  in\n[…]\n 拋 SqlDateTimeOverflow。\n\n測試:SQL Server 亞毫秒 round-trip、pre-1753 範圍、datetime→datetime2 升級路徑;\nPostgreSQL 微秒 round-trip 驗證跨 provider 無回歸。全 repo 綠燈。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(db): SQL Server DateTime 由 datetime 遷移至 datetime2(7)",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-02T16:43:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "23b328039a8f64fde78d14b98087ba459db8ac63",
          "body": "CHANGELOG 雙語 + docs/changelogs/4.13.0 明細檔(中英),版本號\n4.12.1 → 4.13.0(Directory.Build.props Version/AssemblyVersion/FileVersion)。\n\n本版新增內容(Added-only、零 breaking):\n- Bee.Definition:NumberKind 語意 + NumberFormatResolver/Applier(round-then-sum、\n  兩層捨入、bake-on-clone)、CurrencySettings(TCURX)/UnitSettings(T006)\n[…]\n幣別/單位感知 + 混幣合計 helper\n\n設計理由見 ADR-026(已於前一 commit 落地)。\n\n驗證:Release build 0 警告 0 錯誤;15 test 專案全綠(4 DB 容器整合測試含\nSQLServer/PostgreSQL/MySQL/Oracle)。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): 4.13.0 — ERP 數值層(NumberKind + 多幣別 + 計量單位)",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-01T15:53:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2dd7aa4324bdca4a8e585d7b0fedb26b2c816568",
          "body": "封存 numeric 系列 plan 後,development-cookbook §Numeric Semantics 兩處\n「signed-off contract」連結指向 docs/plans/(已移至 gitignored docs/archive/)\n成為死連結。新增 ADR-026 收斂 6 個架構決策(NumberKind 語意、round-then-sum、\n兩層捨入、Preserve 不回寫、貨幣/單位 runtime 解析、DB scale 正交容量上限)與\n拒絕的替代方案,作為對外穩定引用目標;cookbook 兩處改指向 ADR-026。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(adr): 新增 ADR-026 數值語意/捨入決策 + 修 cookbook 死連結",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-01T14:56:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6a1ff22f8ccbb5890b54e5ff0c8ad3ed2ffc896d",
          "body": "移至 docs/archive/(gitignored),從 docs/plans/ 移除。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(plans): 封存 numeric 系列 plan(core/multicurrency/uom/formatting 全數已完成)",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-01T13:52:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "623d59d8e7f27951636b92f62f882ea04a0a6e02",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(plans): plan-numeric-formatting 增量表格 core 補標已完成(3/3 全綠)",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-01T13:51:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "eb10bc0c9b93f26b0bccb2f71b9324ced9f7dc9b",
          "body": "…icEdit 單位感知\n\n數值處理三增量收官。完全鏡像 multicurrency,且無 DB/CompanyInfo/st_company 異動\n(單位純 per-列、無公司層或主檔概念)。\n\n階段 1(定義):\n- UnitSettings : MessagePackCollectionBase<UnitItem>(UnitItem [Key(100+)]\n  Code/Decimals(直存)/Dimension/Name;GetDecimals 直查 fallback 0)。IDefineStorage\n  雙模式全套仿 CurrencySettings(DefineType/Fil\n[…]\naseFormatter 走 MessagePack\nposition-based ctor 解析,順序不符會對調 Dimension/Name)——已修並記為慣例。\n\n測試:Definition 860、Api.Core 314、Avalonia 320,全 15 test 專案綠。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(numeric): 計量單位增量 3/3 — UnitSettings(T006) + UNIT 綁定 + Grid/Numer…",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-01T06:09:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "adb85727ca76297b54b96088f947800e3c42eed7",
          "body": "…幣合計 helper + DemoCenter\n\n數值處理增量 2/3 的 UI 層(Avalonia)。三階段全數完成。\n\n- GridControl:per-instance CurrencySettings + DefaultCurrencyCode 屬性(null=關閉\n  幣別感知、退欄級 baked 格式,向後相容)。新增 FormatCellForColumn:金額欄逐格讀\n  row[CurrencyField](該列 CUKY 值)→ ResolveFormat(Amount, ctx, code),空退\n  DefaultCurrencyCode;三個顯示呼叫點改走它,靜\n[…]\nD 位數、列幣別空退預設、無 CurrencySettings\n  退 baked、幣別勝 baked;NumericEdit 依幣別;AmountColumnSummary 混幣/同幣/本幣。\n  全 15 test 專案綠(Avalonia 314、Definition 831)。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(numeric): 多幣別階段 3 — Grid per-cell 幣別感知 + NumericEdit runtime + 混…",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-01T05:02:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4ccb27b2c438162a3a4d06d7abab7ec2154d5f07",
          "body": "數值處理增量 2/3 的邏輯層。擴既有 resolver 入口、不另起。\n\n- RoundingContext{Company, CurrencySettings}(uom 增量再加 UnitSettings)。\n- NumberFormatResolver 加 currency-aware overload ResolveDecimals/ResolveFormat/\n  RoundByKind(kind, ctx, refCode):Currency 源以 refCode(CUKY 欄幣別)查\n  CurrencySettings.GetDecimals;refCode 空退公司 Defa\n[…]\n-currency」節。\n- 測試:USD/JPY/BHD 位數、round-then-sum 不變式、現金捨入 0.05+diff、本幣、\n  Preserve、fixture 全鏈 GetCurrencySettings。全 15 test 專案綠(Definition 831)。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(numeric): 多幣別階段 2 — resolver 幣別感知 + 兩層捨入 + 本幣 + ship client",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-01T04:42:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "86a77f392ca63b447c1091a5a9b34b2efe58863c",
          "body": "數值處理增量 2/3 的定義層。相依 core(增量 1/3)已定慣例。\n\n- CurrencySettings(系統層幣別主檔,SAP TCURX 式):MessagePackCollectionBase<CurrencyItem>,\n  Code/Numeric/Rounding/Symbol/Name;GetRounding/GetDecimals(因子反推)。走 IDefineStorage\n  雙模式(DefineType/File+Db storage/PathOptions/CurrencySettingsCache/ICacheContainer/\n  CacheDefineA\n[…]\n三棲;CompanyCashRounding/AllowedCurrencies;\n  CompanyInfo 多幣別 XML+MessagePack round-trip;CurrencyField 序列化/Clone/傳遞;\n  Defaults 載入。全 15 test 專案綠。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(numeric): 多幣別階段 1 — CurrencySettings + CUKY 綁定 + 公司本幣/現金捨入/可用幣別",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-01T04:15:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ea596f8a3dd4ac88e1d3099c96b512ed947215f5",
          "body": "core 完成後,把 multicurrency 新 session 必須沿用、勿重推導的既成事實收斂成\n一段接手指引:MessagePackCollectionBase(非 KeyCollectionBase)+ 顯式註冊\nformatter、DecimalsSource 終版四值於 NumberFormatResolver 擴充、CompanyInfo\nKey(5)~(7) 編號、新 _xml 欄 NOT NULL + 補齊 hand-written INSERT、IDefineStorage\n雙模式接點清單、bake 分工、Grid 逐格化、本機 ALTER 遮蔽 NOT NULL 的驗證雷。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(plans): plan-numeric-multicurrency 加「接手指引」(core 已定慣例)",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-01T03:24:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e9ff1ec94872123e4f2b7c38f604ef125fccc6be",
          "body": "執行增量 1/3(plan-numeric-core.md 階段 3,核心增量完成):\n\n- ControlType.NumericEdit;LayoutColumnFactory 對 Short/Integer/Long/Decimal/Currency\n  的 Auto 解析為 NumericEdit\n- NumericEdit(繼承 TextEdit):focus 顯完整精度、blur 依 NumberFormat 格式化、\n  GetWriteBackValue 解析後回寫完整精度(顯示捨入不回寫)、右對齊、無效輸入保留前值\n- TextEdit 抽 GetWriteBackValue\n[…]\ntion.Collections)\n\n驗證:full build 綠;Definition 781、Avalonia 302 測試綠;DemoCenter 建置 0 錯誤\n(samples 不觸發 CI,需 -c Debug 目視)。plan-numeric-core 三階段全部完成。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(numeric): 數值處理核心階段 3 — NumericEdit + Grid 格式化 + DemoCenter",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-01T03:15:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7e9ff07e34aafab2135a1b29c76433684de5a8a0",
          "body": "彙整原本只散在程式碼註解與已封存 plan 的跨方言 DDL 規則與例外,供框架使用者查閱:\n- §1 文字/數值欄為何預設 NOT NULL(設計原由:省去應用碼與 SQL 的 null 處理)\n- §2 各方言內建預設值運算式對照(String/numeric/Date/DateTime/Guid)\n- §3 兩個硬性例外:Oracle ''=NULL(String/Text nullable)、MySQL TEXT 不能 DEFAULT\n  (hand-written INSERT 必須帶值;含本機 ALTER 遮蔽、CI fresh-CREATE 重現的說明)\n- §4 識別符引號與大小寫、§5 AutoIncrement 語法、§6 ALTER vs 重建\n- §7 跨方言新增欄位檢查清單\n\n於 docs/README(.zh-TW).md 索引登記。docs 變更不觸發 CI。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(db): 新增資料庫方言差異(DDL)公開文件(中英雙語)",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-01T02:50:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5f887582545edb0f0a5364fd105e6e6e2f9ac53f",
          "body": "…ten INSERT\n\n還原前一 commit(c8433c30)把欄位改 nullable 的錯誤做法——違反框架 AllowNull\n原則(文字欄 NOT NULL 預設空字串,只有 DateTime/二進位等特定型別才可 null,以\n減少呼叫端對 null 的額外處理)。\n\n正解:欄位維持 NOT NULL;MySQL 底層 DDL 對 TEXT 型別 AllowNull=false 本就不輸出\nDEFAULT(MySqlSchemaSyntax.GetDefaultExpression 已如此,MySQL TEXT 不能帶 DEFAULT),\n故呼叫端 INSERT 必須顯式提供值\n[…]\nesh-CREATE 的 NOT NULL),故手動 ALTER MODIFY 為 NOT NULL 重現 CI,\nRepository MySQL 10/10、Db NorthwindSeed 5/5、Business EnterCompany/Lifecycle 15/15 全綠。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(numeric): st_company.number_formats_xml 維持 NOT NULL,改補齊 hand-writ…",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-01T02:16:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c8433c3089f75aaaf043e3336de5a19c7cc24dde",
          "body": "CI 失敗根因:number_formats_xml(DbType=Text)預設 NOT NULL(DbField.AllowNull\n預設 false)。MySQL TEXT 欄無法帶 DEFAULT,故 NOT NULL 下任何省略此欄的 partial\nINSERT 在 strict mode 直接報 \"Field 'number_formats_xml' doesn't have a default\nvalue\"。其他 dialect 對 NOT NULL 字串欄有隱式空字串預設、MySQL TEXT 沒有。\n\n觸及的 partial INSERT(hand-written test\n[…]\n AllowNull=\"true\"(兩份 schema)。此欄為 Text 型\n「常態為空」optional payload,nullable 是合理例外(同 Oracle ''=NULL 一類);\nCompanyRepository 已對 NULL/空字串 fallback 為空表。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(numeric): st_company.number_formats_xml 改 nullable(MySQL CI 修正)",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-01T01:50:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8abffecec5150e401c1167f25c15b9e5e6fd5d38",
          "body": "…CI 修正)\n\nCI 失敗根因:此測試 fixture 的 CompanyRepository 固定走 DbCategoryIds.Common\n(bound 至 SQL Server 的 common DB,見 SharedDatabaseState),DbFact 的 dbType\n參數其實被 repo 忽略(既有 Enabled/Disabled 測試以 `_` 收)。故 per-dialect\n以 NewDbAccess(GetDatabaseId(dbType)) 寫入 common_{dbtype} 的列,repo 從\ncommon(SQL Server) 讀不到 → GetBy\n[…]\nts_* DbFact 與其 helper。覆蓋不減——\n- 空欄→空表反序列化:GetById_Enabled_*(5 DB)已加 Assert.Empty(NumberFormats)\n- 填值 XML 反序列化:CompanyInfoTests 單元 round-trip 已覆蓋\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(numeric): 移除 CompanyRepository per-dialect number_formats DbFact(…",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-01T01:40:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bebf2cdd99e262673124a809a90eba2b90fa0607",
          "body": "執行增量 1/3(plan-numeric-core.md 階段 2):\n\n- NumberFormatResolver(Bee.Definition):ResolveDecimals / ResolveFormat /\n  RoundByKind。Round=AwayFromZero 捨到解析位數、Preserve 原值返回;\n  SystemFixed(匯率)忽略公司覆寫用框架預設,Company/Currency/Unit 退 company\n  (core 無 currency/unit settings,兩源暫退 company)\n- NumberFormatApplier.Bake\n[…]\n、bake 時機、DB scale 為容量上限)\n- Definition 778 測試全綠(+round-then-sum 不變式、公司 A/B 位數不同、explicit 優先、\n  不污染快取);GetFormSchema/GetFormLayout round-trip 無回歸\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(numeric): 數值處理核心階段 2 — 交付 bake + round-then-sum",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-01T01:10:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1d5f6ac72bc64c60d28c3f3bc5b42edc7223469b",
          "body": "執行增量 1/3(plan-numeric-core.md 階段 1):\n\n- NumberKind / RoundingPolicy / DecimalsSource enum + NumberKindProfile\n  (取代孤立且 0 production caller 的 NumberFormatPresets)\n- CompanyNumberFormats 公司位數覆寫表(MessagePackCollectionBase,非 KeyCollectionBase\n  —— CompanyInfo 走 wire、resolver 只認前者);CompanyInfo [Key(4)] N\n[…]\n默出空)\n- NumberKind 契約表拍板;build 0 warn/err、Definition(759) + Api.Core 非 DB 測試全綠\n  (CompanyRepository 5-DB round-trip 為 DbFact,本機無 docker 自動 skip)\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(numeric): 數值處理核心階段 1 — NumberKind 語意型別 + 公司位數模型",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-07-01T01:01:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2b9b34b52c6846188f6ebe8cc366d6af97228acc",
          "body": "回到 🚧 核心完成狀態;待 iOS 實機驗證後再決定封存。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(plans): 還原 plan-mobile-release-trim-safe(iOS 實機 AOT 待確認,暫不封存)",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-06-30T14:28:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4bc5bbd8c223660864d3a392d647447a4cb43b1a",
          "body": "… 序列化已驗證)\n\n核心已完成:descriptor 內嵌 Bee.Definition 解半 A、iOS 半 B 免實機驗證通過;\niOS 實機 AOT run 為低風險形式收尾(需 Apple Developer 簽章+實機,另案)。\n移至 docs/archive/(gitignored)。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(plans): 封存已完成 plan(mobile-release-trim-safe,行動端 Release trim/AOT…",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-06-30T14:27:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0e4a6052d6b63fa5c68773a5cd70be8e4792f95a",
          "body": "…4.12.1)\n\n移至 docs/archive/(gitignored),plans/ 僅保留進行中與待做 plan。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(plans): 封存 4 個已完成 plan(northwind android/ios/graduation、release …",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-06-27T16:41:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "461072b322ff6de9a7b833c48f17fa0744d3bddd",
          "body": "Desktop / Browser / iOS / Android 渲染同一張訂單表單的截圖,\n圖片置於 jeff377/blog-images(raw URL 內嵌)。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(readme): Bee.Northwind 加入四出海口執行畫面(內嵌圖,中英同步)",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-06-27T00:21:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b9c4fbb09f604627432725163066569f763769b8",
          "body": "Bee.Northwind 實際 8 個 FormSchema / 8 個選單項;apps 與複本 README 先前已更正,\n根 README 漏改,本次補上。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(readme): 根 README 旗艦範例表單數 9→8(與 Bee.Northwind 實際一致,中英同步)",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-06-26T18:03:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "dcdafc108dd90b7cd7c95c80e09d179e899d9cc8",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(plan): 4.12.1 發佈 + 複本同步完成;mobile-trim 複本 sync 項收尾",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-06-26T17:26:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "afa6e490533544aa407e5d90ab5f49a68078ed18",
          "body": "…im/AOT)\n\nbump 4.12.0 → 4.12.1(patch)。自 v4.12.0 起唯一 src 變更為\nsrc/Bee.Definition/ILLink.Descriptors.xml(內嵌 trimmer descriptor,保留\n定義型別圖於 full trim / AOT),補完 4.12.0 起步的 Avalonia iOS/Android\nRelease 打包能力。無 API 變動。\n\n含 CHANGELOG 雙語條目 + docs/changelogs/4.12.1 明細 + 發版作業 plan。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): v4.12.1 — Bee.Definition 內嵌 trimmer descriptor(行動端 tr…",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-06-26T17:07:16Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1bea68d78a6e278bc28dff83a3eae2a17e14f318",
          "body": "- intro 表單數 Nine/九 → Eight/八(實際 FormSchema 8 個、選單 8 項)。\n- 移除指向 docs/plans/plan-bee-northwind-demo.md 的連結(已移至 docs/archive/,\n  gitignored 不在 GitHub,連結失效)。\n中英同步。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(readme): 修正與現況不符(表單數 9→8、移除已封存 plan 失效連結)",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-06-26T16:25:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1a2f85c1a57ac41b26b08bdc69aeec1ffb975476",
          "body": "該預告句指向的終章教學章節保留;只移除 intro 末尾的預告句。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(readme): 移除 intro 的終章預告句(第十張表單,中英同步)",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-06-26T16:21:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f7b4c513d5754238e1211370354ea4dcd271fb8b",
          "body": "- maui.md:Apple trim 決策樹 #4(TrimmerRootDescriptor)由「不適合」升為**採用解法**\n  (descriptor 內嵌 Bee.Definition、wildcard preserve),補半 A/半 B 實測補正與當前對策、\n  免實機驗證法(ValidateXcodeVersion=false / EnableCodeSigning=false / IsDynamicCodeSupported switch)。\n- apps/Bee.Northwind README(中英同步):行動端「Debug-only / Release 另案」更新為\n  「Release trim/AOT 已解並驗證」,結構樹標籤同步。\n- plan:收尾項打勾;複本 sync 釐清為 release-gated(複本 @NuGet 4.12.0 無 descriptor,\n  經下個框架版本發佈 + bump 流入,非檔案複製)。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(mobile-trim): 收尾——maui.md 決策樹回寫 + 行動端 README 更新",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-06-26T16:19:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f6805ce1d158f831a96853a29e875ee3ac7c7f57",
          "body": "階段 2 完成:強制 RuntimeFeature.IsDynamicCodeSupported=false(= iOS device AOT\n鎖定的 reflection-only XmlSerializer 路徑),在真實 iOS 模擬器 runtime + Release\ntrim(linked Bee.Definition.dll 211,968B,descriptor 生效)跑 round-trip → PASS。\n半 A(trim+descriptor)與半 B(reflection-only)兩半同時施加、在真實 iOS runtime\n通過;與實機唯一差異=AOT 編譯版同程式碼(已證 0 錯誤、已知雷已修),實機 run\n降為低風險形式收尾。\n\n核心完成(階段 0/1/2);Sgen(3)未觸發。診斷鷹架已移除。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(plan): mobile-trim 半 B 免實機驗證通過(iOS 模擬器 reflection-only)",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-06-26T16:07:20Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f34110487325f33459803e1a215d2e1edf11ed48",
          "body": "- 階段 0:iOS 編譯失敗根因=Xcode 26.5↔26.6 版本鎖;-p:ValidateXcodeVersion=false\n  繞過,Debug 在 iPhone 17 模擬器跑通(Avalonia 渲染 ConnectionView)。\n- 階段 1:descriptor Android full-trim 實測(Bee.Definition 212K→無 91K/有 208K);\n  有無 descriptor round-trip 皆 PASS,半 A 已解。\n- 階段 2:iOS device-target Release AOT build 0 錯誤(EnableCodeSigning=false 跳過簽章),\n  linked Bee.Definition.dll 211,968B 證 descriptor 於 iOS linker 亦生效;唯 iOS 實機\n  執行期 round-trip 待實機+簽章。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(plan): mobile-trim 階段 0/1/2 實測結果",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-06-26T15:55:22Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6374e29f742462725c2ff5253119b8a211dc61fb",
          "body": "行動 head(Avalonia iOS/Android)的 client 端以 XmlCodec.Deserialize<T> 反序列化\n夾在 JSON-RPC wire 的 FormSchema XML 字串;iOS AOT / Android full-trim 下 trimmer\n會砍掉「看似沒人用」的定義型別建構子、屬性 setter 與集合 Add(T),導致序列化失敗\n(誤導性的 XmlSerializeErrorDetails, 2, 2)。\n\n以 EmbeddedResource(LogicalName=ILLink.Descriptors.xml,trimmer 自動掃描的\n[…]\n。\n- 有無 descriptor,FormSchema round-trip 皆 PASS;descriptor 提供完整覆蓋保險。\n\n詳見 docs/plans/plan-mobile-release-trim-safe.md。723 個 Bee.Definition 測試全通過。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(definition): 內嵌 ILLink.Descriptors.xml 保留行動端 trim/AOT 序列化(半 A)",
          "author_name": "jeff377",
          "author_login": "jeff377",
          "committed_at": "2026-06-26T15:47:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        }
      ],
      "releases_count": 60,
      "commits_last_year": 1710,
      "latest_release_at": "2026-07-23T13:55:19Z",
      "latest_release_tag": "v4.15.0",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 36,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 4.9
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "Bee.Cli",
          "exists": true,
          "license": null,
          "keywords": [
            "bee.net",
            "cli",
            "dotnet-tool",
            "defines"
          ],
          "ecosystem": "nuget",
          "matches_repo": true,
          "registry_url": "https://www.nuget.org/packages/Bee.Cli",
          "is_deprecated": false,
          "latest_version": "4.15.0",
          "repository_url": "https://github.com/jeff377/bee-library",
          "versions_count": 9,
          "total_downloads": 870,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-23T13:54:52.303000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        }
      ]
    },
    "popularity": {
      "forks": 5,
      "stars": 10,
      "watchers": 2,
      "fork_history": {
        "days": [
          {
            "date": "2025-07-26",
            "count": 2
          },
          {
            "date": "2025-07-31",
            "count": 2
          },
          {
            "date": "2026-06-16",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 5,
        "total_forks": 5
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "samples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "apps/Bee.Northwind/Bee.Northwind.Android/Bee.Northwind.Android.csproj",
        "apps/Bee.Northwind/Bee.Northwind.Browser/Bee.Northwind.Browser.csproj",
        "apps/Bee.Northwind/Bee.Northwind.Desktop/Bee.Northwind.Desktop.csproj",
        "apps/Bee.Northwind/Bee.Northwind.Server/Bee.Northwind.Server.csproj",
        "apps/Bee.Northwind/Bee.Northwind.UI/Bee.Northwind.UI.csproj",
        "apps/Bee.Northwind/Bee.Northwind.iOS/Bee.Northwind.iOS.csproj",
        "samples/Avalonia.Demo/Avalonia.Demo.csproj",
        "samples/Avalonia.DemoCenter/Avalonia.DemoCenter.csproj",
        "samples/Bee.Samples.Shared/Bee.Samples.Shared.csproj",
        "samples/Blazor.Server.Demo/Blazor.Server.Demo.csproj",
        "samples/Blazor.Wasm.Demo.Host/Blazor.Wasm.Demo.Host.csproj",
        "samples/Blazor.Wasm.Demo/Blazor.Wasm.Demo.csproj",
        "samples/Maui.Demo/Maui.Demo.csproj",
        "samples/QuickStart.Console/QuickStart.Console.csproj",
        "samples/QuickStart.Server/QuickStart.Server.csproj",
        "src/Bee.Api.AspNetCore/Bee.Api.AspNetCore.csproj",
        "src/Bee.Api.Client/Bee.Api.Client.csproj",
        "src/Bee.Api.Contracts/Bee.Api.Contracts.csproj",
        "src/Bee.Api.Core/Bee.Api.Core.csproj",
        "src/Bee.Base/Bee.Base.csproj",
        "src/Bee.Business/Bee.Business.csproj",
        "src/Bee.Db/Bee.Db.csproj",
        "src/Bee.Definition/Bee.Definition.csproj",
        "src/Bee.Expressions/Bee.Expressions.csproj",
        "src/Bee.Hosting/Bee.Hosting.csproj",
        "src/Bee.ObjectCaching/Bee.ObjectCaching.csproj",
        "src/Bee.Repository.Abstractions/Bee.Repository.Abstractions.csproj",
        "src/Bee.Repository/Bee.Repository.csproj",
        "src/Bee.UI.Avalonia/Bee.UI.Avalonia.csproj",
        "src/Bee.UI.Core/Bee.UI.Core.csproj",
        "src/Bee.UI.Maui/Bee.UI.Maui.csproj",
        "src/Bee.Web.Blazor.Server/Bee.Web.Blazor.Server.csproj",
        "src/Bee.Web.Blazor.Wasm/Bee.Web.Blazor.Wasm.csproj",
        "tests/Bee.Api.AspNetCore.UnitTests/Bee.Api.AspNetCore.UnitTests.csproj",
        "tests/Bee.Api.Client.UnitTests/Bee.Api.Client.UnitTests.csproj",
        "tests/Bee.Api.Core.UnitTests/Bee.Api.Core.UnitTests.csproj",
        "tests/Bee.Base.UnitTests/Bee.Base.UnitTests.csproj",
        "tests/Bee.Business.UnitTests/Bee.Business.UnitTests.csproj",
        "tests/Bee.Db.UnitTests/Bee.Db.UnitTests.csproj",
        "tests/Bee.Definition.UnitTests/Bee.Definition.UnitTests.csproj",
        "tests/Bee.Expressions.UnitTests/Bee.Expressions.UnitTests.csproj",
        "tests/Bee.Hosting.UnitTests/Bee.Hosting.UnitTests.csproj",
        "tests/Bee.ObjectCaching.UnitTests/Bee.ObjectCaching.UnitTests.csproj",
        "tests/Bee.Repository.UnitTests/Bee.Repository.UnitTests.csproj",
        "tests/Bee.Tests.Shared/Bee.Tests.Shared.csproj",
        "tests/Bee.UI.Avalonia.UnitTests/Bee.UI.Avalonia.UnitTests.csproj",
        "tests/Bee.UI.Core.UnitTests/Bee.UI.Core.UnitTests.csproj",
        "tests/Bee.UI.Maui.UnitTests/Bee.UI.Maui.UnitTests.csproj",
        "tests/Bee.Web.Blazor.Server.UnitTests/Bee.Web.Blazor.Server.UnitTests.csproj",
        "tests/Bee.Web.Blazor.Wasm.UnitTests/Bee.Web.Blazor.Wasm.UnitTests.csproj",
        "tools/Bee.Cli/Bee.Cli.csproj",
        "tools/DefineEditor/Bee.DefineEditor.csproj"
      ],
      "largest_source_bytes": 54586,
      "source_files_sampled": 1545,
      "oversized_source_files": 0,
      "agent_instruction_files": [
        ".claude/CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 5759
    },
    "dependencies": {
      "manifests": [],
      "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": [],
      "dependencies": [
        {
          "name": "MessagePack",
          "manifest": "src/Bee.Definition/Bee.Definition.csproj",
          "ecosystem": "nuget",
          "version_constraint": "3.1.7"
        },
        {
          "name": "Microsoft.Extensions.Localization.Abstractions",
          "manifest": "src/Bee.Definition/Bee.Definition.csproj",
          "ecosystem": "nuget",
          "version_constraint": "10.0.8"
        },
        {
          "name": "DynamicExpresso.Core",
          "manifest": "src/Bee.Expressions/Bee.Expressions.csproj",
          "ecosystem": "nuget",
          "version_constraint": "2.19.3"
        },
        {
          "name": "Microsoft.Extensions.DependencyInjection",
          "manifest": "src/Bee.Hosting/Bee.Hosting.csproj",
          "ecosystem": "nuget",
          "version_constraint": "10.0.0"
        },
        {
          "name": "Microsoft.Extensions.Hosting.Abstractions",
          "manifest": "src/Bee.Hosting/Bee.Hosting.csproj",
          "ecosystem": "nuget",
          "version_constraint": "10.0.0"
        },
        {
          "name": "Microsoft.Extensions.Caching.Memory",
          "manifest": "src/Bee.ObjectCaching/Bee.ObjectCaching.csproj",
          "ecosystem": "nuget",
          "version_constraint": "10.0.0"
        },
        {
          "name": "Avalonia",
          "manifest": "src/Bee.UI.Avalonia/Bee.UI.Avalonia.csproj",
          "ecosystem": "nuget",
          "version_constraint": "12.0.0"
        },
        {
          "name": "Avalonia.Controls.DataGrid",
          "manifest": "src/Bee.UI.Avalonia/Bee.UI.Avalonia.csproj",
          "ecosystem": "nuget",
          "version_constraint": "12.0.0"
        },
        {
          "name": "Microsoft.Maui.Controls",
          "manifest": "src/Bee.UI.Maui/Bee.UI.Maui.csproj",
          "ecosystem": "nuget",
          "version_constraint": "10.0.20"
        },
        {
          "name": "Microsoft.AspNetCore.Components.WebAssembly",
          "manifest": "src/Bee.Web.Blazor.Wasm/Bee.Web.Blazor.Wasm.csproj",
          "ecosystem": "nuget",
          "version_constraint": "10.0.0"
        },
        {
          "name": "Avalonia",
          "manifest": "tools/DefineEditor/Bee.DefineEditor.csproj",
          "ecosystem": "nuget",
          "version_constraint": "12.0.4"
        },
        {
          "name": "Avalonia.Desktop",
          "manifest": "tools/DefineEditor/Bee.DefineEditor.csproj",
          "ecosystem": "nuget",
          "version_constraint": "12.0.4"
        },
        {
          "name": "Semi.Avalonia",
          "manifest": "tools/DefineEditor/Bee.DefineEditor.csproj",
          "ecosystem": "nuget",
          "version_constraint": "12.0.3"
        },
        {
          "name": "Avalonia.Fonts.Inter",
          "manifest": "tools/DefineEditor/Bee.DefineEditor.csproj",
          "ecosystem": "nuget",
          "version_constraint": "12.0.4"
        },
        {
          "name": "AvaloniaUI.DiagnosticsSupport",
          "manifest": "tools/DefineEditor/Bee.DefineEditor.csproj",
          "ecosystem": "nuget",
          "version_constraint": "2.2.1"
        },
        {
          "name": "CommunityToolkit.Mvvm",
          "manifest": "tools/DefineEditor/Bee.DefineEditor.csproj",
          "ecosystem": "nuget",
          "version_constraint": "8.4.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": 0,
        "merged_prs": 89,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 79
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "jeff377",
          "commits": 1860,
          "avatar_url": "https://avatars.githubusercontent.com/u/16026012?v=4"
        },
        {
          "type": "User",
          "login": "claude",
          "commits": 189,
          "avatar_url": "https://avatars.githubusercontent.com/u/81847?v=4"
        }
      ],
      "contributors_sampled": 2,
      "top_contributor_share": 0.908
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "auto-merge.yml",
        "build-ci.yml",
        "nuget-publish.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": true,
      "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": null,
            "reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 6,
            "reason": "project has 2 contributing companies or organizations -- score normalized to 6",
            "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": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 10,
            "reason": "all dependencies are pinned",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "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": "a240a4ee71d9b0c4710e8f5deacedf39b7616448",
        "ran_at": "2026-07-23T14:07:38Z",
        "aggregate_score": 5.3,
        "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-23T13:55:21Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-06-13T09:16:46Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/jeff377/bee-library",
    "host": "github.com",
    "name": "bee-library",
    "owner": "jeff377"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 61,
      "inputs": {
        "security": 53,
        "vitality": 93,
        "community": 35,
        "governance": 47,
        "engineering": 71
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 93,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "excellent",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 89,
            "inputs": {
              "commits_last_year": 1710,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 36
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "36/52 weeks with commits",
                "points": 24.9,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 36
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "1710 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 1710
                    }
                  }
                ],
                "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": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "releases_count": 60,
              "latest_release_tag": "v4.15.0",
              "releases_from_tags": false,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 4.9
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "60 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 60
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~4.9 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 4.9
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "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": 0,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 0 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 35,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 20,
            "inputs": {
              "forks": 5,
              "stars": 10,
              "watchers": 2,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "10 stars",
                "points": 15.5,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 10
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "5 forks",
                "points": 5,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "2 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "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 (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "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
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "at_risk",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 38,
            "inputs": {
              "packages": [
                "Bee.Cli"
              ],
              "dependents": null,
              "ecosystems": "nuget",
              "total_downloads": 870,
              "monthly_downloads": null
            },
            "components": [
              {
                "key": "total_downloads",
                "name": "Total downloads",
                "detail": "870 downloads all-time across nuget",
                "points": 30.5,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_total",
                    "params": {
                      "count": 870,
                      "ecosystems": "nuget"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "at_risk",
        "name": "Sustainability & Governance",
        "value": 47,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 20,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 2,
              "top_contributor_share": 0.908
            },
            "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 91% of commits",
                "points": 2.1,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 91
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "2 contributors",
                "points": 2.7,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 2 contributing companies or organizations -- score normalized to 6",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "at_risk",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 38,
            "inputs": {
              "merged_prs": 89,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 79
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "89/168 decided PRs merged",
                "points": 20.3,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 89,
                      "decided": 168
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "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": "at_risk",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 46,
            "inputs": {
              "followers": 7,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "jeff377",
              "public_repos": 14,
              "account_age_days": 3892
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "7 followers of jeff377",
                "points": 6.5,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 7,
                      "login": "jeff377"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "14 public repos, account ~10 yr old",
                "points": 20.6,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 14
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 10
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "Bee.Cli"
              ],
              "ecosystems": "nuget",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on nuget",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "nuget"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 0 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "9 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 71,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": true,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "3 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "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": 6.4,
                "status": "met",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "topics": [
                "clear-architecture",
                "mvvm",
                "n-tier",
                "erp",
                "enterprise-architecture"
              ],
              "has_wiki": false,
              "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": "5 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 53,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "moderate",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection, CI-Tests, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection",
                    "ci_tests",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 53,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 15,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 3,
              "scorecard_aggregate": 5.3
            },
            "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": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 2 contributing companies or organizations -- score normalized to 6",
                "points": 1.5,
                "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 detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "all dependencies are pinned",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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": "excellent",
            "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"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 2
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 73,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [
                ".claude/CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 5759
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": ".claude/CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".claude/CLAUDE.md"
                    }
                  }
                ],
                "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": "100 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 100,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 66,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 1,
              "toolchain_manifests": [
                "apps/Bee.Northwind/Bee.Northwind.Android/Bee.Northwind.Android.csproj",
                "apps/Bee.Northwind/Bee.Northwind.Browser/Bee.Northwind.Browser.csproj",
                "apps/Bee.Northwind/Bee.Northwind.Desktop/Bee.Northwind.Desktop.csproj",
                "apps/Bee.Northwind/Bee.Northwind.Server/Bee.Northwind.Server.csproj",
                "apps/Bee.Northwind/Bee.Northwind.UI/Bee.Northwind.UI.csproj",
                "apps/Bee.Northwind/Bee.Northwind.iOS/Bee.Northwind.iOS.csproj",
                "samples/Avalonia.Demo/Avalonia.Demo.csproj",
                "samples/Avalonia.DemoCenter/Avalonia.DemoCenter.csproj",
                "samples/Bee.Samples.Shared/Bee.Samples.Shared.csproj",
                "samples/Blazor.Server.Demo/Blazor.Server.Demo.csproj",
                "samples/Blazor.Wasm.Demo.Host/Blazor.Wasm.Demo.Host.csproj",
                "samples/Blazor.Wasm.Demo/Blazor.Wasm.Demo.csproj",
                "samples/Maui.Demo/Maui.Demo.csproj",
                "samples/QuickStart.Console/QuickStart.Console.csproj",
                "samples/QuickStart.Server/QuickStart.Server.csproj",
                "src/Bee.Api.AspNetCore/Bee.Api.AspNetCore.csproj",
                "src/Bee.Api.Client/Bee.Api.Client.csproj",
                "src/Bee.Api.Contracts/Bee.Api.Contracts.csproj",
                "src/Bee.Api.Core/Bee.Api.Core.csproj",
                "src/Bee.Base/Bee.Base.csproj",
                "src/Bee.Business/Bee.Business.csproj",
                "src/Bee.Db/Bee.Db.csproj",
                "src/Bee.Definition/Bee.Definition.csproj",
                "src/Bee.Expressions/Bee.Expressions.csproj",
                "src/Bee.Hosting/Bee.Hosting.csproj",
                "src/Bee.ObjectCaching/Bee.ObjectCaching.csproj",
                "src/Bee.Repository.Abstractions/Bee.Repository.Abstractions.csproj",
                "src/Bee.Repository/Bee.Repository.csproj",
                "src/Bee.UI.Avalonia/Bee.UI.Avalonia.csproj",
                "src/Bee.UI.Core/Bee.UI.Core.csproj",
                "src/Bee.UI.Maui/Bee.UI.Maui.csproj",
                "src/Bee.Web.Blazor.Server/Bee.Web.Blazor.Server.csproj",
                "src/Bee.Web.Blazor.Wasm/Bee.Web.Blazor.Wasm.csproj",
                "tests/Bee.Api.AspNetCore.UnitTests/Bee.Api.AspNetCore.UnitTests.csproj",
                "tests/Bee.Api.Client.UnitTests/Bee.Api.Client.UnitTests.csproj",
                "tests/Bee.Api.Core.UnitTests/Bee.Api.Core.UnitTests.csproj",
                "tests/Bee.Base.UnitTests/Bee.Base.UnitTests.csproj",
                "tests/Bee.Business.UnitTests/Bee.Business.UnitTests.csproj",
                "tests/Bee.Db.UnitTests/Bee.Db.UnitTests.csproj",
                "tests/Bee.Definition.UnitTests/Bee.Definition.UnitTests.csproj",
                "tests/Bee.Expressions.UnitTests/Bee.Expressions.UnitTests.csproj",
                "tests/Bee.Hosting.UnitTests/Bee.Hosting.UnitTests.csproj",
                "tests/Bee.ObjectCaching.UnitTests/Bee.ObjectCaching.UnitTests.csproj",
                "tests/Bee.Repository.UnitTests/Bee.Repository.UnitTests.csproj",
                "tests/Bee.Tests.Shared/Bee.Tests.Shared.csproj",
                "tests/Bee.UI.Avalonia.UnitTests/Bee.UI.Avalonia.UnitTests.csproj",
                "tests/Bee.UI.Core.UnitTests/Bee.UI.Core.UnitTests.csproj",
                "tests/Bee.UI.Maui.UnitTests/Bee.UI.Maui.UnitTests.csproj",
                "tests/Bee.Web.Blazor.Server.UnitTests/Bee.Web.Blazor.Server.UnitTests.csproj",
                "tests/Bee.Web.Blazor.Wasm.UnitTests/Bee.Web.Blazor.Wasm.UnitTests.csproj",
                "tools/Bee.Cli/Bee.Cli.csproj",
                "tools/DefineEditor/Bee.DefineEditor.csproj"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "apps/Bee.Northwind/Bee.Northwind.Android/Bee.Northwind.Android.csproj, apps/Bee.Northwind/Bee.Northwind.Browser/Bee.Northwind.Browser.csproj, apps/Bee.Northwind/Bee.Northwind.Desktop/Bee.Northwind.Desktop.csproj (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "apps/Bee.Northwind/Bee.Northwind.Android/Bee.Northwind.Android.csproj, apps/Bee.Northwind/Bee.Northwind.Browser/Bee.Northwind.Browser.csproj, apps/Bee.Northwind/Bee.Northwind.Desktop/Bee.Northwind.Desktop.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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "100 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 100,
                      "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": "all dependencies are pinned",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "C#",
              "largest_source_bytes": 54586,
              "source_files_sampled": 1545,
              "oversized_source_files": 0
            },
            "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": "0/1545 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 1545,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "samples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "samples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "samples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-23T14:07:46.257374Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/j/jeff377/bee-library.svg",
  "full_name": "jeff377/bee-library",
  "license_state": "standard",
  "license_spdx": "MIT"
}

Scores are signals, not warranties. They reflect publicly visible practices on GitHub — not a code audit, and not a security guarantee.

Missing data is excluded and weights renormalized, never scored as zero. Methodology is versioned and open: metrics v1.13.0, schema v0.27.0 — full methodology · metrics wiki.

How one result sits in the wider record: aggregate statisticsNuGet.