Skip to content

siblings.py and validate-repository-naming.py: the layout table, the plain listing and --explain's family rows pad a name by the columns a terminal gives it as stdout writes it, so a wide or combining name's next column starts under its heading (#1216, #1217) - #1236

Draft
brettheap wants to merge 1 commit into
mainfrom
l3-1216-display-width-pad

Conversation

@brettheap

@brettheap brettheap commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

What changed

A v1.2.1 follow-up from lane 3's independent reviews (#1216, #1217). It lands under Brett Heap's v1.2.1 merge word (2026-10-23T13:10:26Z) once reviewed and green.

Three tables padded a person's text with a format width, which counts code points, not the columns a terminal gives them:

At main, a name of the three wide characters U+65E5 U+672C U+8A9E stood 3 columns right of every other row, and e U+0301 cole (a combining acute) 1 column left. On an ASCII stdout, which writes each as its escapes, they stood 15 and 5 columns right (Measured).

templates/family-root/scripts/siblings.py (#1216):

scripts/validate-repository-naming.py (#1217):

  • The same four constants and the same four functions, written in this file.
  • _print_classification pads _printed(name) with _padded(..., 32).
  • _family_id_padded(family_id) serves _no_family_lines and _family_row.
    • Read for the issue: NamingPolicy.__init__ (scripts/repo_shape.py) checks nothing of an id, and --policy takes any file. So a policy can name a family U+65E5 U+672C U+8A9E, and its --explain row stood 3 columns right at main.
    • A text id is padded by its columns as stdout writes it.
    • An id that YAML reads as a number or a boolean (5, true) reaches _family_row too, and printed through format (5, and 1 for true). It still does, byte for byte.

An ASCII name prints byte for byte as before in every table. The existing rows that pin those bytes pass unchanged: test_a_plain_holder_prints_exactly_what_it_printed_before, and tests/test_chain_link_fold.py's codexGlass rows.

Every family holder will see an upstream-changed row for scripts/siblings.py, and every assembly root one for scripts/validate-repository-naming.py, as #1148 says of a pinned copy whose bytes move. scripts/repo_shape.py is unchanged, so no root or holder sees a row for it.

Where the rule lives, and why

In each of the two files, and not in scripts/repo_shape.py.

Decided where the Direction left it open

Left out of scope

Measured

Scratch probes (report.py, measure_explain.py) ran each tool at main 50ce8ab1, from main's copy of the script, and on this branch, on a UTF-8 stdout and on an ASCII one (PYTHONIOENCODING=ascii:strict, which each script makes backslashreplace).

  • Each row is quoted as ascii(name)=column: the name as the row printed it, then the display column its next field begins at.
  • Columns are counted with unicodedata by the issue's rule, independently of the code under test.
  • The heading's state is at column 31. Every ASCII label begins at 35.
  • The holder for siblings.py is a real one from family.py init into local bare remotes. Its members are U+65E5 U+672C U+8A9E, e U+0301 cole and Atlas, each mounted at members/<name>, and the run is --dry-run.
siblings.py --dry-run, `state` column per row (main 50ce8ab1; heading at 31):
  utf-8:strict  exit 0: 'InkRouter'=31, '\u65e5\u672c\u8a9e'=34, 'e\u0301cole'=30, 'Atlas'=31, 'members/\u65e5\u672c\u8a9e'=34, 'members/e\u0301cole'=30, 'members/Atlas'=31
  ascii:strict  exit 0: 'InkRouter'=31, '\\u65e5\\u672c\\u8a9e'=46, 'e\\u0301cole'=36, 'Atlas'=31, 'members/\\u65e5\\u672c\\u8a9e'=46, 'members/e\\u0301cole'=36, 'members/Atlas'=31
siblings.py --dry-run, `state` column per row (branch; heading at 31):
  utf-8:strict  exit 0: 'InkRouter'=31, '\u65e5\u672c\u8a9e'=31, 'e\u0301cole'=31, 'Atlas'=31, 'members/\u65e5\u672c\u8a9e'=31, 'members/e\u0301cole'=31, 'members/Atlas'=31
  ascii:strict  exit 0: 'InkRouter'=31, '\\u65e5\\u672c\\u8a9e'=31, 'e\\u0301cole'=31, 'Atlas'=31, 'members/\\u65e5\\u672c\\u8a9e'=39, 'members/e\\u0301cole'=32, 'members/Atlas'=31
validate-repository-naming.py --role assembly codexGlass <wide> <combining>, label column (main 50ce8ab1):
  utf-8         exit 1: 'codexGlass'=35, '\u65e5\u672c\u8a9e'=38, 'e\u0301cole'=34
  ascii:strict  exit 1: 'codexGlass'=35, '\\u65e5\\u672c\\u8a9e'=50, 'e\\u0301cole'=40
validate-repository-naming.py --role assembly codexGlass <wide> <combining>, label column (branch):
  utf-8         exit 1: 'codexGlass'=35, '\u65e5\u672c\u8a9e'=35, 'e\u0301cole'=35
  ascii:strict  exit 1: 'codexGlass'=35, '\\u65e5\\u672c\\u8a9e'=35, 'e\\u0301cole'=35

On this branch's ASCII stdout, members/ followed by an escaped name is 26 and 19 columns wide, more than the 18 of the field. Each of those two rows keeps the one space between fields, as :<18 keeps it after an ASCII name that long, and nothing is cut.

--explain under the standard policy with its workspace family's id renamed. zz-wip matches that family (_family_row; an ASCII id's pattern starts at 29). z z matches none (_no_family_lines; 23). identical compares the whole stdout of main and the branch, and None means main itself prints no such row (", ".join of a number raises before it).

id '\u65e5\u672c\u8a9e'       utf-8         --explain zz-wip  pattern col main   32 branch   29 exits 0/0  identical: False
id '\u65e5\u672c\u8a9e'       utf-8         --explain z z     pattern col main   26 branch   23 exits 1/1  identical: False
id '\u65e5\u672c\u8a9e'       ascii:strict  --explain zz-wip  pattern col main   44 branch   29 exits 0/0  identical: False
id '\u65e5\u672c\u8a9e'       ascii:strict  --explain z z     pattern col main   38 branch   23 exits 1/1  identical: False
id 'e\u0301cole'              utf-8         --explain zz-wip  pattern col main   28 branch   29 exits 0/0  identical: False
id 'e\u0301cole'              utf-8         --explain z z     pattern col main   22 branch   23 exits 1/1  identical: False
id 'e\u0301cole'              ascii:strict  --explain zz-wip  pattern col main   34 branch   29 exits 0/0  identical: False
id 'e\u0301cole'              ascii:strict  --explain z z     pattern col main   28 branch   23 exits 1/1  identical: False
id '5'                        utf-8         --explain zz-wip  pattern col main   29 branch   29 exits 0/0  identical: True
id '5'                        utf-8         --explain z z     pattern col main None branch None exits 1/1  identical: True
id '5'                        ascii:strict  --explain zz-wip  pattern col main   29 branch   29 exits 0/0  identical: True
id '5'                        ascii:strict  --explain z z     pattern col main None branch None exits 1/1  identical: True
id 'true'                     utf-8         --explain zz-wip  pattern col main   29 branch   29 exits 0/0  identical: True
id 'true'                     utf-8         --explain z z     pattern col main None branch None exits 1/1  identical: True
id 'true'                     ascii:strict  --explain zz-wip  pattern col main   29 branch   29 exits 0/0  identical: True
id 'true'                     ascii:strict  --explain z z     pattern col main None branch None exits 1/1  identical: True

Tests

Every run used a stub gh first on PATH (exit 97), GH_TOKEN=bogus, an empty GH_CONFIG_DIR, GIT_SSH_COMMAND=false and a scratch GIT_CONFIG_GLOBAL, one pytest at a time. Each was /usr/bin/python3 -m pytest -q -p no:cacheprovider --basetemp=<scratch> -o tmp_path_retention_policy=failed <file>, at 352dcbc966d1c42d8510b2d61fedcda533c725cd.

New rows:

  • tests/test_siblings_family_name.py: test_the_layout_keeps_every_state_under_its_heading and test_what_ran_keeps_every_state_under_its_heading, each on a UTF-8 and an ASCII stdout.
  • tests/test_chain_link_fold.py: test_a_wide_or_combining_name_has_its_label_under_codexglass_s, on both stdouts.
  • tests/test_pinned_copy_columns.py (new):
    • the 14-row table for each copy;
    • the parity over every code point;
    • _padded, and _printed under seven stdouts, for each copy;
    • the --explain id rows on both stdouts;
    • the number and boolean ids.

Every new row that reads a table fails at main (main's script swapped in, then restored and checked with cmp):

  • 4 of 4 siblings.py rows, at ('<wide>', 34) != ('<wide>', 31);
  • 2 of 2 listing rows;
  • 8 of 8 --explain id rows.

The two rows for a number or boolean id pass at main too, because they pin main's bytes.

Gates: my files' tests, every test file that names siblings.py or validate-repository-naming.py, and the docs and hygiene guards. combined is one run of tests/test_pinned_copy_columns.py, tests/test_pinned_copy_text.py, tests/test_siblings_family_name.py and tests/test_chain_link_fold.py. The last 15 files in the list also ran with -rs.

  • tests/test_adopt_e2e.py and tests/test_adopt_nested_attributes.py first ran before git-filter-repo was on the stub PATH, and skipped 27 and 7 rows. Their lines below are the reruns with it on the PATH, with no row skipped.
  • tests/test_family_member_make_jobserver.py: 4 failed, test_under_a_named_pipe_a_member_s_make_before_4_4_runs_serially[bootstrap|validate|park|resume], each at assert "jobserver" not in said. It fails identically at main on this bench (make jobserver warning under the stub PATH); passes in CI. At main 50ce8ab1, under the same environment, -k named_pipe gives the same 4 failed, with 42 passed, 1 skipped and 68 deselected.
combined exit=0 85s :: 315 passed in 82.82s (0:01:22)
test_adopt_pins exit=0 212s :: 152 passed in 209.62s (0:03:29)
test_adopt_reencoded_files exit=0 100s :: 53 passed in 99.26s (0:01:39)
test_adopt_spec_only exit=0 21s :: 14 passed in 19.71s
test_adopt_submodules exit=0 243s :: 167 passed in 240.59s (0:04:00)
test_agents_md_codes exit=0 3s :: 47 passed in 2.59s
test_assembly_root_unreadable_paths exit=0 19s :: 82 passed in 17.15s
test_bootstrap_branch_bytes exit=0 18s :: 62 passed in 16.49s
test_bootstrap_refusal_exit exit=0 12s :: 17 passed in 10.98s
test_chain_pin_sources exit=0 16s :: 52 passed in 14.83s
test_chain_remedy_callers exit=0 17s :: 68 passed in 15.61s
test_cli_reference exit=0 44s :: 23 passed in 43.26s
test_doctor_gitmodules_not_utf8 exit=0 43s :: 23 passed in 42.07s
test_doctor_members_spelled exit=0 20s :: 9 passed in 18.91s
test_doctor_validator_verdicts exit=0 67s :: 39 passed in 65.87s (0:01:05)
test_family exit=0 129s :: 112 passed in 128.30s (0:02:08)
test_family_docs_one_spelling exit=0 2s :: 32 passed in 0.88s
test_family_makefile_siblings exit=0 8s :: 31 passed in 5.83s
test_family_member_make_jobserver exit=1 70s :: 4 failed, 110 passed, 1 skipped in 68.31s (0:01:08)
test_family_members_not_a_list exit=0 106s :: 156 passed in 104.94s (0:01:44)
test_family_printed_quoting exit=0 17s :: 84 passed in 15.92s
test_family_py_unreadable exit=0 46s :: 75 passed in 45.02s
test_family_siblings_bootstrap_unreadable exit=0 21s :: 57 passed in 19.74s
test_family_siblings_placement exit=0 32s :: 33 passed in 30.71s
test_family_siblings_untraced exit=0 97s :: 30 passed in 95.45s (0:01:35)
test_legs_not_a_list exit=0 30s :: 112 passed in 28.65s
test_link_source_chain_defaults exit=0 8s :: 26 passed in 6.84s
test_naming_policy exit=0 20s :: 264 passed in 19.31s
test_no_auto_maintenance exit=0 12s :: 58 passed, 2 skipped in 10.85s
test_non_list_project_fields exit=0 27s :: 71 passed in 25.60s
test_park_resume_targets exit=0 23s :: 44 passed in 22.59s
test_path_guard_hygiene exit=0 19s :: 121 passed in 17.03s
test_pins_child_kind_and_siblings_root_spelling exit=0 6s :: 10 passed in 5.27s
test_repo_hygiene exit=0 4s :: 101 passed in 2.95s
test_scaffold_e2e exit=0 20s :: 46 passed in 19.65s
test_scaffold_pin_and_reuse exit=0 27s :: 75 passed in 25.15s
test_scaffold_referent_chain_links exit=0 11s :: 44 passed in 9.37s
test_setup_family_folder exit=0 15s :: 16 passed in 13.67s
test_setup_project_py exit=0 126s :: 340 passed in 124.45s (0:02:04)
test_siblings_inputs exit=0 37s :: 58 passed in 35.24s
test_template_text_placeholders exit=0 86s :: 142 passed in 85.58s (0:01:25)
test_update_add_codes_documented exit=0 1s :: 6 passed in 0.52s
test_update_shape_add exit=0 26s :: 20 passed in 24.76s
test_update_shape_kept_helper exit=0 25s :: 159 passed in 24.30s
test_update_shape_unreadable exit=0 19s :: 54 passed in 17.40s
test_validate_workflow_gitmodules_urls exit=0 51s :: 421 passed in 49.60s
test_validator_child_encoding exit=0 43s :: 163 passed in 41.67s
test_windows_paths exit=0 5s :: 46 passed in 2.76s
test_yaml_reader_spaces exit=0 31s :: 513 passed in 28.98s
test_adopt_e2e exit=0 28s :: 27 passed in 26.92s
test_adopt_nested_attributes exit=0 99s :: 79 passed in 97.45s (0:01:37)
test_shape_doctor exit=0 766s :: 446 passed, 3 skipped in 763.52s (0:12:43)

Mutants

Each mutant was applied to the committed file, its rows were run, and the file was restored and checked with cmp against HEAD. All 16 were KILLED.

# Mutant Rows run Result
S1 Sibling.row pads the name with :<18 again (main's line) test_siblings_family_name.py -k keeps_every_state KILLED, 4 failed
S2 Sibling.row pads without _printed same KILLED, 2 failed (the ASCII stdout's), 2 passed
S3 siblings _padded counts len (the issue's mutant) same KILLED, 2 failed (the UTF-8 stdout's), 2 passed
S4 siblings _char_columns gives Mn, Me, Cf and the jamo 1 column test_pinned_copy_columns.py KILLED, 9 failed, 46 passed
S5 siblings MEDIAL_AND_FINAL_JAMO_EXTENDED_B empty same KILLED, 2 failed, 53 passed
S6 siblings TWO_COLUMN_WIDTHS without F same KILLED, 2 failed, 53 passed
S7 siblings _printed writes backslashreplace whatever stdout's handler same KILLED, 2 failed, 53 passed
N1 the listing pads with :<32 again (main's line) test_chain_link_fold.py -k label_under_codexglass KILLED, 2 failed
N2 the listing pads without _printed same KILLED, 1 failed (the ASCII stdout's), 1 passed
N3 naming _padded counts len (the issue's mutant) same KILLED, 1 failed (the UTF-8 stdout's), 1 passed
N4 naming _char_columns gives W and F 1 column test_pinned_copy_columns.py KILLED, 9 failed, 46 passed
N5 _family_id_padded pads every id with format same KILLED, 8 failed, 47 passed
N6 _family_id_padded pads every id by columns (5 and true too) same KILLED, 2 failed, 53 passed
N7 _family_id_padded pads without _printed same KILLED, 4 failed, 51 passed
N8 _no_family_lines pads the id with :<18 again same KILLED, 4 failed, 51 passed
N9 _family_row pads the id with :<18 again same KILLED, 4 failed, 51 passed

Merges

git merge-tree --write-tree of this head with each, re-listed live with gh pr list --state open --json number,files filtered to this PR's files:

Re-listed at 2026-10-23T21:40Z: 48 open PRs, of which #1172 and #1164 touch this PR's files.

Closes #1216
Closes #1217

Lane: openreposhape-3 (openRepoShape-3)

🤖 Generated with Claude Code

…plain listing and `--explain`'s family rows pad a name by the columns a terminal gives it as stdout writes it, so a wide or combining name's next column starts under its heading (#1216, #1217)

`templates/family-root/scripts/siblings.py`'s `Sibling.row` padded the
member's name with `:<18`, and `scripts/validate-repository-naming.py`'s
plain listing padded the target's name with `:<32`, its `--explain` rows
a policy's family id with `:<18`. A format width counts code points. On
main 50ce8ab, measured:

- `make siblings --dry-run`: the `state` of a member named with three
  wide characters began at column 34, and of one with a combining acute
  at 30, where every ASCII row's begins at 31. On an ASCII stdout, which
  writes each as its escapes, 46 and 36.
- `validate-repository-naming.py codexGlass <wide> <combining>`: the
  labels began at 38 and 34 beside `codexGlass`'s 35; on an ASCII stdout
  50 and 40.
- `--explain` under a policy whose family id is wide or combining: the
  pattern began 3 right and 1 left on a UTF-8 stdout, 15 and 5 right on
  an ASCII one.

Each pads by display columns now, by the rule #1034 gives
`adopt-project.py`'s `plan` table (`ZERO_COLUMN_CATEGORIES`,
`TWO_COLUMN_WIDTHS`, the two Hangul jamo sets), counted over the text as
stdout writes it. An ASCII name prints byte for byte as before, a name
wider than its field gets no space and is not cut, and a family id that
YAML reads as a number or a boolean is padded by `format` as it was.

The rule is written in each file, not in `scripts/repo_shape.py`: both
are pinned copies that may run beside an older kept `repo_shape.py`, so
neither may import a name new to it (the skew rule of
tests/test_pinned_copy_text.py, and siblings.py's own comment on
`shell_line`). tests/test_pinned_copy_columns.py asks both copies the
same questions and holds them to one answer for every code point.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@brettheap brettheap added this to the v1.2.1 milestone Oct 23, 2026
@sourcery-ai

sourcery-ai Bot commented Oct 23, 2026

Copy link
Copy Markdown

Reviewer's Guide

The PR updates the pinned siblings and repository-naming scripts to pad displayed text by the terminal columns occupied after stdout encoding, fixing alignment for wide, combining, and escaped Unicode names while retaining existing behavior for ASCII and non-text IDs. Comprehensive tests cover both output paths, all Unicode-width rules, stdout handlers, pinned-copy parity, and regression mutants.

Sequence diagram for aligned siblings table output

sequenceDiagram
    participant Sibling
    participant Stdout
    participant Terminal
    Sibling->>Stdout: spelled(project)
    Stdout-->>Sibling: _printed(text)
    Sibling->>Sibling: _padded(text, 18)
    Sibling->>Stdout: row with state and branch
    Stdout->>Terminal: write encoded row
    Terminal-->>Stdout: columns align under state heading
Loading

Sequence diagram for repository naming classification output

sequenceDiagram
    participant Validator
    participant Stdout
    participant Terminal
    Validator->>Stdout: _printed(name)
    Stdout-->>Validator: text as stdout writes it
    Validator->>Validator: _padded(text, 32)
    Validator->>Stdout: _print_classification(name, found)
    Stdout->>Terminal: write classification row
    Terminal-->>Stdout: label aligns under its heading
Loading

Flow diagram for terminal-column-aware name padding

flowchart LR
    Input[Name or family id] --> Printed[_printed: encode with stdout handler]
    Printed --> TextCheck{Text value?}
    TextCheck -->|yes| Columns[_columns: count terminal columns]
    Columns --> Padded[_padded: add spaces to target width]
    TextCheck -->|no family id| Format[Format with existing width]
    Padded --> Output[Aligned table row]
    Format --> Output
Loading

File-Level Changes

Change Details Files
Replace code-point-based field padding with terminal-column-aware padding for Unicode names and family identifiers.
  • Add duplicated Unicode column-width rules, stdout encoding transformation, and padding helpers to both pinned scripts.
  • Use the helpers for the siblings layout/dispatch name field and the naming validator’s plain listing.
  • Use the same behavior for textual --explain family IDs while preserving legacy formatting for numeric and boolean IDs.
templates/family-root/scripts/siblings.py
scripts/validate-repository-naming.py
Add regression and parity coverage for Unicode display width, stdout escaping, and pinned-copy consistency.
  • Verify wide, combining, overlong, ASCII-escaped, and non-UTF-8 cases in siblings and naming output tables.
  • Exercise both --explain family-row paths with Unicode IDs and preserve byte output for non-text IDs.
  • Assert both helper copies agree across all Unicode code points and kill regressions in the width, encoding, and formatting logic.
tests/test_siblings_family_name.py
tests/test_chain_link_fold.py
tests/test_pinned_copy_columns.py

Assessment against linked issues

Issue Objective Addressed Explanation
#1216 Pad each member name in the make siblings layout table by the display columns of the text as stdout writes it, keeping ASCII output unchanged and leaving over-width names untruncated. ✅
#1216 Use the same corrected Sibling.row padding in the dispatch’s (b) what ran rows, which also use that row formatter. ✅
#1217 Pad names in the plain listing by the display columns of the text as stdout will encode it, keeping ASCII output unchanged and leaving names wider than the field untruncated. ✅

Possibly linked issues


Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@sonarqubecloud

Copy link
Copy Markdown

@brettheap

Copy link
Copy Markdown
Contributor Author

(lane openRepoShape-3, 2026-10-23T21:51:12Z) RV1236 independent review of #1236 at 352dcbc966d1c42d8510b2d61fedcda533c725cd: READY. No MUST and no SHOULD in this PR.

Rule: the three copies give one answer for all 1,114,112 code points (0 differ, unicodedata 15.0.0): siblings.py and validate-repository-naming.py at the head, and adopt-project.py at #1178's c4beba19. The four constants are equal, and _padded and _printed agree under six stdout setups. RV1236's own probe, AST-extracted.

Measured with glibc wcswidth, main 50ce8ab1 -> head:

  • Naming listing, label column (codexGlass at 35): UTF-8 wide 38 and combining 34 -> 35; ASCII 50 and 40 -> 35. Hangul jamo and fullwidth names also land at 35.
  • Sibling.row, state column (heading at 31): UTF-8 34 and 30 -> 31; ASCII 46 and 36 -> 31. On ASCII, members/<wide> is at 39: over-wide, one space, nothing cut.
  • ASCII names, and --explain with ids workspace, 5 and true: stdout is byte-identical to main on UTF-8 and ASCII. For 5 and true with 'z z', stderr differs only in traceback paths and line numbers (main's TypeError).

Imports: only import unicodedata is new; test_pinned_copy_text.py passes.

Tests at the head, in one run of the PR's files, test_pinned_copy_text and the three hygiene files: 595 passed, 2 skipped.

Mutants, RV1236's own script, each KILLED, restored and cmp-equal:

  • R1, siblings _padded by len: 2 failed;
  • R2, _family_id_padded pads every id by columns: 2 failed;
  • R3, the listing without _printed: 1 failed;
  • R4, siblings' width asked before the category: 2 failed.

Jobserver: test_family_member_make_jobserver.py -k named_pipe gave 46 passed, 1 skipped at the head AND at main in RV1236's environment. The writer's 4 failures did not reproduce there. Either way, it is no regression.

Merges, re-listed live (50 open): merge-tree is clean with main 0ed3e57f, #1172 5aa0f116, #1164 74096eb4 and #1178 c4beba19, with the same trees as the body.

Sonar: gate OK, 0 issues, 0.0% duplication. CI at 21:50Z: package, tests-git-bash and SonarCloud pass; tests is pending.

NITs:

Follow-up: when #1178 lands, the parity row (tests/test_pinned_copy_columns.py:115) should take adopt-project.py as a third copy. Whichever of the two PRs lands second adds it, or a follow-up issue does.

#1236 lands under Brett Heap's v1.2.1 merge word once tests is green, at its slot at the end of wave 2.

Lane: openreposhape-3 (openRepoShape-3)

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment