Repository navigation
feat: feature-floors table + shipped checker core, lean floor contract (0.33.0) - #197
Merged
Merged
Conversation
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
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
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.# definespellings).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_exceptionsand the earlierbuilt_with_sdkstamp are gone;PluginDescriptorgains optionalsuggested_sdk_versionfrom the manifest.min_plotjuggler_versionis deprecated in the release policy (abi_majoris the generation gate); decoders keep reading it.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