@@ -83,12 +83,12 @@ def setUpClass(cls) -> None:
8383 REPO_ROOT / "tools" / "web" / "README.md"
8484 ).read_text (encoding = "utf-8" )
8585
86- def test_readme_identifies_the_qualified_v060_release (self ) -> None :
86+ def test_readme_identifies_the_owner_confirmed_v061_release (self ) -> None :
8787 firmware = markdown_section (self .readme , "What works" )
8888 normalized = " " .join (firmware .split ())
8989
9090 self .assertIn (
91- "qualified public v0.6.0 release" ,
91+ "owner-confirmed public v0.6.1 release" ,
9292 normalized ,
9393 )
9494 self .assertIn ("all five exact release profiles" , normalized )
@@ -100,7 +100,11 @@ def test_readme_identifies_the_qualified_v060_release(self) -> None:
100100 self .assertIn ("`waveshare-esp32-s3-lcd-147b`" , firmware )
101101 self .assertIn ("`esp32-c3-4mb`" , firmware )
102102 self .assertIn ("`rpi-pico2-w`" , firmware )
103- self .assertEqual (firmware .count ("Qualified v0.6.0" ), 5 )
103+ self .assertEqual (firmware .count ("Owner-confirmed v0.6.1" ), 5 )
104+ self .assertIn ("automated qualification records remain incomplete" , normalized )
105+ self .assertIn ("LFS2" , firmware )
106+ self .assertIn ("fresh globals" , normalized )
107+ self .assertNotIn ("All five exact-byte HIL rows passed" , firmware )
104108 self .assertNotIn ("v0.4.2 hardware-tested beta" , firmware )
105109 self .assertNotIn ("Planned; unavailable" , firmware )
106110 self .assertNotIn ("in-progress `0.6.0`" , firmware )
@@ -115,11 +119,11 @@ def test_readme_caption_describes_only_the_visible_app(self) -> None:
115119 self .assertIn ("generated MicroPython" , caption )
116120 self .assertNotRegex (caption , r"(?i)pictured|board|module" )
117121
118- def test_readme_try_steps_use_the_qualified_v060_release_safely (self ) -> None :
122+ def test_readme_try_steps_use_the_published_v061_release_safely (self ) -> None :
119123 try_section = markdown_section (self .readme , "Try PyBLE" )
120124 normalized = " " .join (try_section .split ())
121125
122- self .assertIn ("qualified v0.6.0 release" , normalized )
126+ self .assertIn ("published v0.6.1 release" , normalized )
123127 self .assertIn ("four ESP profiles" , normalized )
124128 self .assertIn ("Web Serial" , try_section )
125129 self .assertIn ("Pico 2 W" , try_section )
@@ -131,15 +135,23 @@ def test_readme_try_steps_use_the_qualified_v060_release_safely(self) -> None:
131135 self .assertIn ("back up" , try_section )
132136 self .assertIn ("Flashing erases the board" , try_section )
133137 self .assertNotIn ("v0.4.2 hardware-tested beta" , try_section )
134-
135- def test_current_public_surfaces_agree_on_v060_and_v061_state (self ) -> None :
138+ self .assertIn ("https://github.com/PyBLE-dev/examples" , try_section )
139+ self .assertIn ("branch chooser" , normalized )
140+ self .assertIn ("editable" , normalized )
141+ self .assertIn ("/examples" , try_section )
142+ self .assertIn ("pyble_hello_console.py" , try_section )
143+ self .assertIn ("https://pyble.dev/learn" , self .readme )
144+ self .assertIn ("https://pyble.dev/features" , self .readme )
145+ self .assertNotIn ("examples/github-import" , try_section )
146+
147+ def test_current_public_surfaces_agree_on_v061_publication (self ) -> None :
136148 combined = "\n " .join (
137149 (self .home_page , self .site_copy , self .support_page , self .roadmap )
138150 )
139151
140152 for wording in (
141- "v0.6.0 " ,
142- "qualified public release " ,
153+ "v0.6.1 " ,
154+ "owner-confirmed " ,
143155 "esp32-4mb" ,
144156 "esp32-s3-n16r8" ,
145157 "esp32-c3-4mb" ,
@@ -159,17 +171,26 @@ def test_current_public_surfaces_agree_on_v060_and_v061_state(self) -> None:
159171 available = " " .join (
160172 markdown_section (self .roadmap , "Available now" ).split ()
161173 )
162- self .assertIn ("current qualified firmware v0.6.0" , available )
174+ self .assertIn ("published firmware v0.6.1" , available )
175+ self .assertIn ("owner confirmation" , available )
163176 self .assertIn ("five exact profiles" , available )
164177 self .assertIn ("Pico 2 W" , available )
165178 self .assertNotIn ("v0.4.2" , self .roadmap )
166179
167180 near_term = markdown_section (self .roadmap , "Near term" )
168181 self .assertIn (
169- "source-selected firmware v0.6.1 contract hardening " ,
182+ "v0.7.0 " ,
170183 near_term ,
171184 )
172- self .assertIn ("fresh resource, recovery, and physical qualification" , near_term )
185+ self .assertIn ("automated qualification" , near_term )
186+
187+ def test_readme_distinguishes_app_source_from_store_availability (self ) -> None :
188+ firmware = markdown_section (self .readme , "What works" )
189+ normalized = " " .join (firmware .split ())
190+ self .assertIn ("0.2.0+8" , firmware )
191+ self .assertIn ("does not establish a live store release" , normalized )
192+ self .assertIn ("offline privacy policy" , normalized )
193+ self .assertIn ("multi-file deletion" , normalized )
173194
174195 def test_production_browser_claim_is_bound_to_public_evidence (self ) -> None :
175196 evidence = self .browser_validation
@@ -235,31 +256,31 @@ def test_post_release_attestation_bounds_the_completed_hil_scope(self) -> None:
235256
236257 def test_public_surfaces_link_the_release_evidence_and_changelog (self ) -> None :
237258 self .assertIn (
238- "https://pyble.dev/firmware/v0.6.0 /release.json" ,
259+ "https://pyble.dev/firmware/v0.6.1 /release.json" ,
239260 self .readme ,
240261 )
241262 self .assertIn (
242- "https://pyble.dev/firmware/v0.6.0 /RELEASE_NOTES.md" ,
263+ "https://pyble.dev/firmware/v0.6.1 /RELEASE_NOTES.md" ,
243264 self .readme ,
244265 )
245266 self .assertIn (
246- "https://pyble.dev/firmware/v0.6.0 /SHA256SUMS" ,
267+ "https://pyble.dev/firmware/v0.6.1 /SHA256SUMS" ,
247268 self .readme ,
248269 )
249270 self .assertIn (
250- "https://pyble.dev/firmware/v0.6.0 /RECOVERY.md" ,
271+ "https://pyble.dev/firmware/v0.6.1 /RECOVERY.md" ,
251272 self .readme ,
252273 )
253274 self .assertIn (
254- "https://github.com/PyBLE-dev/PyBLE/tree/firmware-v0.6.0 " ,
275+ "https://github.com/PyBLE-dev/PyBLE/tree/c8f549eeabe6d2b8c2766eab022517944bb09c8c " ,
255276 self .readme ,
256277 )
257278 self .assertIn (
258- "c2940281a14feddb55c48de15ac18087e9317d1b7130e514fab5a209b046a1e6 " ,
279+ "71f6aca6df07e31a1f54c7f70a48d82c7fe26b1c8ca0626a8ffc57c804fbb1bd " ,
259280 self .readme ,
260281 )
261282 self .assertIn (
262- "0c7230d6708797c241160ba71fbd37e6b22f180a " ,
283+ "https://pyble.dev/firmware-v0.6.1-owner-confirmation.md " ,
263284 self .readme ,
264285 )
265286 self .assertIn (
0 commit comments