WIP: Experimentation w/move to Smithy#545
Conversation
Generated from src/openrpc/ via fb-gen --lang smithy, then human-reviewed for wire compatibility against production OpenRPC specs. Wire-compat fixes applied: - Device: Resolution → list<Integer> (was union of same-type arms) - Device: AudioProfiles/HDCPVersionMap field names @JsonName for dotted identifiers - Capabilities: granted result correctly optional (no @required) - SecureStorage: get result correctly optional (no @required) - Wifi: AccessPointList as wrapper struct {list:[AccessPoint]}, not bare list - Discovery: TuneChannels xrn enum member renamed + @enumValue - HDMIInput: EDIDVersion 1.4/2.0 members renamed + @enumValue - Metrics: MediaPosition → Double, EventObjectPrimitives → Document - Localization: LatLon → list<Double>, additionalInfo map value → Document All 25 drafts validated by smithy_drafts_are_wire_compatible_with_openrpc e2e test in firebolt-sdk-gen.
- accessibility: add ClosedCaptionsSettings, VoiceGuidanceSettings, StringList - advertising: add SkipRestriction enum - localization: add Locale, Language, CountryCode, TimeZone, Locality, ISO639_2Language - metrics: fix Policies::AgePolicy→AgePolicy, Types::FlatMap→FlatMap targets (19 members); add AgePolicy (string) and FlatMap (map<string,string>) shapes - discovery: fix Entertainment::* and Intents::* and Entity::* and Policies::* and Types::* targets (9 members + 2 list members); add InterestType, InterestReason, OfferingType, ProgramType, ContentIdentifiers, EntityInfo, EntityDetails, EntityInfoResult, PurchasedContentParameters, LocalizedString, NavigationIntent, AgePolicy, Entitlement shapes
…uation
- profile: Types::FlatMap→FlatMap (map<string,string>)
- voiceguidance: Accessibility::SpeechRate→SpeechRate (float)
- wifi: Types::Timeout→Timeout (integer ms)
- lifecycle: add CloseReason enum (userExit/remoteButton/done/error/mediaEnded)
add LifecycleState enum (initializing/inactive/foreground/background/suspended/unloading)
- secondscreen: Types::BooleanMap→BooleanMap (map<string,bool>)
add SecondScreenEvent structure (type/version/data)
- content: Discovery::InterestReason→InterestReason (enum)
Discovery::InterestType→InterestType (enum)
Entity::EntityDetails→EntityDetails (struct)
add ContentIdentifiers structure
All 6 modules now self-contained; smithy-canonical: 16→22 modules
…ties, usergrants) - closedcaptions: remap 14 Accessibility::*/Localization::* targets; add Color (string), FontEdge (enum/6), FontFamily (enum/7), FontSize (float), HorizontalAlignment (string), VerticalAlignment (string), Opacity (float), ISO639_2Language (string), ISO639_2LanguageList (list); also fix shape ID Localization::ISO639_2LanguageList - capabilities: add Capability (string+pattern), Role (enum: use/manage/provide), CapabilityInfo (structure), Permission (structure) - usergrants: remap 11 Capabilities::* targets; add local Capability, Role, Permission, PermissionList; fix shape ID Capabilities::PermissionList All 25 Smithy modules now self-contained. smithy-canonical: 22→25 modules
…thy spec - namespace: com.firebolt.texttospeech - 14 operations: speak, pause, resume, cancel, getspeechstate, 8 × on* events, listvoices - SpeechId and TTSStatus inlined as Integer (no cross-namespace refs) - Locale param in listvoices inlined as String - SpeechState as intEnum with named members (SPEECH_PENDING/IN_PROGRESS/PAUSED/NOT_FOUND) - 0 ext-deps: fully self-contained
… types
Three event operations had their output value members typed as
smithy.api#String. Replace with properly typed named structures:
- OnSignIn / OnSignOut: {appId: String} — matches the OpenRPC
onSignIn/onSignOut result schema ({type:object, properties:{appId:string}})
- OnRequestUserInterest: {correlationId: String, parameters: UserInterestProviderParameters}
— matches the OpenRPC Discovery.onRequestUserInterest result schema
This removes these three methods from the wire-compat allowlist in the
firebolt-sdk-gen e2e test suite.
…horing skills - Add firebolt-api-change schema with interview-driven proposal, scaled design, VERIFY-enforced tasks, and Firebolt-specific spec scaffold - Set firebolt-api-change as the default openspec schema in config.yaml - Add /opsx:new-fb-api skill and prompt — adds a new API end-to-end from plain English, no Smithy knowledge required - Add /opsx:modify-fb-api skill and prompt — modifies an existing API with breaking-change detection and confirmation gate - Register both commands in copilot-instructions.md workflow table - Update README to surface /opsx:new-fb-api and /opsx:modify-fb-api as the recommended entry points for the authoring workflow - Archive firebolt-api-change-schema change (13/13 tasks complete) - Sync delta specs: firebolt-schema-ux (new), smithy-idl-canonical (appended)
Adds an @event operation to ActionsService that fires when the platform delivers a new intent to registered listeners. Payload is the intent string. Capability: xrn:firebolt:capability:actions:intent. 215 methods total (+1). Generated C++: subscribeOnIntent() in actions.h. Also fixes tasks.md template: --lint --input does not support .smithy files; replaced with --dry-run via profile (correct Smithy validation path).
…ctions spec - Archive openspec/changes/actions-on-intent → archive/2026-05-05-actions-on-intent (all 9 tasks complete, all artifacts done) - Sync delta spec → openspec/specs/actions/spec.md - New change smithy-codegen-ci: tracks CI integration for Smithy→OpenRPC and Smithy→C++ codegen steps, plus @examples support
Full OpenSpec change for spec-driven constraint enforcement and test generation: - proposal.md: new fb-testgen crate + IR constraint propagation + C++ guards - design.md: decisions D1-D6 (IR shape, C++ idiom, Rust newtypes, test oracle, fuzz seeds, two-layer Smithy constraint sourcing) - specs/spec-driven-testgen/spec.md: normative SHALL requirements + scenarios - tasks.md: 9 task groups, 37 tasks, VERIFY steps throughout Tasks.md includes: - Docker zero-install path (QA-first, one command smoke test) - Native path (SDK contributors) - Toolchain prerequisites for both paths - Definition of done: 6 commands (docker: 1 command) - Repo-split orientation table (firebolt-sdk-gen vs firebolt-apis) - Sibling change dependency on smithy-codegen-ci
- Add SpeechRate (@range 0.1-10.0) to src/smithy/accessibility.smithy - Wire SpeechRate into src/smithy/voiceguidance.smithy (replaces TODO comment) - Archive spec-driven-testgen openspec change to openspec/changes/archive/ Implementation in firebolt-sdk-gen (separate repo): - fb-ir: Constraints struct propagated through AliasDef and Param - fb-frontend: OpenRPC schema lowering extracts min/max/length/pattern - fb-backend-cpp: Error::InvalidParams guards in setters (C++) - fb-backend-rust: TryFrom newtypes for constrained types (Rust) - fb-testgen: new crate — TestCase, MockTransport, derive_test_cases() - fb-backend-cpp/emit_tests.rs: --lang test emits <module>_test.cpp - fb-backend-rust/emit_tests.rs: --lang test emits <module>_test.rs - fb-frontend-smithy: @range/@length/@pattern trait parsing; simple scalar shapes in IDL parser
There was a problem hiding this comment.
Pull request overview
This PR advances the repo’s WIP migration toward Smithy 2.0 IDL (src/smithy/) as the canonical spec source, adds/updates OpenSpec governance artifacts and templates to support the workflow, and archives the completed spec-driven-testgen change record.
Changes:
- Add Smithy IDL module specs under
src/smithy/(including the new constrainedSpeechRatescalar and cross-namespace use fromvoiceguidance). - Formalize OpenSpec workflow governance (new schema/templates + requirements specs + RDKe profile/quirks guidance updates).
- Archive the
spec-driven-testgenchange and update docs/skills/prompts for the new authoring flow.
Reviewed changes
Copilot reviewed 85 out of 87 changed files in this pull request and generated 15 comments.
Show a summary per file
| File | Description |
|---|---|
| src/smithy/accessibility.smithy | Adds SpeechRate scalar with @range and accessibility module shapes/ops. |
| src/smithy/account.smithy | Adds Account module Smithy IDL. |
| src/smithy/acknowledgechallenge.smithy | Adds AcknowledgeChallenge module Smithy IDL. |
| src/smithy/actions.smithy | Adds Actions module Smithy IDL (incl. onIntent). |
| src/smithy/advertising.smithy | Adds Advertising module Smithy IDL. |
| src/smithy/audiodescriptions.smithy | Adds AudioDescriptions module Smithy IDL. |
| src/smithy/authentication.smithy | Adds Authentication module Smithy IDL. |
| src/smithy/capabilities.smithy | Adds Capabilities module Smithy IDL. |
| src/smithy/closedcaptions.smithy | Adds ClosedCaptions module Smithy IDL. |
| src/smithy/content.smithy | Adds Content module Smithy IDL. |
| src/smithy/device.smithy | Adds Device module Smithy IDL. |
| src/smithy/discovery.smithy | Adds Discovery module Smithy IDL. |
| src/smithy/display.smithy | Adds Display module Smithy IDL. |
| src/smithy/hdmiinput.smithy | Adds HdmiInput module Smithy IDL. |
| src/smithy/internal.smithy | Adds Internal module Smithy IDL. |
| src/smithy/keyboard.smithy | Adds Keyboard module Smithy IDL. |
| src/smithy/lifecycle.smithy | Adds Lifecycle module Smithy IDL. |
| src/smithy/lifecycle2.smithy | Adds Lifecycle2 module Smithy IDL. |
| src/smithy/localization.smithy | Adds Localization module Smithy IDL. |
| src/smithy/metrics.smithy | Adds Metrics module Smithy IDL. |
| src/smithy/network.smithy | Adds Network module Smithy IDL. |
| src/smithy/parameters.smithy | Adds Parameters module Smithy IDL. |
| src/smithy/pinchallenge.smithy | Adds PinChallenge module Smithy IDL. |
| src/smithy/presentation.smithy | Adds Presentation module Smithy IDL. |
| src/smithy/privacy.smithy | Adds Privacy module Smithy IDL. |
| src/smithy/profile.smithy | Adds Profile module Smithy IDL. |
| src/smithy/secondscreen.smithy | Adds SecondScreen module Smithy IDL. |
| src/smithy/securestorage.smithy | Adds SecureStorage module Smithy IDL. |
| src/smithy/stats.smithy | Adds Stats module Smithy IDL. |
| src/smithy/texttospeech.smithy | Adds TextToSpeech module Smithy IDL. |
| src/smithy/usergrants.smithy | Adds UserGrants module Smithy IDL. |
| src/smithy/voiceguidance.smithy | Adds VoiceGuidance module Smithy IDL; imports SpeechRate. |
| src/smithy/wifi.smithy | Adds Wifi module Smithy IDL. |
| README.md | Documents Smithy/OpenSpec workflow and RDKe authoring steps. |
| package-lock.json | Updates lockfile (dependency + workspace version bumps). |
| openspec/specs/smithy-idl-canonical/spec.md | Adds requirements describing Smithy IDL as canonical. |
| openspec/specs/rdke-howto/spec.md | Adds requirements for README prerequisites/workflow/quirks policy. |
| openspec/specs/firebolt-schema-ux/spec.md | Adds requirements for interview-driven schema UX and VERIFY task discipline. |
| openspec/specs/actions/spec.md | Adds requirements for actions.onIntent event behavior. |
| openspec/schemas/firebolt-api-change/templates/tasks.md | Adds/updates task template with VERIFY steps and conventions. |
| openspec/schemas/firebolt-api-change/templates/spec.md | Adds spec template for per-capability requirements. |
| openspec/schemas/firebolt-api-change/templates/proposal.md | Adds proposal template for interview output. |
| openspec/schemas/firebolt-api-change/templates/design.md | Adds design template (short rationale vs full design). |
| openspec/schemas/firebolt-api-change/schema.yaml | Adds the firebolt-api-change schema definition and instructions. |
| openspec/rdke.quirks.toml | Adds classified quirks guidance and overrides documentation. |
| openspec/rdke.profile.yaml | Updates RDKe composition profile to include Smithy-canonical modules. |
| openspec/config.yaml | Switches default OpenSpec schema and updates governance context for Smithy canonical workflow. |
| openspec/changes/smithy-codegen-ci/tasks.md | Adds CI integration tracking tasks for Smithy→OpenRPC/C++ generation. |
| openspec/changes/smithy-codegen-ci/.openspec.yaml | Declares schema + created date for the change. |
| openspec/changes/archive/2026-05-06-spec-driven-testgen/tasks.md | Archives the spec-driven testgen task record. |
| openspec/changes/archive/2026-05-06-spec-driven-testgen/specs/spec-driven-testgen/spec.md | Archives testgen requirements/spec. |
| openspec/changes/archive/2026-05-06-spec-driven-testgen/proposal.md | Archives testgen proposal. |
| openspec/changes/archive/2026-05-06-spec-driven-testgen/design.md | Archives testgen design doc. |
| openspec/changes/archive/2026-05-06-spec-driven-testgen/.openspec.yaml | Archives testgen schema metadata. |
| openspec/changes/archive/2026-05-05-update-readme-with-full-explanation-howto/tasks.md | Archives README-update change tasks. |
| openspec/changes/archive/2026-05-05-update-readme-with-full-explanation-howto/specs/smithy-idl-canonical/spec.md | Archives README-update specs (smithy canonical). |
| openspec/changes/archive/2026-05-05-update-readme-with-full-explanation-howto/specs/rdke-howto/spec.md | Archives README-update specs (RDKe howto). |
| openspec/changes/archive/2026-05-05-update-readme-with-full-explanation-howto/proposal.md | Archives README-update proposal. |
| openspec/changes/archive/2026-05-05-update-readme-with-full-explanation-howto/design.md | Archives README-update design. |
| openspec/changes/archive/2026-05-05-update-readme-with-full-explanation-howto/.openspec.yaml | Archives README-update schema metadata. |
| openspec/changes/archive/2026-05-05-migrate-smithy-ast-to-idl/tasks.md | Archives Smithy AST→IDL migration task record. |
| openspec/changes/archive/2026-05-05-migrate-smithy-ast-to-idl/specs/smithy-idl-canonical/spec.md | Archives migration requirements/spec. |
| openspec/changes/archive/2026-05-05-migrate-smithy-ast-to-idl/proposal.md | Archives migration proposal. |
| openspec/changes/archive/2026-05-05-migrate-smithy-ast-to-idl/design.md | Archives migration design. |
| openspec/changes/archive/2026-05-05-migrate-smithy-ast-to-idl/.openspec.yaml | Archives migration schema metadata. |
| openspec/changes/archive/2026-05-05-firebolt-api-change-schema/tasks.md | Archives schema-work change tasks. |
| openspec/changes/archive/2026-05-05-firebolt-api-change-schema/specs/smithy-idl-canonical/spec.md | Archives schema-work smithy-canonical spec. |
| openspec/changes/archive/2026-05-05-firebolt-api-change-schema/specs/firebolt-schema-ux/spec.md | Archives schema-work UX spec. |
| openspec/changes/archive/2026-05-05-firebolt-api-change-schema/proposal.md | Archives schema-work proposal. |
| openspec/changes/archive/2026-05-05-firebolt-api-change-schema/design.md | Archives schema-work design. |
| openspec/changes/archive/2026-05-05-firebolt-api-change-schema/.openspec.yaml | Archives schema-work metadata. |
| openspec/changes/archive/2026-05-05-actions-on-intent/tasks.md | Archives actions-onIntent change tasks. |
| openspec/changes/archive/2026-05-05-actions-on-intent/specs/actions/spec.md | Archives actions-onIntent spec. |
| openspec/changes/archive/2026-05-05-actions-on-intent/proposal.md | Archives actions-onIntent proposal. |
| openspec/changes/archive/2026-05-05-actions-on-intent/design.md | Archives actions-onIntent design. |
| openspec/changes/archive/2026-05-05-actions-on-intent/.openspec.yaml | Archives actions-onIntent metadata. |
| openspec/changes/.gitkeep | Keeps changes directory in git when empty. |
| .vscode/llm-server-port | Adds VS Code local port file. |
| .github/skills/openspec-propose/SKILL.md | Adds OpenSpec propose skill documentation. |
| .github/skills/openspec-explore/SKILL.md | Adds OpenSpec explore skill documentation. |
| .github/skills/openspec-archive-change/SKILL.md | Adds OpenSpec archive skill documentation. |
| .github/skills/openspec-apply-change/SKILL.md | Adds OpenSpec apply skill documentation. |
| .github/skills/new-fb-api/SKILL.md | Adds end-to-end new API skill documentation. |
| .github/skills/modify-fb-api/SKILL.md | Adds end-to-end modify API skill documentation. |
| .github/prompts/new-fb-api.prompt.md | Adds prompt entrypoint for new API flow. |
| .github/prompts/modify-fb-api.prompt.md | Adds prompt entrypoint for modify API flow. |
| .github/copilot-instructions.md | Adds OpenSpec authoring guidance for Copilot usage. |
| structure AccessPointList { | ||
| list: AccessPointList | ||
| } |
| structure ScanInput { | ||
| timeout: Timeout | ||
| } |
| structure InitializeInput { | ||
| @required | ||
| version: Types::SemanticVersion | ||
| } |
| - parameters | ||
| - pinchallenge | ||
| - privacy | ||
| - securestorage | ||
| - text_to_speech | ||
|
|
| structure MemoryInfo { | ||
| @required | ||
| gpuMemoryLimit: Integer | ||
| @required | ||
| gpuMemoryUsed: Integer | ||
| @required | ||
| userMemoryLimit: Integer | ||
| @required | ||
| userMemoryUsed: Integer |
| // TODO: alias AgePolicy = String (Smithy has no direct alias — use a newtype structure or inline the target) | ||
|
|
||
| enum ErrorType { | ||
| ENTITLEMENT = "entitlement" | ||
| MEDIA = "media" | ||
| NETWORK = "network" | ||
| OTHER = "other" | ||
| RESTRICTION = "restriction" | ||
| } | ||
|
|
||
| structure EventObject { | ||
| @required | ||
| value: EventObjectPrimitivesMap | ||
| } | ||
|
|
||
| union EventObjectPrimitives { | ||
| stringValue: String | ||
| doubleValue: Double | ||
| intValue: Integer | ||
| boolValue: Boolean | ||
| } | ||
|
|
||
| // TODO: alias MediaPosition = Double (Smithy has no direct alias — use a newtype structure or inline the target) | ||
|
|
| @@ -0,0 +1 @@ | |||
| 3000 | |||
| > **Native / multi-language SDK authors:** See [Adding a new Firebolt API and generating client language bindings](#adding-a-new-firebolt-api-and-generating-client-language-bindings) below — `src/smithy/` is the canonical source for all language bindings generated by `fb-gen` (C++, Rust, JS). | ||
|
|
||
| ## Adding a new Firebolt API and generating client language bindings | ||
|
|
||
| Firebolt APIs are client bindings that let apps — whether browser-based JS or native (C++, Rust) — make Firebolt JSON-RPC calls. The Smithy IDL in `src/smithy/` is the canonical source for all such bindings generated by `fb-gen`. | ||
|
|
||
| > For the upstream `@firebolt-js/*` npm packages produced by the separate OpenRPC/npm pipeline, see [Authoring APIs](#authoring-apis) above. |
| structure ConnectedOutput { | ||
| @required | ||
| value: Connected | ||
| } | ||
|
|
||
| // TODO: alias Connected = Boolean (Smithy has no direct alias — use a newtype structure or inline the target) |
| structure SupportedInput { | ||
| @required | ||
| capability: Capability | ||
| } | ||
|
|
|
MFOS standalone sanity report - CORE,MANAGE,DISCOVERY: |
- src/smithy/device.smithy: add room @propertyReadonly operation - src/smithy/firebolt.smithy: new firebolt module with serverVersion @propertyReadonly - openspec/rdke.profile.yaml: add firebolt to smithy-canonical layer - openspec/schemas/firebolt-api-change: add test generation gate (task group 4) to template - openspec/changes/device-get-room: full change artifacts + all gates verified - openspec/changes/firebolt-server-version: full change artifacts + all gates verified
|
MFOS standalone sanity report - CORE,MANAGE,DISCOVERY: |
openspec/ and .github/skills|prompts|copilot-instructions.md have moved to the firebolt-forge workspace repo where they belong. firebolt-forge is the single source of truth for the rdke composition profile, change workflow artifacts, and Copilot skill instructions. Remaining in firebolt-apis: .github/workflows/ (CI for upstream), .github/fca/, .github/mock-firebolt/, .github/codeql/, .github/dependabot.yml
|
MFOS standalone sanity report - CORE,MANAGE,DISCOVERY: |
| structure AccessPointList { | ||
| list: AccessPointList | ||
| } |
| structure ScanInput { | ||
| timeout: Timeout | ||
| } |
| structure InitializeInput { | ||
| @required | ||
| version: Types::SemanticVersion | ||
| } |
| @required | ||
| navigationHints: Boolean | ||
| @required | ||
| rate: Double |
| src/openrpc/ # Upstream OpenRPC JSON — reference/fallback, do not hand-edit | ||
| src/schemas/ # Shared JSON Schema definitions | ||
| src/sdks/ # npm workspace packages (generated — do not hand-edit build/ or dist/) | ||
| openspec/ # Change management (proposals, designs, tasks, specs) |
| IFS=',' read -ra MOD_LIST <<< "$MODULES" | ||
| MISSING_HEAD=0 | ||
|
|
||
| for mod in "${MOD_LIST[@]}"; do | ||
| mod="$(echo "$mod" | tr -d ' ')" | ||
| git -C "$APIS_DIR" show "${BASE_REF}:src/openrpc/${mod}.json" \ | ||
| > "$HEAD_SPECS_DIR/${mod}.json" 2>/dev/null || { | ||
| log "$mod: not found at $BASE_REF — new module, skipping type compat check for this module" | ||
| MISSING_HEAD=1 | ||
| } | ||
| done | ||
|
|
||
| # Copy schemas from HEAD for the type generation | ||
| for schema_file in "$APIS_DIR/src/schemas/"*.json; do | ||
| fname="$(basename "$schema_file")" | ||
| git -C "$APIS_DIR" show "${BASE_REF}:src/schemas/${fname}" \ | ||
| > "$TMPDIR_B/head-schemas/src/schemas/${fname}" 2>/dev/null || \ | ||
| cp "$schema_file" "$TMPDIR_B/head-schemas/src/schemas/${fname}" 2>/dev/null || true | ||
| done | ||
|
|
||
| # Generate TypeScript types from HEAD specs using firebolt-openrpc | ||
| # We use the core SDK workspace as the target for type generation | ||
| HEAD_SDK_DIR="$TMPDIR_B/head-sdk" | ||
| mkdir -p "$HEAD_SDK_DIR" | ||
|
|
||
| # Generate HEAD compiled OpenRPC | ||
| FIREBOLT_OPENRPC=$(cd "$APIS_DIR" && node -e "require.resolve('@firebolt-js/openrpc')" 2>/dev/null || true) | ||
| OPENRPC_BIN="$APIS_DIR/node_modules/.bin/firebolt-openrpc" | ||
|
|
| @@ -0,0 +1 @@ | |||
| 3000 | |||
| value: Connected | ||
| } | ||
|
|
||
| // TODO: alias Connected = Boolean (Smithy has no direct alias — use a newtype structure or inline the target) |
| // TODO: alias CountryCode = String (Smithy has no direct alias — use a newtype structure or inline the target) | ||
|
|
||
| // TODO: alias ISO639_2Language = String (Smithy has no direct alias — use a newtype structure or inline the target) | ||
|
|
||
| // TODO: alias Language = String (Smithy has no direct alias — use a newtype structure or inline the target) | ||
|
|
||
| // TODO: alias Locale = String (Smithy has no direct alias — use a newtype structure or inline the target) | ||
|
|
||
| // TODO: alias Locality = String (Smithy has no direct alias — use a newtype structure or inline the target) | ||
|
|
||
| // TODO: alias TimeZone = String (Smithy has no direct alias — use a newtype structure or inline the target) |
| structure OnWillspeakInput { | ||
| @required | ||
| SpeechId: SpeechIdEvent | ||
| } |
|
MFOS standalone sanity report - CORE,MANAGE,DISCOVERY: |
Annotate 42 operations across 5 modules based on the reference OpenRPC JSON capability tags (x-uses / x-manages / rpc-only): - display.smithy: @rpcOnly on maxResolution, @capability(display:info) on videoResolutions and colorimetry - device.smithy: @capability on all 17 operations (id, distributor, platform, uid, type, model, sku, make, hdcp, hdr, audio, screenResolution, videoResolution, name, onDeviceNameChanged, network); @capability(manages) on provision - accessibility.smithy: @capability on closedCaptions, closedCaptionsSettings, highContrastUI, voiceGuidance, voiceGuidanceSettings, audioDescriptionSettings - localization.smithy: @capability on 11 operations including @Manages on addAdditionalInfo and removeAdditionalInfo - lifecycle.smithy: @capability(lifecycle:state) on close and all 5 events
|
MFOS standalone sanity report - CORE,MANAGE,DISCOVERY: |
| structure AccessPointList { | ||
| list: AccessPointList | ||
| } |
| // TODO: alias Timeout = Integer (Smithy has no direct alias — use a newtype structure or inline the target) | ||
|
|
| structure InitializeInput { | ||
| @required | ||
| version: Types::SemanticVersion | ||
| } |
| // TODO: alias HDMIPortId = String (Smithy has no direct alias — use a newtype structure or inline the target) | ||
|
|
| @property | ||
| operation speed { | ||
| input: SpeedInput |
| // TODO: alias AgePolicy = String (Smithy has no direct alias — use a newtype structure or inline the target) | ||
|
|
| @required | ||
| navigationHints: Boolean | ||
| @required | ||
| rate: Double |
| structure ServerVersionOutput { | ||
| /// The Firebolt server version string, e.g. "2.3.1" | ||
| @required | ||
| value: String | ||
| } |
| IFS=',' read -ra MOD_LIST <<< "$MODULES" | ||
| MISSING_HEAD=0 | ||
|
|
||
| for mod in "${MOD_LIST[@]}"; do | ||
| mod="$(echo "$mod" | tr -d ' ')" | ||
| git -C "$APIS_DIR" show "${BASE_REF}:src/openrpc/${mod}.json" \ | ||
| > "$HEAD_SPECS_DIR/${mod}.json" 2>/dev/null || { | ||
| log "$mod: not found at $BASE_REF — new module, skipping type compat check for this module" | ||
| MISSING_HEAD=1 | ||
| } | ||
| done |
| src/smithy/ # Canonical Smithy 2.0 IDL specs — one .smithy file per module (edit these) | ||
| src/openrpc/ # Upstream OpenRPC JSON — reference/fallback, do not hand-edit | ||
| src/schemas/ # Shared JSON Schema definitions | ||
| src/sdks/ # npm workspace packages (generated — do not hand-edit build/ or dist/) | ||
| openspec/ # Change management (proposals, designs, tasks, specs) |
|
You are seeing this message because GitHub Code Scanning has recently been set up for this repository, or this pull request contains the workflow file for the Code Scanning tool. What Enabling Code Scanning Means:
For more information about GitHub Code Scanning, check out the documentation. |
Summary
Phase 1 of the
spec-driven-testgenchange: constraint enforcement baked intogenerated C++ and Rust bindings, plus an automated test file generator driven by
the spec's own bounds.
All code changes are in
rdk-e/firebolt-sdk-gen(pushed to main). This PR coversthe Smithy spec additions and the openspec change archive.
Spec changes
src/smithy/accessibility.smithy— AddSpeechRatescalar shape with@range(min: 0.1, max: 10.0)src/smithy/voiceguidance.smithy— ReferenceSpeechRatevia cross-namespaceuse; remove TODO commentopenspec/changes/— Archivespec-driven-testgen→archive/2026-05-06-spec-driven-testgen/What shipped in firebolt-sdk-gen
fb-irConstraintsstruct (min/max/length/pattern) onAliasDefandParamconstraints_from_schema()reads JSON Schema constraint keywordsError::InvalidParamsguards emitted in setters before the transport callTryFrom<Inner>newtypes for constrained aliasesfb-testgencrateTestCase,MockTransport,derive_test_cases(method)--lang test<module>_test.cppand<module>_test.rsper module@range/@length/@patternparsed natively; scalar shapes (float SpeechRate) supported in built-in IDL parserNot in this PR