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

joaquinbejar / Option-Chain-OrderBook

A high-performance Rust library for options market making infrastructure, providing a complete Option Chain Order Book system built on top of OrderBook-rs, PriceLevel, and OptionStratLib.

RustCustom license★ 25 stars⑂ 8 forkssince Dec 2025View on GitHub ↗

joaquinbejar/Option-Chain-OrderBook holds a health index of 62 out of 100, placing it in the Moderate band. It scores highest on Vitality (82/100) and lowest on Community & Adoption (41/100). It was last updated today. A single contributor accounts for most of its recent work.

62
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.

62
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

Joaquin Bejar GarciaPersonal account
288 followers84 public repossince Feb 2022Capital Delta

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
crates.iooption-chain-orderbook0.10.02,679200 days agooptionsfinancetradingorderbookmarket-makingalgorithms

Metrics by category

Vitality

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

82Good · 22% of overall
How it's scored
36/36Push recency — last push 0 days ago
6.2/36Commit cadence — 9/52 weeks with commits
18/18Commit volume — 277 commits in the last year
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year277
human_commit_share1
days_since_last_push0
active_weeks_last_year9

Release discipline

100Excellent
How it's scored
27/27Ships releases — 18 releases published
36/36Release recency — latest release 0 days ago
27/27Release cadence — a release every ~11.9 days
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count18
latest_release_tagv0.10.0
releases_from_tagsno
days_since_latest_release0
mean_days_between_releases11.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?

41At risk · 18% of overall
How it's scored
22.4/60Stars — 25 stars
7/25Forks — 8 forks
0/15Watchers — 1 watchers
Inputs used
forks8
stars25
watchers1
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
How it's scored
22.5/22.5README
16.9/22.5License — license file present, not a recognized license
0/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseno
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
How it's scored
45.7/80Monthly downloads — 2,679 downloads/month across crates
0/20Registry dependents — not reported by this ecosystem
Inputs used
packagesoption-chain-orderbook
dependents
ecosystemscrates
total_downloads9,823
monthly_downloads2,679
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?

64Moderate · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
8.7/22.5Commit distribution — top contributor authored 61% of commits
4.1/13.5Contributor breadth — 3 contributors
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Inputs used
bus_factor1
contributors_sampled3
top_contributor_share0.612
How it's scored
46.8/46.8Issue resolution — 100% of issues closed
38.2/38.3PR acceptance — 62/62 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 0/10 approved changesets -- score normalized to 0
Inputs used
merged_prs62
open_issues0
closed_issues55
issue_closed_ratio1
closed_unmerged_prs0
How it's scored
10/30Ownership backing — personal (user) account
0/20Verified domain — not applicable to user accounts
17.7/25Owner reach — 288 followers of joaquinbejar
21.9/25Track record — 84 public repos, account ~4 yr old
Inputs used
followers288
owner_typeUser
is_verified
owner_loginjoaquinbejar
public_repos84
account_age_days1,630
Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.
How it's scored
25/25Published & resolvable — 1 package(s) on crates
35/35Publish recency — latest publish 0 days ago
20/20Version history — 20 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packagesoption-chain-orderbook
ecosystemscrates
any_deprecatedno
min_days_since_publish0

Engineering Quality

Are baseline engineering and documentation practices in place?

65Moderate · 20% of overall
How it's scored
24/24CI workflows — 6 workflow(s)
24/24Tests present
0/16Linter config
0/9.6Pre-commit hooks
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 8 out of 8 merged PRs checked by a CI test -- score normalized to 10
Inputs used
has_ciyes
has_testsyes
has_editorconfigno
has_linter_configno
has_precommit_configno

Documentation

60Moderate
How it's scored
30/30README
0/25Documentation directory
0/15Documentation / homepage site
10/10Repository description
10/10Topics — 7 topics
10/10Wiki
Inputs used
topicsfinance, market-making, option-pricing, options, options-trading, orderbook, trading
has_wikiyes
homepage
has_readmeyes
has_docs_dirno
has_descriptionyes

Security

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

51Moderate · 16% of overall
How it's scored
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2.5/2.5CI-Tests — 8 out of 8 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/10 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.2/2.5License — license file detected
7.5/7.5Maintained — 30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — no data
2/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 4
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — no data
7.5/7.5Token-Permissions — GitHub workflow tokens follow principle of least privilege
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate5.1
Excluded from scoring (no data or not applicable): packaging, 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.

54Moderate · 0% of overall
How it's scored
0/45Agent instructions — no CLAUDE.md / AGENTS.md / editor rules
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
agent_instruction_max_bytes
How it's scored
18/18One-command bootstrap — Makefile
22/22Automated tests
0/11Lint / format config
11/11Static type checking — Rust (statically typed)
0/10Reproducible environment
0/10Demonstrated agent practice — no agent-authored commits among the last 100
0/8Automated maintenance — no automated dependency updates observed
4/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 4
Inputs used
has_nixno
has_testsyes
lockfiles
has_dockerfileno
typed_languageyes
bootstrap_filesMakefile
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0
toolchain_manifestsCargo.toml
dependency_bot_commit_share0
How it's scored
45/45Type-checkable code — Rust (statically typed)
49.8/55Manageable file sizes — 6/63 source files over 60KB
Inputs used
primary_languageRust
largest_source_bytes240,067
source_files_sampled63
oversized_source_files6
How it's scored
0/40API schema (OpenAPI/GraphQL/proto)
0/20MCP server
40/40Runnable examples — examples
Inputs used
example_dirsexamples
has_mcp_signalno
api_schema_files

Key facts

25GitHub stars
3contributors
277commits, last 12 months
0days since last push
18releases
1bus factor
0open issues
crates.iopackage 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
  • deps.dev does not index crates:option-chain-orderbook@0.10.0; advisories assessed against the repository dependency graph instead

More detail

Star and fork history 0 ★ / 8 ⇿
0Stars
8Forks
8Releases

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.

2345678822025-122026-032026-05
Major 0Minor 3Patch 5
OpenSSF Scorecard 5.1 / 10
5.1aggregate

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 12:39 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests8 out of 8 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/10 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
9Licenselicense file detected
10Maintained30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10
n/aPackagingpackaging workflow not detected
4Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 4
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
n/aSigned-Releasesno releases found
10Token-PermissionsGitHub workflow tokens follow principle of least privilege
10Vulnerabilities0 existing vulnerabilities detected
Direct dependencies 16
RegistryPackageVersion constraintManifest
crates.iooptionstratlibCargo.toml
crates.ioorderbook-rsCargo.toml
crates.ioasync-natsCargo.toml
crates.iobytesCargo.toml
crates.iotokioCargo.toml
crates.iotracingCargo.toml
crates.ioserde_jsonCargo.toml
crates.ioserdeCargo.toml
crates.iorust_decimalCargo.toml
crates.iorust_decimal_macrosCargo.toml
crates.iochronoCargo.toml
crates.iothiserrorCargo.toml
crates.iocrossbeam-skiplistCargo.toml
crates.iodashmap6.2Cargo.toml
crates.iopricelevelCargo.toml
crates.iouuidCargo.toml
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": [
        "finance",
        "market-making",
        "option-pricing",
        "options",
        "options-trading",
        "orderbook",
        "trading"
      ],
      "is_fork": false,
      "size_kb": 1859,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Rust": 1621404,
        "Makefile": 4464
      },
      "pushed_at": "2026-07-23T06:04:33Z",
      "created_at": "2025-12-22T16:00:09Z",
      "owner_type": "User",
      "updated_at": "2026-07-23T06:03:43Z",
      "description": "A high-performance Rust library for options market making infrastructure, providing a complete Option Chain Order Book system built on top of OrderBook-rs, PriceLevel, and OptionStratLib.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": null,
      "default_branch": "main",
      "license_spdx_raw": null,
      "primary_language": "Rust",
      "significant_languages": [
        "Rust"
      ]
    },
    "owner": {
      "blog": "https://t.me/joaquin_bejar",
      "name": "Joaquin Bejar Garcia",
      "type": "User",
      "login": "joaquinbejar",
      "company": "Capital Delta",
      "location": "London",
      "followers": 288,
      "avatar_url": "https://avatars.githubusercontent.com/u/99006095?v=4",
      "created_at": "2022-02-04T06:46:24Z",
      "is_verified": null,
      "public_repos": 84,
      "account_age_days": 1630
    },
    "license": {
      "state": "custom",
      "spdx_id": null,
      "raw_spdx": null,
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": false
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.10.0",
          "kind": "minor",
          "published_at": "2026-07-23T06:04:33Z"
        },
        {
          "tag": "v0.9.1",
          "kind": "patch",
          "published_at": "2026-07-13T09:20:38Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-07-13T08:43:18Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-07-12T21:46:18Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-07-11T10:42:09Z"
        },
        {
          "tag": "v0.6.1",
          "kind": "patch",
          "published_at": "2026-07-11T06:50:13Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-07-10T14:01:19Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-06-27T03:36:43Z"
        },
        {
          "tag": "v0.4.4",
          "kind": "patch",
          "published_at": "2026-06-26T06:13:42Z"
        },
        {
          "tag": "v0.4.3",
          "kind": "patch",
          "published_at": "2026-04-07T11:41:20Z"
        },
        {
          "tag": "v0.4.2",
          "kind": "patch",
          "published_at": "2026-03-20T15:55:58Z"
        },
        {
          "tag": "v0.4.1",
          "kind": "patch",
          "published_at": "2026-03-20T15:14:50Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-03-11T09:20:48Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-01-27T08:10:16Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-01-18T06:08:27Z"
        },
        {
          "tag": "v0.1.5",
          "kind": "patch",
          "published_at": "2025-12-23T09:14:48Z"
        },
        {
          "tag": "v0.1.4",
          "kind": "patch",
          "published_at": "2025-12-23T06:51:10Z"
        },
        {
          "tag": "v0.1.3",
          "kind": "patch",
          "published_at": "2025-12-22T19:53:40Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "7dd6b0084e5936eb1384f7aedb90fd745ff91c88",
          "body": "Bump every dependency to its latest stable line and normalize each\nrequirement to a two-component X.Y range:\n\n  optionstratlib 0.17 -> 0.18\n  orderbook-rs   0.11 -> 0.12\n  pricelevel     0.8.4 -> 0.9\n  uuid           1.23 -> 1.24\n  tokio          1.52 -> 1.53\n  proptest       1    -> 1.11\n\nNo source\n[…]\n link targets were redundant with their labels.\nOne public doc comment linked to the pub(crate) `new_with_config`. Docs now\nbuild warning-free both with and without --all-features; README regenerated.",
          "is_bot": false,
          "headline": "chore(release): 0.10.0 — dependency refresh, clean rustdoc",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-07-23T06:03:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cbd6557adc30b85d5b34cb9f737308bdb7ccd950",
          "body": "…p-source\n\nInjectable event-envelope timestamp_ns source (#157)",
          "is_bot": false,
          "headline": "Merge pull request #158 from joaquinbejar/issue-157-envelope-timestam…",
          "author_name": "Joaquin Bejar Garcia",
          "author_login": "joaquinbejar",
          "committed_at": "2026-07-13T09:20:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b7578c176d10f69c91f9c2401a84a147cdae2bd0",
          "body": "OptionChainSequencer::assign() stamped the per-event envelope\ntimestamp_ns from the wall clock — the last non-deterministic field in\nthe journal once the clock and trade-ID namespace seams (#147, #153)\nare injected. The source now lives behind an RwLock'd Arc<dyn Fn() ->\nu64> defaulting to nanos_sin\n[…]\nd values.\n\nRelease prep: bump to 0.9.1, CHANGELOG entry (purely additive — no\nmigration guide needed), docs updated (module section, field doc,\nlib.rs Limitations) and README regenerated.\n\nCloses #157",
          "is_bot": false,
          "headline": "feat(sequencer): injectable event-envelope timestamp_ns source",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-07-13T09:16:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "af1b7099abb6e2f31dadbdfdf920677da3a2503d",
          "body": "Stamp the CHANGELOG heading, add MIGRATING-0.9.0.md (orderbook-rs 0.11\nco-pinner move; AddOrder kind/hidden_quantity and OrderReplaced.trade\nliteral-constructor breaks), and freeze the v0.9.0 journal fixture.",
          "is_bot": false,
          "headline": "chore(release): 0.9.0 — banding, order kinds, deterministic trade IDs",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-07-13T08:42:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "787672913ffa0bd6b36fa96ade273d2487a123a8",
          "body": "Deterministic trade-ID namespace and replace fills in OrderReplaced (#153)",
          "is_bot": false,
          "headline": "Merge pull request #156 from joaquinbejar/stack/3-153-trade-id-namespace",
          "author_name": "Joaquin Bejar Garcia",
          "author_login": "joaquinbejar",
          "committed_at": "2026-07-13T07:58:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e4585a3520081f52107fccc45c3e9bf6dd504fa2",
          "body": "…ntract\n\nThe determinism audit found the replace-capture contract overstated:\na concurrent non-sequenced replace of the SAME order id produces fills\nwith the identical taker id, which the filter cannot distinguish — that\nrace can mis-attribute the audit payload (book state and the returned\nbool are \n[…]\n model and call the\nsame-order-id race out explicitly. Also: test unwrap → expect, and the\nUnreleased co-pinner dep bump moves under the ⚠️ Breaking Changes\nheading per changelog precedent.\n\nRefs #153",
          "is_bot": false,
          "headline": "polish(book,tests,changelog): review fixes — scope the attribution co…",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-07-13T07:53:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "248a1524524759c3202fb25b9374e928ba4a48a2",
          "body": "SequencedUnderlyingOrderBook::set_trade_id_namespace (gate-linearized,\nmirroring set_clock) completes the seams from #147/#148: with an\ninjected clock and root namespace set before the first submit, two\nidentical sequenced runs on fresh instances produce byte-identical\ncommand and result payloads — \n[…]\n pin).\nThe resolved-limitation docs replace the known-limitation section, and\nthe CHANGELOG documents the orderbook-rs 0.10→0.11 public-dep move as\nbreaking for co-pinners.\n\nRefs #153 (sequencer half)",
          "is_bot": false,
          "headline": "feat(sequencer): deterministic trade IDs through the sequenced path",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-07-13T07:38:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6f7381b0dd60bc0c98d9e7349884f92bbf306b52",
          "body": "…full\n\nEvery manager level carries a Shared<Option<Uuid>> root namespace\n(set/clear/getter trio mirroring the clock rails) propagated on\nget_or_create; BookConfig carries the root and new_with_config derives\nthe per-leaf namespace as UUIDv5(root, leaf_symbol) on the mut book\nbefore the Arc freeze — \n[…]\nre mode is a missing payload, never a mis-attributed one. Bench:\nadd_limit_order/cancel_order unchanged; small fixed per-book\nconstruction cost from the two slot Arcs.\n\nRefs #153 (hierarchy/leaf half)",
          "is_bot": false,
          "headline": "feat(book): deterministic trade-ID namespace rails and replace_order_…",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-07-13T07:21:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6df63fec0705be17ecfb7fdd1119fac4fb439e05",
          "body": "orderbook-rs 0.11.0 ships the injectable trade-ID namespace\n(set_trade_id_namespace / with_clock_and_namespace, upstream #199) that\n#153 threads through the hierarchy. Its only breaking changes are in\nReplayBookConfig/ReplayError, which this crate does not use. orderbook-rs\nis a public dependency, s\n[…]\nt move to 0.11 in\nthe same update.\n\nuuid (v5 feature) becomes a direct dependency for deriving per-leaf\nnamespaces via Uuid::new_v5; the version unifies with the existing\ntransitive 1.23.x.\n\nRefs #153",
          "is_bot": false,
          "headline": "chore(deps): orderbook-rs 0.11, uuid 1.23 as direct workspace dep",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-07-13T06:45:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9d954d7d4a9d6a544452b932af8f760707193e32",
          "body": "Order-kind variety through the sequenced path: post-only and iceberg (#151)",
          "is_bot": false,
          "headline": "Merge pull request #155 from joaquinbejar/stack/2-151-order-kinds",
          "author_name": "Joaquin Bejar Garcia",
          "author_login": "joaquinbejar",
          "committed_at": "2026-07-13T06:43:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "97ff06c92be18f761c10486cfd180cedf945d156",
          "body": "…s reason\n\n- Iceberg visible+hidden overflow error moves into a #[cold]\n  #[inline(never)] helper, matching the band-check error shape so the\n  formatting machinery stays out of the hot body.\n- The post-only would-cross determinism test now asserts the live\n  engine rejection equals POST_ONLY_CROSS_REASON, tying the v0.9.0\n  fixture constant to real engine output so an upstream rewording\n  fails loudly instead of letting the fixture drift.\n\nRefs #151",
          "is_bot": false,
          "headline": "polish(book,sequencer): review fixes — cold overflow helper, pin cros…",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-07-13T06:39:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e959497ab53dda725a7b94dd1c7bb85da9ef54a2",
          "body": "OptionChainCommand::AddOrder gains kind (Limit default via serde,\nPostOnly, Iceberg — new OrderKind enum) and hidden_quantity (iceberg\nreserve; quantity stays the visible tranche). Old JSON journals decode\nto Limit/None and replay identically; kind mismatches are rejected\ndeterministically rather th\n[…]\nrefix gains expiration D (post-only\nrest, would-cross reject, iceberg refill) under the full-state oracle,\nincluding an explicit post-refill visible/hidden split assertion.\n\nRefs #151 (sequencer half)",
          "is_bot": false,
          "headline": "feat(sequencer): order-kind variety on the journaled add path",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-07-13T06:32:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dafbd37dd8d58488e296519b07fbfc7453d0a1b8",
          "body": "The upstream typed post-only/iceberg helpers discard the trade result,\nso the leaf builds the OrderType itself (timestamp from the injected\nbook clock) and routes through the generic add_order_with_result:\n\n- add_post_only_order_with_tif_and_user_full — a crossing post-only\n  never trades; the engin\n[…]\nto the total.\n- Non-_full conveniences delegate to the _full variants.\n\nAll four run the active check and the price-band check before the\nengine, matching the limit-order paths.\n\nRefs #151 (leaf half)",
          "is_bot": false,
          "headline": "feat(book): post-only and iceberg leaf adds with per-call attribution",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-07-13T06:13:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "68a4642c0f11be9e98d3f971b490550e633dedce",
          "body": "Per-contract price banding on ContractSpecs, tightest-wins (#152)",
          "is_bot": false,
          "headline": "Merge pull request #154 from joaquinbejar/stack/1-152-price-banding",
          "author_name": "Joaquin Bejar Garcia",
          "author_login": "joaquinbejar",
          "committed_at": "2026-07-13T06:05:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a206d40b316ab3799e3c5f9839187a76b0a07749",
          "body": "Review precision: ContractSpecs has never used deny_unknown_fields, so a\nband-carrying payload decodes fine on 0.8.0 — the band is just ignored\nthere, not a decode failure. State it explicitly.\n\nRefs #152",
          "is_bot": false,
          "headline": "docs(contract_specs): band fields are silently ignored by 0.8.0 readers",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-07-13T06:01:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "502d1f9044ae85bd7b8fa1684736504dc9cf8d6c",
          "body": "ContractSpecs gains an inclusive [min_price, max_price] band (smallest\nprice units) and ValidationConfig gains min_price plus the canonical\ntightened_price_band merge: effective max is the min of the set maxes,\neffective min is the max of the set mins, an unset side is filled by\nthe other source. Th\n[…]\nkeep the 0.8.0 wire shape (skip_serializing_if) and\nbehave byte-identically. An incoherent cross-source band warns at\ncreation and rejects every order rather than being silently repaired.\n\nCloses #152",
          "is_bot": false,
          "headline": "feat(book): per-contract price banding via ContractSpecs, tightest-wins",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-07-13T05:56:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cfeba5a144b9e7b69b7f7fcd09aa1539c36d7458",
          "body": "Lossless venue integration: fills, TIF/identity, atomic replace, max price (#148)",
          "is_bot": false,
          "headline": "Merge pull request #150 from joaquinbejar/stack/2-148-lossless-venue",
          "author_name": "Joaquin Bejar Garcia",
          "author_login": "joaquinbejar",
          "committed_at": "2026-07-12T21:45:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e0df6e92106168c6f53c88b0222ca56dfc082b63",
          "body": "…erage\n\nAddress pre-PR review findings:\n- The backward-compatibility claim for the appended AddOrder/OrderAdded\n  fields is now explicitly scoped to self-describing encodings (JSON):\n  positional codecs such as bincode cannot apply a missing-field\n  default, so pre-0.8.0 binary journal records need \n[…]\nG example imports Hash32 from the crate root.\n- New test pins the error-after-fills IOC path end-to-end: a journaled\n  Rejected with real fills replays to the identical full-state snapshot.\n\nRefs #148",
          "is_bot": false,
          "headline": "polish(sequencer,docs): review fixes — scope serde BC claims, IOC cov…",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-07-12T21:41:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0952fdd576f034e85764600e182bc18a2ad6b39b",
          "body": "0.8.0 ships the deterministic venue seams (#147) and the lossless venue\nintegration surface (#148). The AddOrder/OrderAdded variant-field\nadditions are source-breaking for literal constructors and full field\npatterns (wire format stays backward-compatible), so the pre-1.0 minor\nbump is required against the published 0.7.0 baseline.\n\nMIGRATING-0.8.0.md walks through the two-variant source break and lists\nthe additive surface.",
          "is_bot": false,
          "headline": "chore(release): bump to 0.8.0, changelog and migration guide",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-07-12T21:21:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2b71d538ac5b2fc9aae185b55447f5fe1fed1456",
          "body": "The sequenced command surface now captures every matching outcome:\n\n- AddOrder carries tif (serde default Gtc) and user_id (default zero),\n  so TIF variety and account/STP identity ride the journaled path; old\n  journals decode to exactly the pre-change semantics. New\n  submit_add_order_with(); subm\n[…]\ncting or exhaustively destructuring the AddOrder /\nOrderAdded variants by literal now requires the new fields (enums are\nnon_exhaustive; wire format is backward-compatible).\n\nRefs #148 (items 1, 2, 4)",
          "is_bot": false,
          "headline": "feat(sequencer)!: lossless AddOrder/OrderAdded and atomic ReplaceOrder",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-07-12T21:20:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1bed2961c759f75ead2181014eda0f93196626f1",
          "body": "…eams\n\nSerialize sequencer submissions and thread an injectable clock (#147)",
          "is_bot": false,
          "headline": "Merge pull request #149 from joaquinbejar/stack/1-147-deterministic-s…",
          "author_name": "Joaquin Bejar Garcia",
          "author_login": "joaquinbejar",
          "committed_at": "2026-07-12T20:57:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2bb56005029624806aca06eb2c0bc8fa8a6f45b0",
          "body": "Three venue-facing leaf capabilities from #148:\n\n- ValidationConfig gains max_price. The upstream engine has no\n  price-bound hook, so the bound is stored on the leaf and enforced\n  crate-side in every add path (and replace) after the active check —\n  one Option<u128> compare on the happy path, #[co\n[…]\nate-first atomic replace:\n  the original order survives any rejection (shape, risk, STP\n  self-cross), queue priority is lost, and rematch fills reach the\n  trade listener only.\n\nRefs #148 (items 3-5)",
          "is_bot": false,
          "headline": "feat(book): max-price bound, capture take/clear, atomic replace_order",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-07-12T20:55:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0b38236d06e167819707e027fe7965cfa61de469",
          "body": "…ock parity\n\nAddress pre-PR review findings:\n- SequencedUnderlyingOrderBook::set_clock now takes the submit gate so a\n  clock change is linearized against the sequenced command stream (a\n  racing command deterministically sees the old or the new clock), and\n  its docs note that the sequenced add pat\n[…]\nee_schedule.\n- Crate-level Limitations document the non-replay-stable trade IDs\n  (OrderBook-rs#199) and the injected-clock requirement for GTD/Day\n  replay determinism; README regenerated.\n\nRefs #147",
          "is_bot": false,
          "headline": "polish(sequencer,book): review fixes — gate set_clock, docs, clear_cl…",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-07-12T20:36:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "93eaa0187e8d82f46c397c65ce3ea896687a9122",
          "body": "orderbook_rs mints each book's trade-ID namespace with a random\nUuid::new_v4() and exposes no injection seam, so trade IDs differ\nbetween a live run and its replay even with identical command streams\nand an injected clock. The replay oracle compares book state and\nexcludes trade IDs. Tracked upstream as OrderBook-rs#199; the hierarchy\nwill thread a deterministic namespace alongside the clock once the seam\nships.\n\nRefs #147 (item 3)",
          "is_bot": false,
          "headline": "docs(sequencer): document the trade-ID determinism limitation",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-07-12T20:22:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4b507fe5a926bc491ce3128e9e61090e55fa3993",
          "body": "Every leaf book previously installed the upstream default MonotonicClock,\nso GTD/Day admission depended on wall time and broke sequencer replay\ndeterminism. Each manager level now carries a Shared<Option<Arc<dyn Clock>>>\n(mirroring the fee-schedule rails) with set_clock/clear_clock/clock(),\npropagat\n[…]\nd after it is set.\nCovered by GTD-admission tests at leaf/strike/underlying levels, a\nvivified-after semantics pin, and a replay-equals-live oracle run under\nan injected StubClock.\n\nRefs #147 (item 2)",
          "is_bot": false,
          "headline": "feat(book): thread an injectable engine clock through the hierarchy",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-07-12T20:22:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1e95cfeb3321e90d3cde1eba5626ec45be7d687b",
          "body": "…ction\n\nSequencedUnderlyingOrderBook::submit previously assigned a sequence\nnumber, executed the mutation, and appended the journal event as three\nunlocked steps, so concurrent callers could mutate books and journal\nout of sequence order. A per-sequencer Mutex gate now spans the whole\nsequence: jour\n[…]\n private field. Poison recovery follows the shared.rs\npolicy. Covered by concurrent-load journal-order and replay-equals-live\noracle tests plus a replay-vs-submit no-deadlock test.\n\nRefs #147 (item 1)",
          "is_bot": false,
          "headline": "feat(sequencer): serialize assign→execute→append into one critical se…",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-07-12T20:05:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "19e8e45bf122c3ebe3e1784f73e04adba2781ea6",
          "body": "feat!: journal the expiry sweep in OptionChainCommand — 0.7.0 (#144)",
          "is_bot": false,
          "headline": "Merge pull request #146 from joaquinbejar/issue-144-journal-expiry-sweep",
          "author_name": "Joaquin Bejar Garcia",
          "author_login": "joaquinbejar",
          "committed_at": "2026-07-11T10:41:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "63c1e731e53cac5308fd50781f1c79693d2b505a",
          "body": "…sult enums\n\n- OptionChainCommand and OptionChainResult are now #[non_exhaustive]:\n  downstream exhaustive matches need a one-time wildcard arm; future\n  command/result variants become source-compatible additions. Same\n  rationale and doc pattern as orderbook-rs 0.10.0's SequencerCommand.\n- New Opti\n[…]\nrip; pinned JSON\n  wire shape + old-binary rejection; unknown-field negative guards\n  extended to the new variants.\n- Version 0.6.1 -> 0.7.0 (breaking slot); CHANGELOG + MIGRATING-0.7.0.\n\nCloses #144.",
          "is_bot": false,
          "headline": "feat(sequencer)!: journal the expiry sweep; non_exhaustive command/re…",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-07-11T10:37:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a90c6776ec565c765131501ced55c629f4bce368",
          "body": "feat: surface evict_expired_orders through the hierarchy (#141)",
          "is_bot": false,
          "headline": "Merge pull request #145 from joaquinbejar/issue-141-surface-expiry-sweep",
          "author_name": "Joaquin Bejar Garcia",
          "author_login": "joaquinbejar",
          "committed_at": "2026-07-11T06:49:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "efba67f3e23a89d87f135f8aa24ea94798ae6d3b",
          "body": "Expose the engine's host-driven GTD/DAY expiry sweep (orderbook-rs\n0.10) at every level:\n\n- OptionOrderBook::evict_expired_orders(now_ms) -> Vec<OrderId>\n  (narrows the engine result to ids, mirroring expire()).\n- Aggregations mirroring the *MassCancelResult pattern: Strike, Chain,\n  Expiration, Und\n[…]\nyer via\n  SequencerCommand::EvictExpiredOrders.\n\n8 tests (leaf boundary/idempotency/order, strike, chain, underlying,\nglobal). Version stays 0.6.1 (additive; semver-checks non-breaking).\n\nCloses #141.",
          "is_bot": false,
          "headline": "feat(book): surface evict_expired_orders through the hierarchy",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-07-11T06:46:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b7c418d0d9efffc7edf3f7d5270f776d97b73d92",
          "body": "fix: per-call fill attribution for *_full methods — 0.6.1 (#140)",
          "is_bot": false,
          "headline": "Merge pull request #143 from joaquinbejar/issue-140-full-migration",
          "author_name": "Joaquin Bejar Garcia",
          "author_login": "joaquinbejar",
          "committed_at": "2026-07-11T06:24:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1f99f8fc13a3eb89a09ec8362ea9b49b88abcc0d",
          "body": "Migrate the four *_full submit methods onto the engine's per-call\nprimitives (add_limit_order_with_result / _with_user_and_result,\norderbook-rs 0.10): each call returns the TradeResult built from its\nown submission (stack-local MatchResult), so concurrent submits to the\nsame book can no longer cross\n[…]\nt matches its own order id, no lost fills); capture-arm\nindependence test updated; refcount test removed with the internals.\n\nVersion 0.6.0 -> 0.6.1. semver-checks: no breaking findings.\n\nCloses #140.",
          "is_bot": false,
          "headline": "fix(book): per-call fill attribution for *_full methods",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-07-11T06:21:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "50101c92910bc760cbedcf1b60766d47eebda1e3",
          "body": "chore(deps)!: bump orderbook-rs 0.9 → 0.10 (public dependency) — 0.6.0",
          "is_bot": false,
          "headline": "Merge pull request #142 from joaquinbejar/chore/bump-orderbook-0.10",
          "author_name": "Joaquin Bejar Garcia",
          "author_login": "joaquinbejar",
          "committed_at": "2026-07-10T14:00:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "846711ad644e778aea0c5f36f47e49eae8acac43",
          "body": "…ion 0.6.0\n\norderbook-rs is a public dependency (its types are re-exported at the\ncrate root), so moving the pin to 0.10 changes the identity of those\nre-exported types for downstream crates that also depend on orderbook-rs\ndirectly — they must move their own pin in the same update. No code\nchanges \n[…]\nt\nthis crate — it defines its own OptionChainCommand layer).\n\nAlso raise pricelevel floor to 0.8.4 (GTD ms doc fix). Follow-up #141\nfiled to surface evict_expired_orders through the wrapper hierarchy.",
          "is_bot": false,
          "headline": "chore(deps)!: bump orderbook-rs 0.9 -> 0.10 (public dependency), vers…",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-07-10T13:56:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5dcee3056af505940d8888416913456d909218e6",
          "body": "…tion\n\ndocs: add 0.5.0 CHANGELOG and migration guide",
          "is_bot": false,
          "headline": "Merge pull request #139 from joaquinbejar/chore-0.5.0-changelog-migra…",
          "author_name": "Joaquin Bejar Garcia",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-27T03:35:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6ac714c1662559f35e04efea23e2acc4ab39875f",
          "body": "First CHANGELOG for the crate, covering the full 0.4.4 -> 0.5.0 batch\n(~38 merged PRs, #90-#138) in Keep a Changelog format: breaking changes,\nadded, changed, fixed. Companion MIGRATING-0.5.0.md walks every breaking\nchange with before/after snippets and a closing migration checklist.\n\nThe breaking-c\n[…]\n0.5.0.md via Cargo.toml include\n\nVerified all 10 examples build (default + --all-features) and run to\ncompletion (exit 0, no panics), and all Criterion benches compile and\nsmoke-run with real timings.",
          "is_bot": false,
          "headline": "docs: add 0.5.0 CHANGELOG and migration guide",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-27T03:33:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "88992c3b356cea0ba3fcf916f57587e6c1b83fa5",
          "body": "tests: add proptest invariant suite (#87)",
          "is_bot": false,
          "headline": "Merge pull request #138 from joaquinbejar/issue-87-proptest-invariants",
          "author_name": "Joaquin Bejar Garcia",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-27T02:57:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b5f94e5ba62b093ff1a322a4b407d2230b64cf00",
          "body": "Property-based tests for six hierarchy invariants, public API only:\n\n- best_quote matches top-of-book on each side (price + exact best-level\n  depth, cross-checked against the order-book snapshot's top level)\n- get_or_create_* idempotency: Arc::ptr_eq across underlying / expiration /\n  strike, and l\n[…]\nll OrderId pool, and submit-biased op streams).\nDeterministic companion tests pin the one-sided / two-sided / crossing and\nconcrete mis-scope cases so coverage does not depend on the seed.\n\nCloses #87",
          "is_bot": false,
          "headline": "Add proptest invariant suite (#87)",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-27T02:53:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9a2cc39a60b9d66e910630192d9d9024749add32",
          "body": "CI: cache deps, pin actions, fix Makefile LOGLEVEL and bench-save (#85)",
          "is_bot": false,
          "headline": "Merge pull request #137 from joaquinbejar/issue-85-ci-cache-pin-makefile",
          "author_name": "Joaquin Bejar Garcia",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-27T00:36:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "358bb7cf21a072ade35d0dda3482f9c12bda8495",
          "body": "Copilot review on PR #137 (build.yml):\n\n- The cache key used ${{ runner.os }}, but the build job runs a matrix\n  over ubuntu-22.04 AND ubuntu-latest, so both images shared one target/\n  cache (runner.os == \"Linux\" for both) — restoring artifacts built on a\n  different image, a flakiness risk. Key th\n[…]\ntainer: ${{ matrix.container }}` (the matrix\n  defines no container, so it was always empty) and the now-dead\n  archlinux branch in the dependency-install step. actionlint is now\n  clean on build.yml.",
          "is_bot": false,
          "headline": "address review: per-image build cache key; drop dead container machinery",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-27T00:33:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "71ca5a322b431be019cddf68c587504340082a68",
          "body": "CI and Makefile hygiene gaps wasted minutes and misreported state.\n\nWorkflows (build, lint, format_check, tests, code_coverage):\n- Add actions/cache@v4 for ~/.cargo/registry, ~/.cargo/git and target/,\n  keyed on hashFiles('**/Cargo.lock') with a runner-os restore-key, so\n  runs no longer cold-compil\n[…]\n$(VERSION) instead of the stale hardcoded v0.3.2.\n\nAll six workflow YAMLs parse; the build.yml matrix.container actionlint\nnote is pre-existing. CI green is validated by this PR's own run.\n\nCloses #85",
          "is_bot": false,
          "headline": "CI: cache deps, pin actions, fix Makefile LOGLEVEL and bench-save (#85)",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-27T00:27:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "79c3e7ed1373b1d636b272533480edd00a425f3b",
          "body": "Add feature-gated integration tests and replay==live oracle (#86)",
          "is_bot": false,
          "headline": "Merge pull request #136 from joaquinbejar/issue-86-replay-live-oracle",
          "author_name": "Joaquin Bejar Garcia",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-27T00:19:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "956655df9cfbc6405cdd4bcf26a72fb33eee2b58",
          "body": "The integration tree had no sequencer/nats coverage, and the sequencer\nreplay tests asserted only the replayed-event count and that the sequence\nadvanced — never the binding oracle that replayed state equals live\nstate. That gap is exactly why the replay-rebuild bug (#52) went\nundetected.\n\nAdd #[cfg\n[…]\nstructs identical ids deterministically\n(creation runs in the same command order) — which the oracle relies on\nand asserts. Doc-only; the oracle is test-only (no production logic\nchanged).\n\nCloses #86",
          "is_bot": false,
          "headline": "Add feature-gated integration tests and replay==live oracle (#86)",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-27T00:12:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8106928e2a42f508ca8436eb13747f10d7229581",
          "body": "…rustdoc\n\nPackage tests/fixtures and reword get_or_create_inserted doc (#117)",
          "is_bot": false,
          "headline": "Merge pull request #135 from joaquinbejar/issue-117-package-fixtures-…",
          "author_name": "Joaquin Bejar Garcia",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T23:46:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f10421a6694cd7a9ea918a0bf188d0c6cc3cab8c",
          "body": "Three nits from PR #113/#114/#115 Copilot reviews:\n\n- (#113) sequencer.rs's journal back-compat test uses\n  include_str!(\"../../tests/fixtures/journal_event_v0.5.0.json\"), but\n  Cargo.toml's include listed tests/**/*.rs and not the fixtures, so\n  `cargo test` from a packaged tarball failed to compil\n[…]\nast-path still applies)\".\n\n(#114) The sequencer rustdoc already links the default status to\nInstrumentStatus::Active (the variant, not the type), so no change was\nneeded there — verified.\n\nCloses #117",
          "is_bot": false,
          "headline": "Package tests/fixtures and reword get_or_create_inserted doc (#117)",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T23:40:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8d544e89f21a495e5fae8602e164e89017d3f3c2",
          "body": "Refresh stale crate/module docs and regenerate README (#84)",
          "is_bot": false,
          "headline": "Merge pull request #134 from joaquinbejar/issue-84-docs-refresh",
          "author_name": "Joaquin Bejar Garcia",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T23:36:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "86246d2d8fb031492267f9c9478250a25c1ae237",
          "body": "Copilot review on PR #134: the async-opt-in limitation called the\ndefault order-submission/quote path \"lock-free\", but the OptionOrderBook\nwrapper has mutex-protected state (e.g. the opt-in trade capture's\nstd::sync::Mutex), so the unqualified claim is inaccurate. Reword: the\npath is fully synchrono\n[…]\n and the hierarchy is lock-free skip-maps +\natomics, with mutexes reserved for rarely-contended state (opt-in trade\ncapture, config holders), not the matching path. Regenerated README via\nmake readme.",
          "is_bot": false,
          "headline": "address review: don't claim the order path is \"lock-free\"",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T23:30:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2d434e4ada7d67885f8c97e3dd3d64667fd43b5a",
          "body": "Multiple docs shipped wrong information. All changes are docs/comments\nonly — zero logic or signature changes.\n\n- lib.rs Dependencies block: dropped the stale hard-coded versions\n  (orderbook-rs 0.6 / optionstratlib 0.15 / rust_decimal 1.40) and the\n  missing crates; now points at Cargo.toml for exa\n[…]\n states the engine takes a supplied IV (read from a\n  VolSurface by the integrator), not that it queries the surface itself.\n\nREADME regenerated strictly via make readme (not hand-edited).\n\nCloses #84",
          "is_bot": false,
          "headline": "Refresh stale crate/module docs and regenerate README (#84)",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T23:24:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3808a3d56fe0c30dce08242d7f9fee33c8ec1b2c",
          "body": "Add Greeks listener unsubscribe via SubscriptionId (#77)",
          "is_bot": false,
          "headline": "Merge pull request #133 from joaquinbejar/issue-77-greeks-unsubscribe",
          "author_name": "Joaquin Bejar Garcia",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T23:08:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d2177124763462d7111f0dfebfeb7d1d5d22738e",
          "body": "Copilot review on PR #133: subscribe allocated the SubscriptionId before\ntaking the listeners mutex, so under concurrent subscribe a thread with a\nlower id could push after a thread with a higher id — leaving the Vec out\nof id order and breaking the documented \"listeners fire in id order\"\ndelivery g\n[…]\nocation\nand the push are serialized: ids are handed out in the same sequence\nentries are appended, keeping the Vec ascending by id (and notify\ndelivery in id/subscription order) even under contention.",
          "is_bot": false,
          "headline": "address review: allocate the subscription id under the listeners lock",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T23:02:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cfc0e6ae705dd60eec0c8326ce94ff2b5dfe8ec0",
          "body": "Greeks listeners were append-only with no unsubscribe, so the Vec grew\nunboundedly for any caller with transient subscribers and dropped\nconsumers kept receiving callbacks (and kept their captured state alive\nvia the Arc). The sibling index_price_feed already exposes a\nSubscriptionId + unsubscribe; \n[…]\n is not\n  interchangeable.\n\nAdds a test asserting an unsubscribed listener stops receiving updates\nwhile the other keeps getting them, and that unsubscribe returns false\nfor an unknown id.\n\nCloses #77",
          "is_bot": false,
          "headline": "Add Greeks listener unsubscribe via SubscriptionId (#77)",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T22:58:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fd93de0e88efd79e0fe92160b7dca50ecb7d99aa",
          "body": "…inistic-iter\n\nAPI hygiene: must_use, deterministic Debug/iter, Greeks # Errors (#75)",
          "is_bot": false,
          "headline": "Merge pull request #132 from joaquinbejar/issue-75-api-hygiene-determ…",
          "author_name": "Joaquin Bejar Garcia",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T22:46:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6f49aa9bc23106959f8655d2783b6ef2f34270f0",
          "body": "Copilot review on PR #132 (all doc/comment precision):\n\n- SymbolIndex::symbols doc said \"iterator\" but it returns Vec<String>;\n  now \"a snapshot Vec ... in unspecified order\".\n- The expiration accessor comments said \"return type ExpirationDate\" but\n  the signature is &ExpirationDate; reworded to \"th\n[…]\nstate it avoids the DashMap shard-order nondeterminism, and\n  noted the two scalar fields are read independently (a point-in-time\n  approximation, not a consistent snapshot under concurrent mutation).",
          "is_bot": false,
          "headline": "address review: tighten doc wording (symbols/expiration/Debug)",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T22:40:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "33f7c9fe282e84100497114d43759f979aaa4fa5",
          "body": "A cluster of API-hygiene gaps default clippy does not catch:\n\n- #[must_use] on SymbolIndex::symbols (returns Vec<String>). NOT added to\n  InstrumentInfo::expiration / SymbolRef::expiration: both return\n  &ExpirationDate, and optionstratlib's ExpirationDate is itself\n  #[must_use], so a function-leve\n[…]\nbug dumps entries in arbitrary shard\n  order — keeping diagnostics deterministic too.\n\nREADME unchanged (item/module docs only). No behavior change beyond\niter()'s now-deterministic order.\n\nCloses #75",
          "is_bot": false,
          "headline": "API hygiene: must_use, deterministic Debug/iter, Greeks # Errors (#75)",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T22:34:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c789727f8e74683089615661fdfbee1c3c7a4337",
          "body": "…bsdiff\n\nDedup contract-symbol formatting and use abs_diff for ATM (#74)",
          "is_bot": false,
          "headline": "Merge pull request #131 from joaquinbejar/issue-74-symbol-dedup-atm-a…",
          "author_name": "Joaquin Bejar Garcia",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T22:22:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "36b36cf34f80de9c1409ed4a88765d66b207747e",
          "body": "The {underlying}-{exp}-{strike}-C/-P contract symbol was reconstructed via\nformat! in seven places (new, new_with_validation, create_strike_book_\nwithout_ids, create_strike_book_with_nats, assign_instrument_ids, remove,\nremove_if_empty). A divergence between the register path\n(assign_instrument_ids)\n[…]\n\n  accessors.\n\nAdds a tie-break test (spot 150 between {100,200} -> 100) and an\noverflow-regression test (spot 0 vs {100, u64::MAX} -> 100, which the old\ni64 cast would have mis-selected).\n\nCloses #74",
          "is_bot": false,
          "headline": "Dedup contract-symbol formatting and use abs_diff for ATM (#74)",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T22:16:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dd951ca335c03a91227c3c9838a17256cdf25516",
          "body": "Extract a generic Shared<T> RwLock poison-recovery wrapper (#73)",
          "is_bot": false,
          "headline": "Merge pull request #130 from joaquinbejar/issue-73-shared-rwlock-wrapper",
          "author_name": "Joaquin Bejar Garcia",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T21:59:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e64a8fa2483f095304127abb0964ee6701949d6e",
          "body": "Copilot review on PR #130: the Debug impl held the RwLock read guard\nacross the entire f.debug_struct(...).field(\"inner\", &*guard) formatting,\nwhich can block writers and deadlock if T's Debug re-enters the same lock.\nClone the value out via get() first (releasing the read lock), then\nformat the owned clone — matching the bespoke wrappers this replaced.\nBound is now T: Clone + Debug; every instantiated Shared<T> is over a\nClone type, so it compiles unchanged.",
          "is_bot": false,
          "headline": "address review: clone out of the lock before Debug-formatting Shared",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T21:54:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "df05d63e52b2ebb57ad4a0c93404e880a400298f",
          "body": "SharedFeeSchedule, SharedSTPMode, SharedValidationConfig (and the\nstructurally identical SharedContractSpecs, SharedExpiryCycleConfig) were\ncopy-pasted RwLock wrappers — each new/set/get/Default/Debug with the\nsame unwrap_or_else(|p| p.into_inner()) poison recovery — so any change to\nthe locking or \n[…]\n Debug; custom bool-only\nDebug) and SharedStrikeRangeConfigs (keyed HashMap with map-specific\nmethods) genuinely don't fit the single-value generic and are left\nbespoke, documented inline.\n\nCloses #73",
          "is_bot": false,
          "headline": "Extract a generic Shared<T> RwLock poison-recovery wrapper (#73)",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T21:48:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "944587edb392d9fb7d008d4cd8c7a4b4356d64cc",
          "body": "Deliver index price updates via bounded per-subscriber channel (#78)",
          "is_bot": false,
          "headline": "Merge pull request #129 from joaquinbejar/issue-78-feed-bounded-channel",
          "author_name": "Joaquin Bejar Garcia",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T21:24:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a112d0b84e30aaa3bd84bd231af596a9288e4a26",
          "body": "Copilot review on PR #129:\n\n- Store Arc<PriceUpdate> in the per-subscriber mailbox: set_price now\n  allocates the PriceUpdate (and its source String) once per tick and\n  each subscriber's enqueue does a cheap Arc::clone instead of a deep\n  copy that re-allocated the String per subscriber.\n- On drain\n[…]\nrk (the listener\n  runs on the drain thread), and the mailbox lock is held only for an\n  O(1) pointer swap (an Arc::clone, never across a listener call) — so\n  \"never blocks\" is precise, not absolute.",
          "is_bot": false,
          "headline": "address review: Arc mailbox, spawn-fail short-circuit, precise wording",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T21:18:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "eb3c2e270ce885a59ca19a1324455995194f94d5",
          "body": "MockPriceFeed::set_price invoked every PriceUpdateListener synchronously\non the producer's thread while holding the listeners lock, so a single\nslow or contended listener blocked the entire fan-out AND the price\nproducer — the stall the spec forbids.\n\nDecouple producer from listeners: each subscribe\n[…]\nd the async mark consistent.\n\nAdds a slow-subscriber-does-not-stall test and a drop-without-hang test;\nthe feed is not journaled or published, so async lossy delivery has no\nreplay impact.\n\nCloses #78",
          "is_bot": false,
          "headline": "Deliver index price updates via bounded per-subscriber channel (#78)",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T21:08:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "090290e568016864488732fa512247cafadd4686",
          "body": "Add structured tracing across hierarchy/greeks/lifecycle (#83)",
          "is_bot": false,
          "headline": "Merge pull request #128 from joaquinbejar/issue-83-structured-tracing",
          "author_name": "Joaquin Bejar Garcia",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T20:40:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ef67a34268952146cb9dbd1b99a23afe787862a7",
          "body": "Several subsystems emitted no tracing at all, leaving lifecycle\nmilestones and failures invisible to operators and post-incident replay\ncorrelation. Add structured-field tracing on cold paths only (creation /\ntransition / error) — never on the order-submission, per-quote, match,\nor aggregation hot p\n[…]\n across\nsubsystems. Purely additive: no behavior, control-flow, signature, or\npublic-surface change. Verified no global subscriber exists in library\ncode and no hot-path tracing was added.\n\nCloses #83",
          "is_bot": false,
          "headline": "Add structured tracing across hierarchy/greeks/lifecycle (#83)",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T20:34:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5b3514d419da4e4b33c34c94974c65694d814226",
          "body": "Prune empty account shells in GreeksAggregator (#82)",
          "is_bot": false,
          "headline": "Merge pull request #127 from joaquinbejar/issue-82-prune-empty-accounts",
          "author_name": "Joaquin Bejar Garcia",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T20:13:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fd0492e6401c34e2f075e1e55e527a0bc7660dd7",
          "body": "When an account's last position was removed, the inner HashMap was\nemptied but the outer account key stayed in the positions DashMap as a\ndead shell. These were never pruned, so an account that repeatedly\nopens/closes its only position left a permanent entry and forced\naggregate_by_underlying/aggreg\n[…]\n\nadds tests for last-position pruning, repeated open/close (no leak), a\nnon-last removal keeping the account, and the concurrent-repopulate\nordering that exercises remove_if's keep branch.\n\nCloses #82",
          "is_bot": false,
          "headline": "Prune empty account shells in GreeksAggregator (#82)",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T20:06:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8ab7ffb50dbb4e5c1ba084a019529573be34d9ee",
          "body": "…resized\n\nSingle-pass stats and pre-sized mass-cancel result Vecs (#81)",
          "is_bot": false,
          "headline": "Merge pull request #126 from joaquinbejar/issue-81-singlepass-stats-p…",
          "author_name": "Joaquin Bejar Garcia",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T19:56:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6828088a76f9c61a71da89906aa2411687f8a890",
          "body": "Copilot review on PR #126: cold_count_overflow()'s doc said it logs\n\"once\", but since checked_accumulate caps the tally at usize::MAX every\nsubsequent accumulation also overflows and would re-warn — potential log\nspam if an overflow ever occurred. Guard the warning with a process-wide\nstd::sync::Once so it logs exactly once, making the \"logs once\" doc\nliterally true. (The path is still structurally unreachable.)",
          "is_bot": false,
          "headline": "address review: guard the overflow warning with Once",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T19:50:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b21078c88132b7e3c7185f187eb0bdb9f4ca24af",
          "body": "Two traversal-perf/coherence wins in the hierarchy.\n\nPart A — single-pass stats. stats() walked the subtree three times\n(expiration_count + total_strike_count + total_order_count), each an\nindependent O(U*E*S) pass that also yielded an internally-inconsistent\nsnapshot under concurrent mutation. Add \n[…]\n shapes (leaf order_count() is called once per\nleaf either way and dominates); the change's value is the coherent\nsingle-walk snapshot and fewer allocations, confirmed as a\nnon-regression.\n\nCloses #81",
          "is_bot": false,
          "headline": "Single-pass stats and pre-sized mass-cancel result Vecs (#81)",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T19:45:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c1560fdd6ec65822a9b408604866cfac7b09c7d2",
          "body": "Adopt pricelevel newtypes in Quote and fix u128 docs (#67)",
          "is_bot": false,
          "headline": "Merge pull request #125 from joaquinbejar/issue-67-quote-newtypes",
          "author_name": "Joaquin Bejar Garcia",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T19:09:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1cc5604937302254e28c6c81320437412d5ca991",
          "body": "Copilot review on PR #125: the round-trip test matched the exact JSON\nstring, which is brittle to field-order/whitespace changes. Parse the\nserialized JSON into serde_json::Value and assert each field equals the\nexpected bare number (and is_number(), not a wrapper object) — this\nproves the #[serde(transparent)] shape robustly without depending on the\nliteral string formatting. The round-trip and legacy-JSON-deserialize\nassertions are unchanged.",
          "is_bot": false,
          "headline": "address review: assert transparent serde shape via Value, not string",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T19:03:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b8668c56c0050a709328b6cecd67e7c42f7c2788",
          "body": "Quote is a crate-owned, serialized, publicly re-exported domain DTO but\nmodeled prices as bare Option<u128>, sizes as bare u64, and the timestamp\nas bare u64, with an all-integer positional constructor that is an\narg-swap footgun in a financial type. Two doc comments also wrongly\nclaimed prices are \n[…]\nn hazard\n  (values above 2^53 lose precision parsed as an IEEE-754 double). Add\n  is_finite() guards to mid_price/spread_bps. Document the locked-book\n  spread (Some(0)) vs crossed (None).\n\nCloses #67",
          "is_bot": false,
          "headline": "Adopt pricelevel newtypes in Quote and fix u128 docs (#67)",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T18:57:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3ead9979cdfd6b7e2384f0a3703ec68921c5e4ca",
          "body": "Eliminate per-quote/per-trade allocations on the leaf hot path (#80)",
          "is_bot": false,
          "headline": "Merge pull request #124 from joaquinbejar/issue-80-leaf-hotpath-allocs",
          "author_name": "Joaquin Bejar Garcia",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T18:35:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f5f31d5209dfbd58df95e66a293e99ae7299428b",
          "body": "Copilot review on PR #124:\n\n- arm_capture_scope used swap(true) + restore-prior-on-drop, which under\n  two overlapping _full calls on the same Arc-shared book could leave\n  trade_capture_armed stuck true (reintroducing clone+lock on the hot\n  path) or flip it false mid-scope (a _full missing its own\n[…]\ns_refcount_composes covering nested scopes and the\n  no-stuck-armed property.\n- Quote doc said prices are stored as u64; the fields are Option<u128>.\n  Correct the doc: prices are u128, sizes are u64.",
          "is_bot": false,
          "headline": "address review: refcount _full capture scopes; fix Quote price-type doc",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T18:29:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "688ff142ee28f8ac4e4cfe5d8b6c1e1b2a7e5061",
          "body": "best_quote read top-of-book size via bid_depth_at_price/ask_depth_at_price,\neach calling get_volume_by_price() which iterates the whole bid AND ask\nSkipMaps and allocates two HashMaps — so one quote read did two full book\nscans and four HashMap allocations, plus Quote::new minted an unused ULID\n(clo\n[…]\ngh Arc).\n- Fix the false \"O(1) with caching\" best_quote claim in lib.rs/README.\n\nAdds a one-sided-book best_quote test and a best-level-sum test;\nCriterion best_quote cases attached above.\n\nCloses #80",
          "is_bot": false,
          "headline": "Eliminate per-quote/per-trade allocations on the leaf hot path (#80)",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T18:18:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "97d17dd93e3cdce61e2914bae5b1ef3b53f39e6c",
          "body": "…time\n\nHarden expiry-cycle config validation and adopt NaiveTime (#48)",
          "is_bot": false,
          "headline": "Merge pull request #123 from joaquinbejar/issue-48-expiry-cycle-naive…",
          "author_name": "Joaquin Bejar Garcia",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T17:55:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b4d6fff762bb39655a9d9da6618321512cd4a782",
          "body": "Copilot review on PR #123: the Default impl used\nNaiveTime::from_hms_opt(...).unwrap_or(NaiveTime::MIN), which would\nsilently fall back to midnight if the hardcoded default times were ever\nedited to an invalid value. Add a debug_assert!(t.is_some(), ...) on each\nso an invalid-constant edit is caught in debug/test builds (CI) instead of\nsilently defaulting, while release keeps the defined unwrap_or fallback\n(no banned expect/unwrap).",
          "is_bot": false,
          "headline": "address review: debug_assert the default expiry/settlement times",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T17:50:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a824e98344514ca4113659c8cf2e0ec6f224aa96",
          "body": "The expiry_cycle/scheduler config had several gaps: validate() put no\nupper bound on CycleRule.count (a deserialized count of millions /\nusize::MAX flowed into an aborting Vec::with_capacity), time-of-day was a\nraw (u32,u32) tuple requiring hand-validation at every read, and\nrefresh_from_underlying \n[…]\nt replay or the journal\nback-compat fixture (verified). The generated expiry-date schedule is\nunchanged; only the time-of-day representation changed. chrono is already\na direct dependency.\n\nCloses #48",
          "is_bot": false,
          "headline": "Harden expiry-cycle config validation and adopt NaiveTime (#48)",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T17:43:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f3ebbbb8e897299e23a03faf68537e7a7d8427f0",
          "body": "…bookscount\n\nAlign chain symbol-index wiring and books_affected unit (#79)",
          "is_bot": false,
          "headline": "Merge pull request #122 from joaquinbejar/issue-79-chain-symbolindex-…",
          "author_name": "Joaquin Bejar Garcia",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T17:23:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d3d1870778326c1ba37609f1e485f656162aa0f",
          "body": "Two manager-level inconsistencies.\n\nPart A — chain-manager symbol-index wiring. OptionChainOrderBookManager\nhad no symbol_index field or constructor (unlike StrikeOrderBookManager /\nExpirationOrderBookManager), so strikes created through this public\nmanager were never registered in a SymbolIndex wit\n[…]\ned books_affected() as strikes/expirations/underlyings, to say\n\"contract books\". books_affected is not journaled or published (only\ntotal_cancelled is), so no event/replay payload changes.\n\nCloses #79",
          "is_bot": false,
          "headline": "Align chain symbol-index wiring and books_affected unit (#79)",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T17:16:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ea23886955b2b4769908e708ed330f7873e6a1e5",
          "body": "Mark Error #[non_exhaustive] and drop dead variants (#65)",
          "is_bot": false,
          "headline": "Merge pull request #121 from joaquinbejar/issue-65-error-nonexhaustive",
          "author_name": "Joaquin Bejar Garcia",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T16:57:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b1e4ea7140feb7894c2d7862cba2bdb6efab8de3",
          "body": "The crate-wide Error enum is the canonical public error surface and is\nactively growing, but it was not #[non_exhaustive], so every new variant\nwas a SemVer break. It also carried five variants never constructed in\nproduction or test code — RiskLimitBreached, HedgingError, AdapterError,\nMarketDataEr\n[…]\nmport.\n\nQuotingError and its quoting() constructor are retained (not in the dead\nset). #[non_exhaustive] only affects external crates, so the crate's own\nexhaustive matches are unaffected.\n\nCloses #65",
          "is_bot": false,
          "headline": "Mark Error #[non_exhaustive] and drop dead aspirational variants (#65)",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T16:51:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d7d5b9ac4ffeec454ad87f300e9e8ac4352c1cce",
          "body": "Wire NATS publishers for hierarchy-created contract books (#102)",
          "is_bot": false,
          "headline": "Merge pull request #120 from joaquinbejar/issue-102-nats-lazy-books",
          "author_name": "Joaquin Bejar Garcia",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T16:44:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b1cff977132a82d8d8a17edead94906e35ab618a",
          "body": "Copilot review on PR #120 suggested adding `crate::orderbook::nats` to\nFORBIDDEN_MODULE_IMPORTS. The needles are matched as substrings, so the\nexisting `orderbook::nats` already rejects every fully-qualified form\n(`crate::orderbook::nats::…`, `self::orderbook::nats::…`); the suggested\nneedle is a strict superstring and thus redundant. Document the\nsubstring coverage on the constant so the guard's robustness is explicit\ninstead of adding a redundant needle.",
          "is_bot": false,
          "headline": "address review: document substring coverage of the nats import guard",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T16:38:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3aff1fbcb1a6ed9002d7631691ee55add4348363",
          "body": "After #58, NATS publishers attached only to a standalone OptionOrderBook\nbuilt via build_option_order_book_with_nats, because orderbook_rs\nlisteners must be installed before the Arc wrap. Contract books created\nlazily by the hierarchy (get_or_create_strike -> OptionOrderBook::new)\ngot no NATS wiring\n[…]\ne/shared file. Adds a #[cfg(feature = \"nats\")] test that a\nmatched trade on a lazily-created strike publishes to its per-contract\nsubject (observed via the listener seam, no live broker).\n\nCloses #102",
          "is_bot": false,
          "headline": "Wire NATS publishers for hierarchy-created contract books (#102)",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T16:29:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0b754a75e2e39e6103907aa004718007665471be",
          "body": "Make set_status a CAS loop to close the status race (#116)",
          "is_bot": false,
          "headline": "Merge pull request #119 from joaquinbejar/issue-116-setstatus-cas",
          "author_name": "Joaquin Bejar Garcia",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T15:41:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5791179d86b2adf171d6100fda722ed75167cc55",
          "body": "Copilot review on PR #119:\n\n- store_status doc described Pending as a state \"every book leaves at\n  construction\", but books are constructed Active. Reword: Pending is\n  unreachable because construction defaults to Active and no legal edge\n  leads back to Pending.\n- expire() doc said orders are \"swe\n[…]\n reused across all rounds\n  (two spawns total), synchronized per round by a pair of 3-party\n  barriers; the publish-the-book/assert-the-status invariant is\n  unchanged and the test now runs in ~0.07s.",
          "is_bot": false,
          "headline": "address review: fix status docs and reuse race-test threads",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T15:35:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d68a691d6b08f456012bcb63552ce4ef7f6c2cf0",
          "body": "set_status validated the transition with a status() read followed by an\nunconditional store_status — a check-then-act race. Under concurrent\ncallers the expiry-lifecycle CAS could advance a book to the terminal\nExpired between the read and the store, and set_status(Active) would\nthen clobber Expired\n[…]\nne barrier; asserts the book never ends Active after\nreaching Expired. The typed Expired -> Active rejection is covered\ndeterministically by the existing single-threaded transition tests.\n\nCloses #116",
          "is_bot": false,
          "headline": "Make OptionOrderBook::set_status a CAS loop (#116)",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T15:26:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2bb91ec89257277b61b8342e164bdee71f8d75f5",
          "body": "Remove IndexPriceFeed layering inversion (#89)",
          "is_bot": false,
          "headline": "Merge pull request #118 from joaquinbejar/issue-89-indexfeed-layering",
          "author_name": "Joaquin Bejar Garcia",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T15:11:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9d315401064955de95692be3ac7172d68ee09d4c",
          "body": "…type check)\n\nCopilot review on PR #118 flagged two gaps in the structural guard:\n\n1. CORE_HIERARCHY_FILES was a hand-maintained allowlist that omitted\n   real core files (e.g. expiration_key.rs), so a new core module could\n   start depending on pricing without tripping the test. Replace it with\n   \n[…]\npull a pricing type via the crate-root flat re-export\n   (use crate::orderbook::MarkPriceCalculator;) undetected. Add a\n   PRICING_TYPES list of distinctive pricing type names and reject those\n   too.",
          "is_bot": false,
          "headline": "address review: harden layering guard (dynamic enumeration + pricing-…",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T15:06:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "46bfa9869fc02f37270a6248816eac9f859a0749",
          "body": "The IndexPriceFeed trait lived in the pricing subsystem\n(index_price_feed.rs), yet UnderlyingOrderBook (top of the core\nhierarchy) imported it — a one-way-leaf-up violation where the\nhierarchy depended on the Greeks/pricing subsystem.\n\nRelocate ONLY the trait and the value types its signature needs\n\n[…]\nd test (tests/unit/layering_tests.rs) scans every\ncore-hierarchy/shared-service file and fails if any reintroduces an\nimport of greeks_engine/greeks_aggregator/mark_price/index_price_feed.\n\nCloses #89",
          "is_bot": false,
          "headline": "Remove IndexPriceFeed layering inversion (#89)",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T14:55:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "06aedd59e4ea25351d07618668f1d914184762aa",
          "body": "fix(expiry_scheduler): derive is_new from the atomic get-or-create result (#72)",
          "is_bot": false,
          "headline": "Merge pull request #115 from joaquinbejar/issue-72-scheduler-race",
          "author_name": "Joaquin Bejar Garcia",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T14:39:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d1c6395d0482d39bed92660d48e07aba2231c06f",
          "body": "…sult (#72)\n\nrefresh_expirations computed is_new via a separate get_expiration probe before\nget_or_create_expiration, so two concurrent refresh calls could both observe\nis_new==true for the same date, both push it into created, both invoke the\ncallback, and both run strike generation — breaking the \n[…]\nparate\nprobe, so each date is created, strike-generated, and callback'd exactly once\nunder concurrent refresh. Additive API; a 16-thread Barrier test pins the\nexactly-once create + callback guarantee.",
          "is_bot": false,
          "headline": "fix(expiry_scheduler): derive is_new from the atomic get-or-create re…",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T14:33:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "242feba7394e6e254de86df87dbff31439be826e",
          "body": "…nsitions\n\nfeat(sequencer): journal instrument-status transitions for replay (#94)",
          "is_bot": false,
          "headline": "Merge pull request #114 from joaquinbejar/issue-94-journal-status-tra…",
          "author_name": "Joaquin Bejar Garcia",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T14:27:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fce465f3158dc8728d5ba94c080294371e5026c5",
          "body": "After #52, replay rebuilt resting orders + top-of-book by routing AddOrder\nthrough get_or_create, but instrument-status transitions (halt/resume/set_status,\nvalidated by #71) were applied out of band — not journaled — so replay vivified a\nhalted strike as fresh Active and a previously-rejected AddOr\n[…]\nture is unchanged (the new variants are additive). Determinism\nre-audited: replay-safe. Out-of-band lifecycle-manager/direct status mutations\nare still not journaled (documented on replay; follow-up).",
          "is_bot": false,
          "headline": "feat(sequencer): journal instrument-status transitions for replay (#94)",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T14:21:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3142e54d30970d807b90ce1dc824ce9502ceedda",
          "body": "…nown\n\ntest(sequencer): deny_unknown_fields + journal back-compat fixture (#76)",
          "is_bot": false,
          "headline": "Merge pull request #113 from joaquinbejar/issue-76-sequencer-deny-unk…",
          "author_name": "Joaquin Bejar Garcia",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T13:54:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "90fcf4846ae8bb459354f0eef466c8cd21ce85a5",
          "body": "OptionChainEvent and its nested journal-record types are the on-disk journal\nformat, but none carried #[serde(deny_unknown_fields)] (required for internal\njournal entries where schema drift IS a bug), and there was no test decoding a\nknown-version journal sample — a silently-ignored renamed/dropped \n[…]\nbroken every existing journal; verified\nbyte-identical via the fixture + round-trip). Check in a v0.5.0 JSON fixture and\nadd decode-stability, all-variant round-trip, and unknown-field-rejected tests.",
          "is_bot": false,
          "headline": "test(sequencer): deny_unknown_fields + journal back-compat fixture (#76)",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T13:49:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "98dd5e84ee03b20d6cb43829ab2907a1e5626a98",
          "body": "fix(instrument_status): enforce the documented transition state machine (#71)",
          "is_bot": false,
          "headline": "Merge pull request #112 from joaquinbejar/issue-71-status-state-machine",
          "author_name": "Joaquin Bejar Garcia",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T13:37:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0481be63f1d1f6b57dabc2f02955b21d91c06286",
          "body": "…ne (#71)\n\ninstrument_status.rs documented Pending->Active->Halted/Settling->Expired, but\nset_status/compare_and_set_status/halt/resume/expire stored any status with no\nvalidation — so resume() reactivated an Expired book and halt() could pull a\nSettling/Expired book back to Halted, with no error.\n\n\n[…]\ns (forward to Settling/Expired via the CAS-forward\nset_all_book_status) is legal, so #61's settle/expire flow and min-based\nchain_status are unchanged. Breaking signature changes absorbed under 0.5.0.",
          "is_bot": false,
          "headline": "fix(instrument_status): enforce the documented transition state machi…",
          "author_name": "Joaquin Bejar",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T13:32:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b42f2c55964e4cd47d249ee6030010419f0758b1",
          "body": "fix(strike): make Greeks setters writable through Arc via interior mutability (#70)",
          "is_bot": false,
          "headline": "Merge pull request #111 from joaquinbejar/issue-70-greeks-interior-mut",
          "author_name": "Joaquin Bejar Garcia",
          "author_login": "joaquinbejar",
          "committed_at": "2026-06-26T13:13:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 18,
      "commits_last_year": 277,
      "latest_release_at": "2026-07-23T06:04:33Z",
      "latest_release_tag": "v0.10.0",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 9,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 11.9
    },
    "community": {
      "has_readme": true,
      "has_license": false,
      "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": "option-chain-orderbook",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "options",
            "finance",
            "trading",
            "orderbook",
            "market-making",
            "algorithms",
            "finance"
          ],
          "ecosystem": "crates",
          "matches_repo": true,
          "registry_url": "https://crates.io/crates/option-chain-orderbook",
          "is_deprecated": false,
          "latest_version": "0.10.0",
          "repository_url": "https://github.com/joaquinbejar/Option-Chain-OrderBook.git",
          "versions_count": 20,
          "total_downloads": 9823,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 2679,
          "first_published_at": "2025-12-22T17:02:45.601023Z",
          "latest_published_at": "2026-07-23T06:04:07.356706Z",
          "latest_version_yanked": false,
          "days_since_latest_publish": 0
        }
      ]
    },
    "popularity": {
      "forks": 8,
      "stars": 25,
      "watchers": 1,
      "fork_history": {
        "days": [
          {
            "date": "2025-12-23",
            "count": 2
          },
          {
            "date": "2025-12-24",
            "count": 2
          },
          {
            "date": "2026-03-02",
            "count": 1
          },
          {
            "date": "2026-03-12",
            "count": 1
          },
          {
            "date": "2026-04-21",
            "count": 1
          },
          {
            "date": "2026-05-29",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 8,
        "total_forks": 8
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "Cargo.toml"
      ],
      "largest_source_bytes": 240067,
      "source_files_sampled": 63,
      "oversized_source_files": 6,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "Cargo.toml"
      ],
      "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": [
        "crates"
      ],
      "dependencies": [
        {
          "name": "optionstratlib",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "orderbook-rs",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "async-nats",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "bytes",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "tokio",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "tracing",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "serde_json",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "serde",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "rust_decimal",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "rust_decimal_macros",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "chrono",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "thiserror",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "crossbeam-skiplist",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "dashmap",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "6.2"
        },
        {
          "name": "pricelevel",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "uuid",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        }
      ],
      "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": 62,
        "open_issues": 0,
        "closed_ratio": 1,
        "closed_issues": 55,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "joaquinbejar",
          "commits": 170,
          "avatar_url": "https://avatars.githubusercontent.com/u/99006095?v=4"
        },
        {
          "type": "User",
          "login": "j-b-layerv",
          "commits": 107,
          "avatar_url": "https://avatars.githubusercontent.com/u/253683969?v=4"
        },
        {
          "type": "User",
          "login": "dglayerv",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/254949173?v=4"
        }
      ],
      "contributors_sampled": 3,
      "top_contributor_share": 0.612
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "build.yml",
        "code_coverage.yml",
        "format_check.yml",
        "lint.yml",
        "semver.yml",
        "tests.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 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": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "8 out of 8 merged PRs checked by a CI test -- score normalized to 10",
            "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/10 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 9,
            "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 30 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 4,
            "reason": "dependency not pinned by hash detected -- score normalized to 4",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 10,
            "reason": "GitHub workflow tokens follow principle of least privilege",
            "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": "7dd6b0084e5936eb1384f7aedb90fd745ff91c88",
        "ran_at": "2026-07-23T12:39:40Z",
        "aggregate_score": 5.1,
        "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-23T06:05:36Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-13T09:20:11Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/joaquinbejar/Option-Chain-OrderBook",
    "host": "github.com",
    "name": "Option-Chain-OrderBook",
    "owner": "joaquinbejar"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 62,
      "inputs": {
        "security": 51,
        "vitality": 82,
        "community": 41,
        "governance": 64,
        "engineering": 65
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 82,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 70,
            "inputs": {
              "commits_last_year": 277,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 9
            },
            "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": "9/52 weeks with commits",
                "points": 6.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 9
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "277 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 277
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 30 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": 18,
              "latest_release_tag": "v0.10.0",
              "releases_from_tags": false,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 11.9
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "18 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 18
                    }
                  }
                ],
                "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 ~11.9 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 11.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": 41,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 29,
            "inputs": {
              "forks": 8,
              "stars": 25,
              "watchers": 1,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "25 stars",
                "points": 22.4,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 25
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "8 forks",
                "points": 7,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 8
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "1 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "at_risk",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 44,
            "inputs": {
              "has_readme": true,
              "has_license": false,
              "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": "license file present, not a recognized license",
                "points": 16.9,
                "status": "partial",
                "details": [
                  {
                    "code": "license_custom",
                    "params": {}
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "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": 57,
            "inputs": {
              "packages": [
                "option-chain-orderbook"
              ],
              "dependents": null,
              "ecosystems": "crates",
              "total_downloads": 9823,
              "monthly_downloads": 2679
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "2,679 downloads/month across crates",
                "points": 45.7,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 2679,
                      "ecosystems": "crates"
                    }
                  }
                ],
                "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": "moderate",
        "name": "Sustainability & Governance",
        "value": 64,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 25,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 3,
              "top_contributor_share": 0.612
            },
            "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 61% of commits",
                "points": 8.7,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 61
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "3 contributors",
                "points": 4.1,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "excellent",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "merged_prs": 62,
              "open_issues": 0,
              "closed_issues": 55,
              "issue_closed_ratio": 1,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "100% of issues closed",
                "points": 46.8,
                "status": "met",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "62/62 decided PRs merged",
                "points": 38.2,
                "status": "met",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 62,
                      "decided": 62
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/10 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 62,
            "inputs": {
              "followers": 288,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "joaquinbejar",
              "public_repos": 84,
              "account_age_days": 1630
            },
            "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": "288 followers of joaquinbejar",
                "points": 17.7,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 288,
                      "login": "joaquinbejar"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "84 public repos, account ~4 yr old",
                "points": 21.9,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 84
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 4
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "option-chain-orderbook"
              ],
              "ecosystems": "crates",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on crates",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "crates"
                    }
                  }
                ],
                "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": "20 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 20
                    }
                  }
                ],
                "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": "moderate",
        "name": "Engineering Quality",
        "value": 65,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "6 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 6
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "8 out of 8 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "topics": [
                "finance",
                "market-making",
                "option-pricing",
                "options",
                "options-trading",
                "orderbook",
                "trading"
              ],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "7 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 7
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 51,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "moderate",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 51,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 5.1
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "8 out of 8 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/10 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.2,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 4",
                "points": 2,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "GitHub workflow tokens follow principle of least privilege",
                "points": 7.5,
                "status": "met",
                "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": "moderate",
        "name": "AI Readiness",
        "value": 54,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "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": 55,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [
                "Cargo.toml"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile"
                    }
                  }
                ],
                "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": "Rust (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Rust"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 4",
                "points": 4,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 95,
            "inputs": {
              "primary_language": "Rust",
              "largest_source_bytes": 240067,
              "source_files_sampled": 63,
              "oversized_source_files": 6
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Rust (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Rust"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "6/63 source files over 60KB",
                "points": 49.8,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 63,
                      "oversized": 6
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "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": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "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",
    "deps.dev does not index crates:option-chain-orderbook@0.10.0; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-23T12:39:57.202646Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/j/joaquinbejar/Option-Chain-OrderBook.svg",
  "full_name": "joaquinbejar/Option-Chain-OrderBook",
  "license_state": "custom",
  "license_spdx": null
}

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 statisticscrates.io.