Skip to content

feat: feature-floors table + shipped checker core, lean floor contract (0.33.0) - #197

Merged
facontidavide merged 5 commits into
mainfrom
feat/feature-floors
Sep 6, 2026
Merged

facontidavide merged 5 commits into
mainfrom
feat/feature-floors

Conversation

@facontidavide

@facontidavide facontidavide commented Sep 6, 2026 •

Copy link
Copy Markdown
Contributor

SDK half of the floor-checker program (design plan; plugins half: pj-official-plugins#296).

  • pj_base/feature_floors.json — host-contract surface → introducing release, compact version-grouped shape. Host surfaces only (static-lib helpers never constrain the floor). 113 inventoried surfaces (6 above the 0.28.0 baseline), every attribution tag-verified; the count matches an independent Clang inventory.
  • tools/feature_floors/feature_floor_check.py — the reusable checker core, shipped in the package beside the table (one schema parser for the whole program; CLI for out-of-tree plugin authors, documented in the plugin skill). The CI gate imports it; the install test loads the shipped table through the shipped checker.
  • Anti-rot guard — inventory extractor + snapshot + ctest gate: an unclassified new surface fails the SDK's own PR CI; host-contract changelog lines are checked in the unreleased section only; duplicate classifications rejected. Extractor hardened per a Codex correctness review (top-level members only, colormap/settings vtables included, plugin-provided extension ids excluded, typedef/whitespace/# define spellings).
  • The lean manifest contract (validated by the core): min_sdk_required (everything above it must be runtime-negotiated; hard surfaces force the floor) · suggested_sdk_version (required and exact — max introducing release over all matched surfaces — iff any exceeds the floor) · floor_test (one named test proving the plugin functions against a floor-level host). sdk_floor_exceptions and the earlier built_with_sdk stamp are gone; PluginDescriptor gains optional suggested_sdk_version from the manifest. min_plotjuggler_version is deprecated in the release policy (abi_major is the generation gate); decoders keep reading it.
  • Versioning docs: SDK version is build identity; the table carries compatibility semantics; each release declares Host contract: unchanged/extended (this one: unchanged).

Validation: 97/97 tests (gate: OK: 113 surfaces, 6 above-floor entries), install test PASSED, pre-commit clean. Reviewed: 4-angle /simplify + Codex correctness (10 findings, all resolved or made moot). Rides the next 0.33.0 release.

🤖 Generated with Claude Code

https://claude.ai/code/session_01TTJvEsHX26rG4cHmqppvQg

pj_base/feature_floors.json is the authoritative map from host-contract
surface to the SDK release that introduced it — the authority a plugin
floor checker validates min_sdk_required against. Host surfaces only:
client-side static-library helpers compile into the plugin and never
constrain the host floor. Six post-baseline surfaces (completion trio of
flags + complete_ingest/discard_parser_ingest at 0.30.0,
set_dataset_metadata at 0.32.0) plus a 106-entry 0.28.0 baseline, every
attribution verified against release tags.

tools/feature_floors/ keeps it honest: extract_host_surfaces.py
inventories host vtable members, versioned service ids and flag macros
into a checked-in snapshot, and check_feature_floors.py (ctest
feature_floors_check) fails when a new surface is unclassified, when
classifications go out of bounds, or when a host-contract extension
lacks its changelog line. The table installs to
share/plotjuggler_sdk/feature_floors.json (test_sdk_install.sh step 7).

Every .pjmanifest.json now carries built_with_sdk — informational
provenance for host diagnostics, never an admission criterion —
decoded into PluginDescriptor as an optional field.

Release policy docs now state the rule the table encodes: the SDK
version is build identity; feature_floors.json carries compatibility
semantics; each release's changelog declares 'Host contract:
unchanged/extended'.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TTJvEsHX26rG4cHmqppvQg
facontidavide and others added 3 commits September 6, 2026 23:07
Surfaces group under since/<release>; an entry maps identifier ->
declaration ("" when the declaration IS the identifier, as with flag
macros); negotiated defaults to true, a hard surface uses the object
form. Groups at or below minimum_supported_floor are rejected — those
belong in baseline. No doc blob: the schema is documented by the
validator and the release-policy docs.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TTJvEsHX26rG4cHmqppvQg
The host floor is independent of the build SDK (static-lib helpers never
raise it); adopting a host surface newer than the floor means raising it
or declaring a tested sdk_floor_exceptions entry.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TTJvEsHX26rG4cHmqppvQg
tools/feature_floors/feature_floor_check.py is now the single owner of
the table schema, the C++ source scan, verdict math, and manifest
validation — installed to share/plotjuggler_sdk/ beside
feature_floors.json, with a CLI for out-of-tree plugin authors. The CI
gate imports it, so a schema change is one atomic edit.

The manifest contract is lean: min_sdk_required (every matched host
surface above it must be runtime-negotiated; hard surfaces always force
the floor), suggested_sdk_version (required and exactly the max
introducing release over all matched surfaces when any exceeds the
floor, forbidden otherwise), and floor_test (one named test proving the
plugin functions against a floor-level host). sdk_floor_exceptions is
rejected with a migration message. suggested_sdk_version replaces the
never-shipped built_with_sdk manifest stamp — declared and validated
rather than build-derived. min_plotjuggler_version is deprecated in the
release policy (abi_major is the generation gate); the decoder keeps
reading it.

Extractor rebuilt on review findings: top-level vtable members only (no
callback-parameter ghosts), colormap/settings vtables included,
plugin-provided extension ids excluded, typedef/whitespace/#-define
spellings handled — 113 surfaces, matching an independent Clang count.
The gate counts duplicate declarations, couples host-contract changelog
lines to the unreleased section only, and validates the table shape
strictly. Install test loads the shipped table through the shipped
checker.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TTJvEsHX26rG4cHmqppvQg
@facontidavide facontidavide changed the title feat: feature-floors table, inventory CI guard, built_with_sdk stamp (0.33.0) feat: feature-floors table + shipped checker core, lean floor contract (0.33.0) Sep 6, 2026
Match vtable surfaces by both the wrapper identifier and the ABI member
token (direct C-ABI spellings count as usage; above-floor surfaces only
— baseline member names would match ordinary C++). Blank string and
char literal contents like comments so prose naming a surface is not
usage. floor_test lookup uses the same preprocessing as scanning, so a
spliced-comment or raw-string TEST() cannot satisfy it. Known
limitations (token pasting, runtime-surface scope) documented. Drop two
accidentally tracked .pyc files and ignore __pycache__.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TTJvEsHX26rG4cHmqppvQg
@facontidavide
facontidavide merged commit 5ca9d06 into main Sep 6, 2026
4 checks passed
@facontidavide
facontidavide deleted the feat/feature-floors branch September 6, 2026 22:21
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.

1 participant