Skip to content

Commit e7eb5e1

Browse files
committed
[green] add reviewed visuals to every tutorial
Signed-off-by: Viwat Vchirawongkwin <viwat.v@chula.ac.th>
1 parent 4778b2c commit e7eb5e1

27 files changed

Lines changed: 1137 additions & 5 deletions
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
<!-- SPDX-License-Identifier: MIT -->
2+
3+
# Tutorial screenshot provenance — 2026-08-28
4+
5+
This record covers the physical Android captures prepared for local review of
6+
the ten-part learning path. Technical integrity and privacy review are
7+
complete. Production publication remains pending explicit user approval of the
8+
local website.
9+
10+
## Capture environment
11+
12+
- Capture date: `2026-08-28` (`Asia/Bangkok`; the UTC date was also
13+
`2026-08-28`)
14+
- Physical device: `Lenovo TB-J616X`
15+
- Operating system: `Android 12 (API 31)`
16+
- App surface: `PyBLE 0.2.0 beta`, build `5`
17+
- Capture-only package: `dev.pyble.pyble.tutorialcapture`
18+
- App source revision:
19+
`4df378fc76c919f0e2481eb5b668f14115d38587`
20+
- Capture APK SHA-256:
21+
`ad0a15a5f7f80005aac86f422ac53b888162fbca2b96920f4eacf1f1819fc679`
22+
- Documentation board: `PyBLE-5646`, firmware `0.6.0`, runtime chip
23+
`esp32-s3`
24+
- Raw directory (ignored):
25+
`ScreenShots/tutorials/android/lenovo-tb-j616x/0.2.0-beta/`
26+
- Reviewed directory (ignored):
27+
`ScreenShots/tutorials/android/lenovo-tb-j616x/0.2.0-beta/reviewed-tutorial-set/`
28+
- Processor: `ImageMagick 7.1.2-21 Q16-HDRI aarch64`
29+
30+
The release-mode capture package used a disposable local signing key and a
31+
capture-only application ID so it could coexist with the installed Play build.
32+
It is not a distributable release artifact. The key and build output remain
33+
outside Git.
34+
35+
## Processing and interaction boundaries
36+
37+
[`process-tutorial-captures.sh`](../../tools/web/scripts/process-tutorial-captures.sh)
38+
validated each raw image as one 2000×1200 8-bit PNG, cropped exactly
39+
`2000x1092+0+36` to remove the Android status and navigation bars, stripped
40+
metadata, and verified zero changed pixels against that crop. It did not resize,
41+
annotate, blur, recolor, generate, or retouch app content. Reviewed filenames
42+
contain the app version, build, stable capture key, and the first 12 characters
43+
of the reviewed SHA-256.
44+
45+
The two-file deletion confirmation was canceled. The official example was
46+
downloaded from immutable examples commit
47+
`8f4529b3cd0d62e8d53d7deb4f37e5cd2a171fd1` into the disposable
48+
`/examples/tutorial-capture` board folder and was neither opened nor run. The
49+
Blocks starter was copied into the editable workspace but was not run.
50+
51+
## Reviewed captures
52+
53+
| Purpose | Raw capture | Published derivative | Reviewed SHA-256 | Privacy and state review |
54+
| --- | --- | --- | --- | --- |
55+
| Setup — board discovery | `06-setup-scan-results-production-release.raw.png` | `pyble-app-0.2.0-build-5-setup-scan-results-3558cadbe501.png` | `3558cadbe501d1865aafbacf4fe5dd9624ae969a2fb0ff7bbd457029bcf2c41c` | Pass; one documentation-board advertisement; Lenovo stylus edge control retained |
56+
| Setup — connected identity | `07-setup-connected-identity-production-release.raw.png` | `pyble-app-0.2.0-build-5-setup-connected-identity-58f65b64a966.png` | `58f65b64a966d4ef2dcd0148442bf07dbe6b2008eda502f9d1e14cda4b7b36ce` | Pass; documentation board only; no unrelated overlay visible |
57+
| First program — Editor and Console | `08-first-program-editor-console-production-release.raw.png` | `pyble-app-0.2.0-build-5-first-program-editor-console-86552d68afaa.png` | `86552d68afaa7f9ea8b1151e0ffc812685815f3009bb64b7a3c823090ef42152` | Pass; public tutorial source/output only; Lenovo stylus edge control retained |
58+
| Files — multi-delete review | `09-files-multi-delete-review-production-release.raw.png` | `pyble-app-0.2.0-build-5-files-multi-delete-review-b1df22dfa70a.png` | `b1df22dfa70a449356c05f34189ff897decdfbd418bf4630ae251365b6ed6b86` | Pass; disposable filenames; Delete was canceled; Lenovo stylus edge control retained |
59+
| GitHub — branch chooser | `10-github-import-branch-chooser-production-release.raw.png` | `pyble-app-0.2.0-build-5-github-import-branch-chooser-4514d2f0522b.png` | `4514d2f0522bb3600ba38a75d9ed581255877d1949a8c153341af2d720da8ba7` | Pass; official public URL and public branch only; Lenovo stylus edge control retained |
60+
| GitHub — pre-write review | `11-github-import-prewrite-review-production-release.raw.png` | `pyble-app-0.2.0-build-5-github-import-prewrite-review-faa68602fcd0.png` | `faa68602fcd0ef2761573e726c490fcbbfd3d953eecaff60d246511cfa0cb047` | Pass; immutable public source and disposable target; Lenovo stylus edge control retained |
61+
| Examples — completed import | `12-examples-import-complete-production-release.raw.png` | `pyble-app-0.2.0-build-5-examples-import-complete-ab466a044a11.png` | `ab466a044a115a20bef8b1bf355d49867a5a6d439333e51ff3b8deb11d3c9317` | Pass; successful single-file result; no open or Run action; Lenovo stylus edge control retained |
62+
| Blocks — generated Python | `20-blocks-hello-workspace-production-release.raw.png` | `pyble-app-0.2.0-build-5-blocks-hello-workspace-c37bd12f3102.png` | `c37bd12f31021c0a8dfcf1ecd8f592c1d8083c081a5d1d74582dbc8cf9998ee4` | Pass; public starter only; stylus overlay stopped before capture |
63+
64+
No capture contains an account, token, private repository, notification,
65+
personal filename, debug label, integration-test label, or unrelated user board
66+
file. The small edge control retained in six frames belongs to Lenovo's
67+
`com.lenovo.styluspen` system package; it contains no user data. It was left
68+
truthful rather than removed by image retouching. The overlay was stopped
69+
reversibly before the final Blocks capture. A future physical recapture may
70+
replace those six frames with new content-versioned assets after the tablet is
71+
reconnected; existing published bytes must never be overwritten in place.
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
<!-- SPDX-License-Identifier: MIT -->
2+
3+
# Tutorial screenshot provenance — TEMPLATE
4+
5+
Copy this template into the release review record. Raw captures and generated
6+
review candidates remain below the repository's ignored `ScreenShots/`
7+
workspace. Only an explicitly approved derivative may later be promoted to
8+
`tools/web/public/`.
9+
10+
## Capture set
11+
12+
- Capture date (UTC): `YYYY-MM-DD`
13+
- Reviewer and review date: `NAME — YYYY-MM-DD`
14+
- Physical device: `Lenovo TB-J616X`
15+
- Android release / API level: `Android 12 / API 31`
16+
- PyBLE version and build: `VERSION (BUILD)`
17+
- Installed package identity: `PACKAGE`
18+
- APK source commit and SHA-256: `COMMIT — SHA256`
19+
- Connected board and firmware: `BOARD — VERSION`
20+
- Raw directory (ignored): `ScreenShots/...`
21+
- Review directory (ignored): `ScreenShots/.../reviewed-tutorial-set`
22+
- ImageMagick version: output of `magick -version`
23+
24+
## Deterministic processing
25+
26+
Run from the repository root, using explicit absolute paths:
27+
28+
```sh
29+
tools/web/scripts/process-tutorial-captures.sh \
30+
--input-dir /ABSOLUTE/PATH/TO/RAW-CAPTURES \
31+
--output-dir /ABSOLUTE/PATH/TO/RAW-CAPTURES/reviewed-tutorial-set
32+
```
33+
34+
The processor accepts exactly eight named 2000×1200, 8-bit PNG inputs. It
35+
crops 36 pixels from the top and 72 from the bottom, yielding 2000×1092. It
36+
then strips metadata and excludes time-dependent PNG chunks with fixed PNG
37+
compression settings. It does not resize, annotate, blur, recolor, or retouch
38+
app pixels. The command verifies every output against the exact source crop
39+
and writes `SHA256SUMS` plus `SOURCE_SHA256SUMS`. It also writes
40+
`tutorial-captures.tsv`, mapping each stable capture key to its raw file,
41+
content-versioned reviewed filename, and both full SHA-256 values. Reviewed
42+
filenames include the PyBLE app version, build, and first 12 hash characters.
43+
44+
Use `--force` only after reviewing the current directory. It replaces only a
45+
directory containing the processor's managed filenames; any unmanaged entry
46+
causes a safe failure. Publication remains a separate, deliberate action.
47+
Preserve any older `reviewed/` directory as historical local evidence; this
48+
capture set belongs in the distinct `reviewed-tutorial-set/` directory.
49+
50+
Verify the processor contract itself with:
51+
52+
```sh
53+
tools/web/scripts/test-process-tutorial-captures.sh
54+
```
55+
56+
Verify an actual local set from its raw directory with:
57+
58+
```sh
59+
capture_root=/ABSOLUTE/PATH/TO/RAW-CAPTURES
60+
review_dir="$capture_root/reviewed-tutorial-set"
61+
(cd "$review_dir" && shasum -a 256 -c SHA256SUMS)
62+
(cd "$capture_root" && \
63+
shasum -a 256 -c "$review_dir/SOURCE_SHA256SUMS")
64+
```
65+
66+
## Per-image review
67+
68+
| Tutorial / purpose | Raw filename | Reviewed filename | Raw SHA-256 | Reviewed SHA-256 | Visual state correct | Privacy review | Approved |
69+
| --- | --- | --- | --- | --- | --- | --- | --- |
70+
| Setup — board discovery | `06-setup-scan-results-production-release.raw.png` | from manifest | `...` | `...` | `yes/no` | `pass/fail` | `yes/no` |
71+
| Setup — connected identity | `07-setup-connected-identity-production-release.raw.png` | from manifest | `...` | `...` | `yes/no` | `pass/fail` | `yes/no` |
72+
| First program — editor and Console | `08-first-program-editor-console-production-release.raw.png` | from manifest | `...` | `...` | `yes/no` | `pass/fail` | `yes/no` |
73+
| Files — multi-delete review | `09-files-multi-delete-review-production-release.raw.png` | from manifest | `...` | `...` | `yes/no` | `pass/fail` | `yes/no` |
74+
| GitHub — branch chooser | `10-github-import-branch-chooser-production-release.raw.png` | from manifest | `...` | `...` | `yes/no` | `pass/fail` | `yes/no` |
75+
| GitHub — pre-write review | `11-github-import-prewrite-review-production-release.raw.png` | from manifest | `...` | `...` | `yes/no` | `pass/fail` | `yes/no` |
76+
| Examples — completed import | `12-examples-import-complete-production-release.raw.png` | from manifest | `...` | `...` | `yes/no` | `pass/fail` | `yes/no` |
77+
| Blocks — generated Python | `20-blocks-hello-workspace-production-release.raw.png` | from manifest | `...` | `...` | `yes/no` | `pass/fail` | `yes/no` |
78+
79+
Review each image at full resolution. Confirm that it contains no private
80+
notifications, account details, credentials, personal filenames, device
81+
identifiers beyond the intentionally documented test device/board, or debug or
82+
integration-test labels. Raw captures 06–12 contain the Lenovo stylus edge
83+
affordance; record it as disclosed, non-private device chrome and preserve it
84+
rather than retouching app pixels. Capture 20 is overlay-free. Confirm that
85+
captions and alt text describe the exact visible state before promotion.
159 KB
Loading
117 KB
Loading
125 KB
Loading
83.4 KB
Loading
136 KB
Loading
128 KB
Loading
67.7 KB
Loading
42.3 KB
Loading

0 commit comments

Comments
 (0)