[{"data":1,"prerenderedAt":557},["ShallowReactive",2],{"navigation":3,"\u002Fstation-runtime\u002Fcaptured-values":134,"\u002Fstation-runtime\u002Fcaptured-values-surround":552},[4,16,38,80,112,129],{"title":5,"path":6,"stem":7,"children":8,"icon":10},"Get started","\u002Fgetting-started","1.getting-started\u002F1.index",[9,11],{"title":5,"path":6,"stem":7,"icon":10},"i-lucide-rocket",{"title":12,"path":13,"stem":14,"icon":15},"Your first station run","\u002Fgetting-started\u002Ffirst-run","1.getting-started\u002F2.first-run","i-lucide-play",{"title":17,"path":18,"stem":19,"children":20,"icon":22},"Core concepts","\u002Fcore-concepts","2.core-concepts\u002F1.index",[21,23,28,33],{"title":17,"path":18,"stem":19,"icon":22},"i-lucide-boxes",{"title":24,"path":25,"stem":26,"icon":27},"Projects and access","\u002Fcore-concepts\u002Fprojects-and-access","2.core-concepts\u002F2.projects-and-access","i-lucide-users",{"title":29,"path":30,"stem":31,"icon":32},"Roles and permissions","\u002Fcore-concepts\u002Froles-and-permissions","2.core-concepts\u002F3.roles-and-permissions","i-lucide-shield-check",{"title":34,"path":35,"stem":36,"icon":37},"Custom roles","\u002Fcore-concepts\u002Fcustom-roles","2.core-concepts\u002F4.custom-roles","i-lucide-user-cog",{"title":39,"path":40,"stem":41,"children":42,"icon":44},"Station runtime","\u002Fstation-runtime","3.station-runtime\u002F1.index",[43,45,50,55,60,65,70,75],{"title":39,"path":40,"stem":41,"icon":44},"i-lucide-circuit-board",{"title":46,"path":47,"stem":48,"icon":49},"Configure a station","\u002Fstation-runtime\u002Fconfiguration","3.station-runtime\u002F2.configuration","i-lucide-file-code-2",{"title":51,"path":52,"stem":53,"icon":54},"Custom stages","\u002Fstation-runtime\u002Fcustom-stages","3.station-runtime\u002F3.custom-stages","i-lucide-puzzle",{"title":56,"path":57,"stem":58,"icon":59},"Credentials and secrets","\u002Fstation-runtime\u002Fcredentials-and-secrets","3.station-runtime\u002F4.credentials-and-secrets","i-lucide-key-round",{"title":61,"path":62,"stem":63,"icon":64},"Multiple lanes","\u002Fstation-runtime\u002Fmultiple-lanes","3.station-runtime\u002F5.multiple-lanes","i-lucide-git-branch",{"title":66,"path":67,"stem":68,"icon":69},"Capture DUT values","\u002Fstation-runtime\u002Fcaptured-values","3.station-runtime\u002F6.captured-values","i-lucide-list-checks",{"title":71,"path":72,"stem":73,"icon":74},"Validate configuration","\u002Fstation-runtime\u002Fvalidation","3.station-runtime\u002F7.validation","i-lucide-file-check-2",{"title":76,"path":77,"stem":78,"icon":79},"Upgrade a station","\u002Fstation-runtime\u002Fupgrading","3.station-runtime\u002F8.upgrading","i-lucide-package-check",{"title":81,"path":82,"stem":83,"children":84,"icon":86},"Production workflows","\u002Fproduction-workflows","4.production-workflows\u002F1.index",[85,87,92,97,102,107],{"title":81,"path":82,"stem":83,"icon":86},"i-lucide-factory",{"title":88,"path":89,"stem":90,"icon":91},"Applications and firmware","\u002Fproduction-workflows\u002Ffirmware-images","4.production-workflows\u002F2.firmware-images","i-lucide-cpu",{"title":93,"path":94,"stem":95,"icon":96},"DUT records and IDs","\u002Fproduction-workflows\u002Fdut-records-and-ids","4.production-workflows\u002F3.dut-records-and-ids","i-lucide-scan-barcode",{"title":98,"path":99,"stem":100,"icon":101},"Results and logs","\u002Fproduction-workflows\u002Fresults-and-logs","4.production-workflows\u002F4.results-and-logs","i-lucide-chart-no-axes-combined",{"title":103,"path":104,"stem":105,"icon":106},"Operator kiosk","\u002Fproduction-workflows\u002Foperator-kiosk","4.production-workflows\u002F5.operator-kiosk","i-lucide-monitor",{"title":108,"path":109,"stem":110,"icon":111},"DUT capture history","\u002Fproduction-workflows\u002Fdut-capture-history","4.production-workflows\u002F6.dut-capture-history","i-lucide-history",{"title":113,"path":114,"stem":115,"children":116,"icon":118},"Reference","\u002Freference","5.reference\u002F1.index",[117,119,124],{"title":113,"path":114,"stem":115,"icon":118},"i-lucide-book-open",{"title":120,"path":121,"stem":122,"icon":123},"API access","\u002Freference\u002Fapi-access","5.reference\u002F2.api-access","i-lucide-braces",{"title":125,"path":126,"stem":127,"icon":128},"Troubleshooting","\u002Freference\u002Ftroubleshooting","5.reference\u002F3.troubleshooting","i-lucide-life-buoy",{"title":130,"path":131,"stem":132,"icon":133},"Changelog","\u002Fchangelog","6.changelog","i-lucide-scroll-text",{"id":135,"title":66,"body":136,"description":545,"extension":546,"links":547,"meta":548,"navigation":549,"path":67,"seo":550,"stem":68,"__hash__":551},"docs\u002F3.station-runtime\u002F6.captured-values.md",{"type":137,"value":138,"toc":538},"minimark",[139,143,148,156,234,250,257,318,333,337,340,357,372,381,392,396,452,455,465,469,476,496,499,503,510,525,534],[140,141,142],"p",{},"Station runtime v0.3.0 can attach named values to test reports on HTF v0.1.4. Use captures for identifiers or measurements that should be searchable without parsing console logs. Each observation keeps its DUT, run, lane, stage, optional subtest, capture time, and configuration revision.",[144,145,147],"h2",{"id":146},"map-a-built-in-stage-output","Map a built-in stage output",[140,149,150,151,155],{},"Add a ",[152,153,154],"code",{},"capture"," mapping to a stage. The mapping's key is the report field; its value is the output produced by that stage:",[157,158,163],"pre",{"className":159,"code":160,"language":161,"meta":162,"style":162},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","stages:\n  - name: Read hardware ID\n    kind: hardware_id\n    programmer: jlink_1\n    capture:\n      device.hardware_id: hardware_id\n","yaml","",[152,164,165,178,194,205,216,224],{"__ignoreMap":162},[166,167,170,174],"span",{"class":168,"line":169},"line",1,[166,171,173],{"class":172},"swJcz","stages",[166,175,177],{"class":176},"sMK4o",":\n",[166,179,181,184,187,190],{"class":168,"line":180},2,[166,182,183],{"class":176},"  -",[166,185,186],{"class":172}," name",[166,188,189],{"class":176},":",[166,191,193],{"class":192},"sfazB"," Read hardware ID\n",[166,195,197,200,202],{"class":168,"line":196},3,[166,198,199],{"class":172},"    kind",[166,201,189],{"class":176},[166,203,204],{"class":192}," hardware_id\n",[166,206,208,211,213],{"class":168,"line":207},4,[166,209,210],{"class":172},"    programmer",[166,212,189],{"class":176},[166,214,215],{"class":192}," jlink_1\n",[166,217,219,222],{"class":168,"line":218},5,[166,220,221],{"class":172},"    capture",[166,223,177],{"class":176},[166,225,227,230,232],{"class":168,"line":226},6,[166,228,229],{"class":172},"      device.hardware_id",[166,231,189],{"class":176},[166,233,204],{"class":192},[140,235,236,237,240,241,245,246,249],{},"Configure ",[152,238,239],{},"jlink_1"," locally with a supported target as described in ",[242,243,244],"a",{"href":47},"Station configuration",". Only explicit captures are persisted; other context outputs remain available to later stages. If this stage does not produce ",[152,247,248],{},"hardware_id",", HTF records a capture warning. It does not reuse an earlier stage's output or change the hardware outcome.",[140,251,252,253,256],{},"An existing ",[152,254,255],{},"infuse_validation_rtt"," stage can capture modem outputs with this mapping; retain its programmer, transport, and test settings:",[157,258,260],{"className":159,"code":259,"language":161,"meta":162,"style":162},"capture:\n  modem.imei: validation.modem.imei\n  sim.iccid: validation.modem.iccid\n  sim.imsi: validation.modem.imsi\n  modem.model: validation.modem.model\n  modem.firmware_version: validation.modem.firmware_version\n",[152,261,262,268,278,288,298,308],{"__ignoreMap":162},[166,263,264,266],{"class":168,"line":169},[166,265,154],{"class":172},[166,267,177],{"class":176},[166,269,270,273,275],{"class":168,"line":180},[166,271,272],{"class":172},"  modem.imei",[166,274,189],{"class":176},[166,276,277],{"class":192}," validation.modem.imei\n",[166,279,280,283,285],{"class":168,"line":196},[166,281,282],{"class":172},"  sim.iccid",[166,284,189],{"class":176},[166,286,287],{"class":192}," validation.modem.iccid\n",[166,289,290,293,295],{"class":168,"line":207},[166,291,292],{"class":172},"  sim.imsi",[166,294,189],{"class":176},[166,296,297],{"class":192}," validation.modem.imsi\n",[166,299,300,303,305],{"class":168,"line":218},[166,301,302],{"class":172},"  modem.model",[166,304,189],{"class":176},[166,306,307],{"class":192}," validation.modem.model\n",[166,309,310,313,315],{"class":168,"line":226},[166,311,312],{"class":172},"  modem.firmware_version",[166,314,189],{"class":176},[166,316,317],{"class":192}," validation.modem.firmware_version\n",[140,319,320,321,324,325,328,329,332],{},"The validator exports ",[152,322,323],{},"VAL"," fields as ",[152,326,327],{},"validation.\u003Ctest>.\u003Cfield>"," and recognises modem ",[152,330,331],{},"INFO"," identifiers. A MODEM PASS can verify modem values even if another subtest fails. Contradictory modem values remain unverified.",[144,334,336],{"id":335},"capture-in-a-custom-stage","Capture in a custom stage",[140,338,339],{},"After reading a value from your hardware, call the stage context:",[157,341,345],{"className":342,"code":343,"language":344,"meta":162,"style":162},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","context.capture(\"modem.imei\", imei)\ncontext.capture(\"sim.iccid\", iccid)\n","python",[152,346,347,352],{"__ignoreMap":162},[166,348,349],{"class":168,"line":169},[166,350,351],{},"context.capture(\"modem.imei\", imei)\n",[166,353,354],{"class":168,"line":180},[166,355,356],{},"context.capture(\"sim.iccid\", iccid)\n",[140,358,359,360,363,364,367,368,371],{},"Return the usual ",[152,361,362],{},"StageResult",". Captures inherit the stage's pass\u002Ffail outcome by default. Set ",[152,365,366],{},"verified=True"," with ",[152,369,370],{},"subtest=\"MODEM\""," only after that subtest successfully validates the value:",[157,373,375],{"className":342,"code":374,"language":344,"meta":162,"style":162},"context.capture(\"modem.imei\", imei, verified=True, subtest=\"MODEM\")\n",[152,376,377],{"__ignoreMap":162},[166,378,379],{"class":168,"line":169},[166,380,374],{},[140,382,383,384,387,388,391],{},"Captures that inherit a failed or interrupted stage outcome remain unverified. An explicitly verified successful subtest can still contribute values when the overall stage fails or is interrupted. Conflicting values within a stage are always unverified. Use separate keys, such as ",[152,385,386],{},"bluetooth.hardware_id"," and ",[152,389,390],{},"modem.hardware_id",", for different components or parallel lanes.",[144,393,395],{"id":394},"field-limits","Field limits",[397,398,399,412],"table",{},[400,401,402],"thead",{},[403,404,405,409],"tr",{},[406,407,408],"th",{},"Item",[406,410,411],{},"Limit",[413,414,415,428,436,444],"tbody",{},[403,416,417,421],{},[418,419,420],"td",{},"Field key",[418,422,423,424,427],{},"Up to 128 characters; lowercase names such as ",[152,425,426],{},"modem.imei",", with letters, digits, and underscores in each segment. Each segment starts with a letter.",[403,429,430,433],{},[418,431,432],{},"Value",[418,434,435],{},"A non-empty string or integer, stored as a string; up to 512 UTF-16 code units on the server.",[403,437,438,441],{},[418,439,440],{},"Subtest name",[418,442,443],{},"Up to 128 UTF-16 code units on the server.",[403,445,446,449],{},[418,447,448],{},"Observations",[418,450,451],{},"Up to 64 per stage and 1,024 per run.",[140,453,454],{},"Pass long identifiers and values with leading zeros as strings. ASCII characters each use one UTF-16 unit; characters such as many emoji use two. The Python runtime counts Unicode code points, so a value or subtest with those characters can pass its local length check and still exceed the server limit.",[140,456,457,460,461,464],{},[152,458,459],{},"context.capture()"," returns ",[152,462,463],{},"False"," and adds a warning for an invalid value or a local limit violation; the hardware result remains intact. Identical captures with the same metadata within a stage are coalesced. Keep credentials out of captures as well as logs.",[144,466,468],{"id":467},"inspect-a-local-result","Inspect a local result",[140,470,471,472,475],{},"A caller of ",[152,473,474],{},"run_once()"," can inspect structured data directly:",[157,477,479],{"className":342,"code":478,"language":344,"meta":162,"style":162},"report = result.report()           # JSON-ready stages, observations, and warnings\nvalues = result.captured_values    # Successful values from this run\nobservations = result.observations\n",[152,480,481,486,491],{"__ignoreMap":162},[166,482,483],{"class":168,"line":169},[166,484,485],{},"report = result.report()           # JSON-ready stages, observations, and warnings\n",[166,487,488],{"class":168,"line":180},[166,489,490],{},"values = result.captured_values    # Successful values from this run\n",[166,492,493],{"class":168,"line":196},[166,494,495],{},"observations = result.observations\n",[140,497,498],{},"Calls without a server run ID retain captures in this local result but omit them from MQTT messages. Use a run started through HTF for production capture history.",[144,500,502],{"id":501},"keep-reports-across-disconnects","Keep reports across disconnects",[140,504,505,506,509],{},"Capture-bearing messages are written to ",[152,507,508],{},".htf-cache\u002Freport-outbox\u002F\u003Cstation-id>"," before upload. Keep the directory on persistent storage, writable by the station account. Listening stations retry after disconnects and restarts, with backoff from 10 seconds to 10 minutes. The station removes a report only after the server acknowledges its database commit.",[140,511,512,513,516,517,520,521,524],{},"Permanent rejections move to ",[152,514,515],{},"rejected\u002F"," with the original envelope and reason. The active queue holds 10,000 reports; additional messages wait in ",[152,518,519],{},"deferred\u002F",". Provide disk space for all three directories. A disk-write failure logs ",[152,522,523],{},"report_storage_failed"," and attempts live delivery, but that report has no durable disk copy. Captures are persisted at stage completion or interruption, rather than at every hardware read.",[140,526,527,528,530,531,533],{},"See ",[242,529,108],{"href":109}," to inspect reports, retests, and identifier changes. Follow ",[242,532,76],{"href":77}," before enabling captures on an existing jig.",[535,536,537],"style",{},"html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":162,"searchDepth":169,"depth":180,"links":539},[540,541,542,543,544],{"id":146,"depth":180,"text":147},{"id":335,"depth":180,"text":336},{"id":394,"depth":180,"text":395},{"id":467,"depth":180,"text":468},{"id":501,"depth":180,"text":502},"Add structured identifiers and measurements to a DUT test report.","md",null,{},{"icon":69},{"title":66,"description":545},"-KQHaeLkfAWvNebpY2Pi4mWkD1hQo5qr2Ddne97vZq8",[553,555],{"title":61,"path":62,"stem":63,"description":554,"icon":64,"children":-1},"Run independent programmers on one jig and coordinate shared DUT steps.",{"title":71,"path":72,"stem":73,"description":556,"icon":74,"children":-1},"Diagnose runtime YAML and check a plan before it touches hardware.",1791170922914]