Skip to content

Release 0.8.0: macOS 27.2 fm support and accurate decode metrics - #9

Merged
dvnold merged 3 commits into
mainfrom
release-0.8.0
Oct 7, 2026
Merged

dvnold merged 3 commits into
mainfrom
release-0.8.0

Conversation

@dvnold

@dvnold dvnold commented Oct 7, 2026

Copy link
Copy Markdown
Owner

Summary

Verified on real hardware: macOS 27.2 (26B5091g), Apple M5 Pro, /usr/bin/fm.

  • macOS 27.2 fm: availability and model identity (system = AFM 3 Core Advanced) come from fm models, with a fallback to available on 27.0. Previously system only looked available because the available deprecation warning sat next to the model name. Full reasons are kept (for example pcc: "…Please use the Terminal app."), doctor checks fm license --status, and compare warns when the model identity changes.
  • Measurement accuracy:
    • TPOT and decode rate use only tokens after the first delivery (fm puts about 20 tokens in its first chunk), and write bursts under 5 ms count as one delivery. The interactive profile previously reported 10,000+ tok/s; long generations now measure about 52 tok/s.
    • Output tokens drop the one framing token that count-tokens adds.
    • CV is now run-to-run stability per prompt (42% → 2–3% on a real run), and DECODE/S is token-weighted.
    • One warmup run by default.
  • CLI: typo guard for commands and flags (modles → models, --rnus → --runs); doctor output is aligned.
  • Platform and CI: Node 22+ (Node 20 is end of life), CI on Node 22/24/26, SHA-pinned least-privilege workflows, npm trusted publishing with token fallback, a post-publish install check, and Version now dispatches Release.

See CHANGELOG.md for details.

Verification

  • npm run check on Node 22, 24, and 26 (175 tests)
  • actionlint
  • Real fm: doctor, models, --runs 3, --profile interactive|throughput, --sweep-concurrency 1,2 --ci with SLOs, --output-dir --export-html, validate, export, compare, history, the pcc unavailable path, typo guard
  • CHANGELOG.md and docs updated

Made with Cursor

dvnold and others added 3 commits October 7, 2026 22:46
macOS 27.2 renamed `fm available` to `fm models`; `system` only looked
available because the deprecation warning put the word next to the model
name. Read availability and model identity from one `fm models` call (with
an `available` fallback), drop fm `warning:` lines before parsing, and keep
full reasons such as the Private Cloud Compute "use the Terminal app" hint.

Measurement fixes found on real hardware:
- TPOT/decode now use only tokens after the first delivery (fm emits ~20
  tokens in its first chunk), and write bursts under 5 ms are one delivery.
- Output token counts drop the constant framing token count-tokens adds,
  calibrated once per run.
- The CV column is run-to-run CV per prompt instead of the pooled spread
  across different prompts; DECODE/S is token-weighted.
- One warmup per model by default.

Also: model identity in reports/compare, doctor license check, command and
flag typo suggestions, macOS 27.2 fixtures, and a 27.2-shaped fake fm.

Co-authored-by: Cursor <cursoragent@cursor.com>
…hing

- CI matrix covers Node 22, 24, and 26 (Node 20 is end of life), smoke-tests
  both fm surfaces, and reports one aggregate ci status.
- Least-privilege permissions, SHA-pinned actions, job timeouts, no
  dependency cache in publish jobs.
- Release publishes via npm trusted publishing (OIDC) with an NPM_TOKEN
  fallback, still writes release notes when publishing fails but then fails
  visibly, and installs the published package to verify it.
- Version dispatches Release, since a GITHUB_TOKEN tag push never did.
- Links and release notes point at dvnold/fm-bench.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Copilot AI balanced review requested due to automatic review settings October 7, 2026 20:47

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 7, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-07T20:50:50.245688Z 1d9b191 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@dvnold
dvnold merged commit 3d3f93e into main Oct 7, 2026
4 checks passed
@dvnold
dvnold deleted the release-0.8.0 branch October 7, 2026 20:49

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 1d9b191d96

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/compare.js
Comment on lines +84 to +90
// Compare the run-to-run CV only when both reports carry it; otherwise fall
// back to the suite-wide latency CV on both sides so the definitions match.
function comparableCv(before, after) {
const bothStable = before && after && Object.hasOwn(before, 'stabilityCv') && Object.hasOwn(after, 'stabilityCv');
return bothStable
? [before.stabilityCv, after.stabilityCv]
: [before?.latency?.cv, after?.latency?.cv];

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Warn before comparing incompatible pre-0.8 metrics

When a 0.7.x report and a 0.8.0 report use identical suite settings (for example, both explicitly set --warmup 1), suiteMatch remains true and --strict accepts the comparison. This fallback aligns the changed CV definition, but TPOT is still compared even though 0.7.x used outputTokens - 1 and process-exit timing while 0.8.0 uses tokens after the first delivery and ends at the last delivery; output token rates also changed through framing-overhead removal. The resulting percentages can therefore be presented as regressions or improvements with no compatibility warning, so cross-version comparisons should be warned/rejected or those incompatible fields suppressed.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants