You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
validate-manifest.py accepts a display name holding a lone surrogate (name: "a\ud83db") and then raises UnicodeEncodeError printing it, so make validate and shape-doctor.py fail on a traceback instead of a finding while bump-leg.py and update-shape.py apply pass the same project once #254 lands #280
Found by this lane's adversarial review of #254's fix (fix/validator-child-encoding at 5757e29) as S1. It was scoped out of that PR because the defect is in the project's own validator, not in the two callers that PR changes. It is pre-existing: the run below is on main 60588d5. #254's change does not touch shape-doctor.py or the validators.
What is wrong. The double-quoted YAML reader turns the escape "a\ud83db" into a string holding a lone surrogate (U+D83D). The project's own scripts/validate-manifest.py accepts that string as the display name. It then raises at its own print(f"manifest ok: {manifest.get('name')} "... (templates/assembly-root/scripts/validate-manifest.py:707), because no UTF-8 stream can hold a lone surrogate under strict or surrogateescape. As a result:
scripts/validate-manifest.py exits 1 with a traceback instead of a finding, so make validate stops at Makefile:48 (make exits 2). This happens whether stdout is a file or a UTF-8 terminal, under LANG=C.UTF-8 or no locale.
shape-doctor.py runs the validator with PYTHONIOENCODING=utf-8 (shape-doctor.py:821). It reports the traceback's last line as the manifest FINDING and says INVALID (manifest).
rc=1
UnicodeEncodeError: 'utf-8' codec can't encode character '\ud83d' in position 14: surrogates not allowed
FINDING manifest the project's own scripts/validate-manifest.py reports a finding (exit 1): UnicodeEncodeError: 'utf-8' codec can't encode character '\ud83d' in position 14: surrogates not allowed
INVALID (manifest) (exit 1)
The same project named Atlas prints manifest ok: Atlas (atlas), 3 legs, and the doctor reports no manifest finding.
Expected. Decide whether a display name may hold a lone surrogate.
If it may not. Such a name cannot be written to any UTF-8 file, commit message or console except as an escape. validate-manifest.py would refuse it with a named finding, and every launcher would then agree. That is a shape change: the validator is a digest-pinned copy, and the change reaches projects through update-shape.py.
CLAIMED — lane openRepoShape-5, session e62c2fd7-176d-429d-89fb-0653dd08ad5f@Eagle, 2026-10-12T11:02:04Z, for #280
Logged in lanes/log/openRepoShape-5.md at ded12a774cd37ae5f226d6d67b26f4d679460eb1.
The three reads (lane-collision-protocol Rule 1):
1. existing `CLAIMED —` comments on opensoft/openRepoShape#280:
none
2. `gh pr list --repo opensoft/openRepoShape --state all --search "#280"`, kept where the row or its body names `#280`:
281 bump-leg.py and update-shape.py hand the project's own validators an explicit PYTHONIOENCODING, so a real bump or `apply` on a project named `日本` is no longer refused as `bump-leg-validators-red` or `update-validators-red` under a cp1252 stdout (#254) fix/validator-child-encoding MERGED
3. `git ls-remote --heads git@github.com:opensoft/openRepoShape` branches naming `280` as a whole token:
none
Activity
bump-leg.py and update-shape.py hand the project's own validators an …
brettheap commentedon Oct 12, 2026
CLAIMED — lane openRepoShape-5, session e62c2fd7-176d-429d-89fb-0653dd08ad5f@Eagle, 2026-10-12T11:02:04Z, for #280
Logged in
lanes/log/openRepoShape-5.mdatded12a774cd37ae5f226d6d67b26f4d679460eb1.The three reads (lane-collision-protocol Rule 1):
Merge origin/main (53bee5b, with #390) into fix/bootstrap-print-name-…
templates/assembly-root/scripts/bootstrap.py and templates/family-roo…
Merge origin/main dd8d0ea into fix/adopt-root-kept-symlinks: #261's `…
Both roots' scripts/bootstrap.py: `main` escapes what stdout cannot e…
bootstrap.py: the L4-124 line calls a branch good only where git take…
bootstrap.py: step (a) decodes git's output as the system decodes a n…
shape_materialize.py: `readable_branch` and `UNSEEN` move out of the …