Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
98 changes: 98 additions & 0 deletions dag/extdeps/instrument/fs_box_v3_v4_v5_faq.dag
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
module extdeps.instrument.fs_box_v3_v4_v5_faq

import std.types { Bool, List, NonEmptyStr }
import std.decl_ref { DeclarationRef, WholeDeclaration }
import extdeps.external_authority {
ExternalAuthority, ExternalModelScope, ExternalSubjectRef,
CitedFigureStanding, CitedToAuthority,
}
import extdeps.uri { Uri, Https }

// FS'S PUBLISHED FS BOX V3 & V4 & V5 FAQ (filename date 2026-08-24). This is a separately
// governed publication from the V4 data sheet. It is mostly service and account POLICY as FS
// printed it, which still belongs here as a citation of that publication: inventing a second
// "our policy" copy in workflow would nickname the same document. What THIS FLEET does with the
// terms is a product join (product.fs_box_published_claims). Free-BOX spend-tier campaign
// pricing was read and is not declared: it is a marketing offer with no executing consumer in
// this change. Account trial/freeze/buffer and the BOX Pro review window are cited because a live
// FS BOX account is a prerequisite of the programming intervention, and BOX Pro's writable-field
// split is what keeps byte 192 from being read out of this FAQ.
//
// THE FAQ DOES NOT GROUND LEG PROGRAMMING. It has no hits for disconnect, individually, breakout,
// QSFP56, EEPROM, byte 192, or 0x40. "Offline" is the internet requirement, not write recovery.

data extdeps_external_authority_anchor: ExternalAuthority = ExternalAuthority {
uri: Uri {
scheme: Https
locator: "resource.fs.com/mall/resource/fs-box-v3v4v5-faq-20260824100858.pdf"
}
}

type FsBoxV3V4V5Faq {
online_configuration_fields: List<NonEmptyStr>
box_pro_fields: List<NonEmptyStr>
box_pro_customization_review: NonEmptyStr
custom_compatible_brand_requires_engineering_approval: Bool
third_party_modules_supported: Bool
reconfiguration_not_supported: List<NonEmptyStr>
works_offline: Bool
operating_systems: List<NonEmptyStr>
browsers: List<NonEmptyStr>
trial_period: NonEmptyStr
trial_frozen_on_expiry: Bool
formal_account_buffer: NonEmptyStr
standing: CitedFigureStanding
}

data fs_box_v3_v4_v5_faq: FsBoxV3V4V5Faq = FsBoxV3V4V5Faq {
online_configuration_fields: [
"compatible brands" as NonEmptyStr,
"SN" as NonEmptyStr,
],
box_pro_fields: [
"Compatible Brands" as NonEmptyStr,
"Vendor names" as NonEmptyStr,
"P/N" as NonEmptyStr,
"S/N" as NonEmptyStr,
],
box_pro_customization_review: "1-2 working days" as NonEmptyStr,
custom_compatible_brand_requires_engineering_approval: true,
third_party_modules_supported: false,
reconfiguration_not_supported: [
"HPE-compatible SFP+/SFP28/XFP/QSFP+/QSFP28 transceivers" as NonEmptyStr,
"all 40G BiDi transceivers" as NonEmptyStr,
"GPON transceivers" as NonEmptyStr,
"25G SFP28 Loopback Modules" as NonEmptyStr,
],
works_offline: false,
operating_systems: [
"Windows 10 or later" as NonEmptyStr,
"macOS 10.13 or later" as NonEmptyStr,
"Android 5.0 or later" as NonEmptyStr,
"iOS 11.0 or later" as NonEmptyStr,
],
browsers: [
"Google Chrom(68 or newer)" as NonEmptyStr,
"Firefox" as NonEmptyStr,
],
trial_period: "seven-day" as NonEmptyStr,
trial_frozen_on_expiry: true,
formal_account_buffer: "24-hour" as NonEmptyStr,
standing: CitedToAuthority { authority: extdeps_external_authority_anchor },
}

fn fs_box_faq_lists_box_pro_field(name: NonEmptyStr) -> Bool {
any(fs_box_v3_v4_v5_faq.box_pro_fields, f => (f as String) == (name as String))
}

data extdeps_model_scope: ExternalModelScope = ExternalModelScope {
subject: ExternalSubjectRef {
declaration: DeclarationRef {
module_path: "extdeps.instrument.fs_box_v3_v4_v5_faq",
decl_name: "fs_box_v3_v4_v5_faq",
field: WholeDeclaration
}
},
first_citation: extdeps_external_authority_anchor,
further_citations: []
}
174 changes: 174 additions & 0 deletions dag/extdeps/instrument/fs_box_v4.dag
Original file line number Diff line number Diff line change
@@ -0,0 +1,174 @@
module extdeps.instrument.fs_box_v4

import std.types { Bool, Int, List, NonEmptyStr }
import std.measure {
Micrometer, Millivolt, Celsius, Minute, Gram, Coulomb,
micrometer, millivolt, celsius, minute, gram, coulomb,
}
import std.decl_ref { DeclarationRef, WholeDeclaration }
import extdeps.external_authority {
ExternalAuthority, ExternalModelScope, ExternalSubjectRef,
CitedFigureStanding, CitedToAuthority,
}
import extdeps.uri { Uri, Https }

// FS BOX V4, THE ORDERABLE MULTI-FUNCTIONAL TRANSCEIVER TOOL KIT, as its 2023 data sheet states
// it. Per DESIGN section 3's external upstream decomposition this module owns this one product.
// The V3/V4/V5 FAQ is a separately published document and lives in
// extdeps.instrument.fs_box_v3_v4_v5_faq; a browser or OS list here is the data sheet's list, not
// a merge. The current fs.com catalog page is not a citation of this module: a fetch of
// www.fs.com/c/fs-box-3389 returned a JavaScript robot-check with no form-factor table, so that
// page is unread rather than an Unobserved property of this product.
//
// NO FS COMPANY ENTITY IS MINTED HERE. Same standing as extdeps.transceiver.fs_145681: no FS
// legal name was read from these documents as a citable legal-entity line.
//
// WHAT THIS MODULE DOES NOT CLAIM. The data sheet does not mention QSFP56, SFP56, breakout legs,
// per-leg programming, disconnection, write recoverability, EEPROM bytes, or NVIDIA (ETH)
// coding. Those absences are the point of reading it. Length, voltage, temperature and endurance
// use std.measure carriers: 28.7 mm is 28700 micrometres, 3.7 V is 3700 millivolts,
// 9 h / 3.5 h are 540 / 210 minutes, 0.2 kg is gram(200), 3200 mAh is coulomb(11520).
// The V3 line on the ordering table is a row of THIS document, not a V3 product module.

data extdeps_external_authority_anchor: ExternalAuthority = ExternalAuthority {
uri: Uri {
scheme: Https
locator: "resource.fs.com/mall/doc/20230224114704wojcth.pdf"
}
}

type FsBoxV4Size {
height: Micrometer
width: Micrometer
depth: Micrometer
}

type FsBoxV4Supply {
battery: Millivolt
usb: Millivolt
}

type FsBoxV4Temperature {
minimum: Celsius
maximum: Celsius
}

type FsBoxOrderingLine {
part_number: NonEmptyStr
description: NonEmptyStr
}

type FsBoxV4DataSheet {
product_name: NonEmptyStr
supported_form_factors: List<NonEmptyStr>
configurable_media: NonEmptyStr
operating_systems: List<NonEmptyStr>
browsers: List<NonEmptyStr>
customization_fields: List<NonEmptyStr>
data_connector: NonEmptyStr
bluetooth_protocol: NonEmptyStr
charging_connector: NonEmptyStr
power: FsBoxV4Supply
battery_capacity: Coulomb
battery_endurance_low_power_sfp: Minute
battery_endurance_high_power_qsfp_dd: Minute
battery_endurance_condition: NonEmptyStr
case_material: NonEmptyStr
size: FsBoxV4Size
mass: Gram
operating_temperature: FsBoxV4Temperature
ordering: List<FsBoxOrderingLine>
warranty: NonEmptyStr
standing: CitedFigureStanding
}

data fs_box_v4_data_sheet: FsBoxV4DataSheet = FsBoxV4DataSheet {
product_name: "FS BOX V4" as NonEmptyStr,
supported_form_factors: [
"SFP" as NonEmptyStr,
"SFP+" as NonEmptyStr,
"SFP28" as NonEmptyStr,
"XFP" as NonEmptyStr,
"QSFP+" as NonEmptyStr,
"QSFP28" as NonEmptyStr,
"QSFP-DD" as NonEmptyStr,
],
configurable_media: "FS transceivers and DAC/AOC cables with rates from 100M to 400G" as NonEmptyStr,
operating_systems: [
"Windows (10 or newer)" as NonEmptyStr,
"Mac OS (10.13 or newer)" as NonEmptyStr,
"Android (5.0 or newer)" as NonEmptyStr,
"IOS (11.0 or newer)" as NonEmptyStr,
],
browsers: ["Chrome (68 or newer)" as NonEmptyStr],
customization_fields: [
"part number" as NonEmptyStr,
"compatible brand" as NonEmptyStr,
"serial number" as NonEmptyStr,
"vendor name" as NonEmptyStr,
],
data_connector: "Bluetooth or USB Type-C" as NonEmptyStr,
bluetooth_protocol: "Bluetooth Specification V4.2 BLE" as NonEmptyStr,
charging_connector: "USB Type-C" as NonEmptyStr,
power: FsBoxV4Supply {
battery: millivolt(count: 3700),
usb: millivolt(count: 5000),
},
battery_capacity: coulomb(count: 11520),
battery_endurance_low_power_sfp: minute(count: 540),
battery_endurance_high_power_qsfp_dd: minute(count: 210),
battery_endurance_condition: "without interrupting configuration" as NonEmptyStr,
case_material: "Rubber, Polycarbonate" as NonEmptyStr,
size: FsBoxV4Size {
height: micrometer(count: 28700),
width: micrometer(count: 73500),
depth: micrometer(count: 160000),
},
mass: gram(count: 200),
operating_temperature: FsBoxV4Temperature {
minimum: celsius(count: -10),
maximum: celsius(count: 50),
},
ordering: [
FsBoxOrderingLine {
part_number: "FS BOX V4" as NonEmptyStr,
description: "FS BOX V4, Multi-Functional Transceiver Tool Kit, Support FS Transceivers & DAC/AOC Cables, Red" as NonEmptyStr,
},
FsBoxOrderingLine {
part_number: "FS BOX V4" as NonEmptyStr,
description: "FS BOX V4, Multi-Functional Transceiver Tool Kit, Support FS Transceivers & DAC/AOC Cables, Yellow" as NonEmptyStr,
},
FsBoxOrderingLine {
part_number: "FS BOX V3" as NonEmptyStr,
description: "FS BOX V3, Multi-Functional Transceiver Tool Kit, Support FS Transceivers & DAC/AOC Cables" as NonEmptyStr,
},
],
warranty: "5-year limited warranty against defects in materials or workmanship" as NonEmptyStr,
standing: CitedToAuthority { authority: extdeps_external_authority_anchor },
}

fn fs_box_v4_data_sheet_lists_form_factor(name: NonEmptyStr) -> Bool {
any(fs_box_v4_data_sheet.supported_form_factors, f => (f as String) == (name as String))
}

fn fs_box_v4_ordering_names_part(name: NonEmptyStr) -> Bool {
any(fs_box_v4_data_sheet.ordering, line => (line.part_number as String) == (name as String))
}

fn fs_box_v4_color_sku_count() -> Int {
fs_box_v4_data_sheet.ordering
|> filter(line => (line.part_number as String) == "FS BOX V4")
|> count
}

data extdeps_model_scope: ExternalModelScope = ExternalModelScope {
subject: ExternalSubjectRef {
declaration: DeclarationRef {
module_path: "extdeps.instrument.fs_box_v4",
decl_name: "fs_box_v4_data_sheet",
field: WholeDeclaration
}
},
first_citation: extdeps_external_authority_anchor,
further_citations: []
}
2 changes: 2 additions & 0 deletions dag/gunbc/extdeps_scope_frontier.dag
Original file line number Diff line number Diff line change
Expand Up @@ -326,6 +326,8 @@ data scope_carrier_paths: List<String> = [
"dag/extdeps/github/push_event.dag",
"dag/extdeps/instrument/pip_boy_3000.dag",
"dag/extdeps/instrument/pip_boy_3000_mk_v.dag",
"dag/extdeps/instrument/fs_box_v4.dag",
"dag/extdeps/instrument/fs_box_v3_v4_v5_faq.dag",
"dag/extdeps/linux/edac.dag",
"dag/extdeps/linux/kernel.dag",
"dag/extdeps/linux/proc_self_cgroup.dag",
Expand Down
13 changes: 9 additions & 4 deletions dag/gunbc/product/breakout_leg_programming.dag
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ import extdeps.transceiver.sff_8636 {
sff8636_interpret_extended_compliance,
}
import extdeps.transceiver.fs_145681 { FsBreakoutCablePart }
import extdeps.instrument.fs_box_v4 { fs_box_v4_data_sheet }
import product.fs_box_published_claims { current_fs_box_internet_constraint_instruction }
import product.cable_order_admission { CableLinkRequirement }

// WHAT IT COSTS THIS FLEET, BY HAND, TO USE A GENERIC BREAKOUT WHERE A DUAL-COMPATIBILITY ONE WAS NOT
Expand Down Expand Up @@ -58,13 +60,13 @@ type LegProgrammingProcedure {
}

data fs_box_v4_leg_programming: LegProgrammingProcedure = LegProgrammingProcedure {
tool: "FS BOX V4" as NonEmptyStr,
tool: fs_box_v4_data_sheet.product_name,
legs_programmable_individually: true,
requires_disconnect_from_both_ends: true,
interrupted_write_recoverable: true,
duration_per_leg: "a few minutes" as NonEmptyStr,
standing: TranscribedUncited {
read_obligation: "FS's published FS BOX V4 user guide stating per-leg programming of QSFP56 breakout legs, disconnection from both ends, and recovery by re-flash after an interrupted write; until then these four properties rest on FS sales correspondence of 2026-09-11" as NonEmptyStr
read_obligation: "FS BOX V4 Data Sheet (resource.fs.com/mall/doc/20230224114704wojcth.pdf, copyright 2023) and FS BOX V3&V4&V5 FAQ (resource.fs.com/mall/resource/fs-box-v3v4v5-faq-20260824100858.pdf) were read; neither states per-leg programming of QSFP56 breakout legs, disconnection from both ends, recoverability after an interrupted write, or duration per leg. The data sheet's uses of interrupting are battery-endurance sentences only. Until a published user guide states those four properties, they rest on FS sales correspondence of 2026-09-11" as NonEmptyStr
},
}

Expand Down Expand Up @@ -98,7 +100,10 @@ fn breakout_leg_programming_intervention(procedure: LegProgrammingProcedure) ->
identity: "breakout-leg-nvidia-eth-reprogram" as HumanInterventionIdentity,
frequency: DeviceOnce,
subject: "each QSFP56 leg of a generic-coded QSFP-DD breakout serving a ConnectX-7",
instruction: leg_programming_instruction(procedure: procedure),
instruction: concat(
leg_programming_instruction(procedure: procedure),
current_fs_box_internet_constraint_instruction(),
),
completion_evidence: NoDischargeSiteModeled,
}
}
Expand Down Expand Up @@ -129,7 +134,7 @@ data fs_nvidia_eth_leg_coding: VendorAssertedLegCoding = VendorAssertedLegCoding
coding_profile: "NVIDIA (ETH)" as NonEmptyStr,
extended_compliance_code: 64,
standing: TranscribedUncited {
read_obligation: "an EEPROM read (ethtool -m <dev> raw on) of a leg after an NVIDIA (ETH) re-flash, showing byte 192 at 0x40; until then the value rests on FS sales correspondence of 2026-09-11" as NonEmptyStr
read_obligation: "an EEPROM read (ethtool -m <dev> raw on) of a leg after an NVIDIA (ETH) re-flash, showing byte 192 at 0x40; the V4 data sheet and V3/V4/V5 FAQ do not mention byte 192, 0x40, or NVIDIA (ETH) coding, so they do not ground this value; until then it rests on FS sales correspondence of 2026-09-11" as NonEmptyStr
},
}

Expand Down
70 changes: 70 additions & 0 deletions dag/gunbc/product/fs_box_published_claims.dag
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
module product.fs_box_published_claims

import std.types { Bool, List, NonEmptyStr }
import extdeps.transceiver.sff_8636 {
TransceiverIdentifier, QsfpPlus, Qsfp28, QsfpDd, IdentifierUnmodelled,
}
import extdeps.instrument.fs_box_v4 {
fs_box_v4_data_sheet, fs_box_v4_data_sheet_lists_form_factor,
}
import extdeps.instrument.fs_box_v3_v4_v5_faq {
fs_box_v3_v4_v5_faq, fs_box_faq_lists_box_pro_field,
}

// JOIN OVER THE TWO CITED FS BOX PUBLICATIONS, NEVER A MERGED SUPPORT LIST.
//
// The 2023 V4 data sheet and the 2026 V3/V4/V5 FAQ disagree on browsers (Chrome-only vs
// Chrome-and-Firefox) and spell the OS list differently. A single "supported" roster would be a
// claim neither document makes. QSFP56 is the same shape: the data sheet omits it; the FAQ never
// names it; this fleet's delivered legs report SFF identifier 0x11 (QSFP28), which the data sheet
// DOES list. Sales correspondence that the QSFP56 legs are programmable stays in
// product.breakout_leg_programming as TranscribedUncited. The fs.com catalog page is not a third
// merged list: a fetch of www.fs.com/c/fs-box-3389 returned a JavaScript robot-check and no
// form-factor table, so the page is unread, not silently listed.
//
// BOX Pro's writable fields are vendor-name / P/N / S/N / compatible-brand as the FAQ printed them.
// They do not include an extended-compliance byte. That is why
// product.breakout_leg_programming's 0x40 claim cannot climb off sales correspondence by reading
// these two documents.

fn qsfp56_named_on_v4_data_sheet() -> Bool {
fs_box_v4_data_sheet_lists_form_factor(name: "QSFP56" as NonEmptyStr)
}

fn sff_identifier_named_on_v4_data_sheet(id: TransceiverIdentifier) -> Bool {
match id {
QsfpPlus => fs_box_v4_data_sheet_lists_form_factor(name: "QSFP+" as NonEmptyStr)
Qsfp28 => fs_box_v4_data_sheet_lists_form_factor(name: "QSFP28" as NonEmptyStr)
QsfpDd => fs_box_v4_data_sheet_lists_form_factor(name: "QSFP-DD" as NonEmptyStr)
IdentifierUnmodelled { code: c } => false
}
}

fn browsers_name_firefox(browsers: List<NonEmptyStr>) -> Bool {
any(browsers, b => (b as String) == ("Firefox" as String))
}

fn faq_lists_firefox() -> Bool {
browsers_name_firefox(browsers: fs_box_v3_v4_v5_faq.browsers)
}

fn datasheet_lists_firefox() -> Bool {
browsers_name_firefox(browsers: fs_box_v4_data_sheet.browsers)
}

fn faq_attests_extended_compliance_rewrite() -> Bool {
fs_box_faq_lists_box_pro_field(name: "extended compliance" as NonEmptyStr)
|| fs_box_faq_lists_box_pro_field(name: "byte 192" as NonEmptyStr)
}

fn fs_box_internet_constraint_instruction(works_offline: Bool) -> NonEmptyStr {
if works_offline {
"The FS BOX may be used offline. " as NonEmptyStr
} else {
"Keep a stable internet connection: the FS BOX V3/V4/V5 FAQ states the tool does not work offline. " as NonEmptyStr
}
}

fn current_fs_box_internet_constraint_instruction() -> NonEmptyStr {
fs_box_internet_constraint_instruction(works_offline: fs_box_v3_v4_v5_faq.works_offline)
}
Loading
Loading