Skip to content

build: prepare Pillow 13.0.0 manylinux2014 wheels - #122

Merged
openjiuwenai merged 1 commit into
openJiuwen-ai:mainfrom
0x7c13:0x7c13/pillow-13-manylinux2014
Oct 26, 2026
Merged

openjiuwenai merged 1 commit into
openJiuwen-ai:mainfrom
0x7c13:0x7c13/pillow-13-manylinux2014

Conversation

@0x7c13

@0x7c13 0x7c13 commented Oct 25, 2026 •

Copy link
Copy Markdown
Collaborator

Paired: GitHub #122 ↔ GitCode !89

Prepare Pillow 13.0.0 wheels for CPython 3.14 on x86_64 and aarch64 at the Linux offline binaries' glibc 2.17 floor. Pillow, pillow-depends, test-images and cibuildwheel remain pinned to immutable commits; runtime dependency pins are deferred until the rebuilt wheels are published.

  • Use cibuildwheel v4.3.4 with the 2026.10.25-1 manylinux2014 image digests verified against Quay. These images include certifi 2026.10.23 and manylinux's EOL-system trust-store replacement.
  • Apply the upstream libjpeg-turbo libspng fix, committed in .github/patches/libjpeg-turbo-3.2.0.tar.gz.patch in the exact -p0 form Pillow applies. Check out the patch at this workflow run's immutable revision, verify its SHA-256, and copy it into Pillow's existing archive patch hook. No generated GitHub .patch download or runtime transformation is required. This fixes the __fpclassifyf link error in both manylinux2014 builds while retaining the upstream native build and tests. Record the applied patch in the wheel SBOM and release notes.
  • Match all 17 archive names against dependencies.json and the nasm/xcb-proto versions in the pinned recipe. Check that the recipe's version getter and variable assignments still read that JSON file. Collect malformed rows, missing/stale names and hash mismatches into one report, while allowing blank and comment lines. Document source URLs and hash provenance.
  • Use one isolated (python -I) Python snapshot implementation before and after building, with consistent symlink, directory and special-file handling and JSON filename encoding. Reuse the pre-build hashes for the explicit pins; reject changes to the source directory after dependency compilation and annotate missing or corrupt baselines.
  • Generate the tag once in a read-only preparation job and reject existing Git tags or published releases. Immediately before creating a tag, the publish job uses its existing contents: write token to paginate and filter releases by tag_name, including leftover drafts. Capture gh stderr separately so successful warnings cannot corrupt the result; keep preparation permissions read-only.
  • Generate checksums and override rows from actual wheel names. Build and publication share filename and platform patterns, which reject wheel build tags and accept either ordering of the glibc 2.17 platform tags. Substitute only named placeholders so regex quantifiers stay literal. Dry-run summaries explain that the initial tag check is not a reservation and may be stale after another ref publishes or a build job is retried.
  • Before publishing, validate every override's project, version, architecture, repository/tag URL, filename and hash against the downloaded artifacts and SHA256SUMS, then verify the wheel bytes. Add visible glibc annotations and preserve multiline API errors, including HTTP status. Python release-note text is derived from PYTHON_TAG.

This PR also fixes the macOS CI failure in the hook-indicator threshold test, as documented in the single squash commit. The failure came from a 0.6-second GC pause advancing the real clock past the one-second display threshold. Three threshold tests now control only the indicator's clock while preserving real Textual timer callbacks and rendered-frame assertions. The pre-threshold observation deliberately exceeds one real second, and completion is applied before advancing the short-lived hook's age.

Upstream wheel tests, SBOM embedding and glibc floor checks remain in the workflow.

Rollout:

  1. After merging, manually run this workflow with publish=true and an unused build number (initially 1).
  2. Create the same pillow-13.0.0-manylinux2014.<build> tag on GitCode at the workflow run's commit so synchronization preserves the GitHub release.
  3. In a follow-up PR, upgrade Pillow to 13.0.0 and pypdf to 6.21.2, refresh uv.lock, and copy the published references into scripts/offline_wheel_overrides.txt. Dry-run hashes must not be reused for a separate rebuild.

Validation:

  • Local Smart Test for the committed-patch change: 200 architecture checks passed. The earlier combined workflow/hook-indicator change passed 51 tests and 253 architecture checks. YAML, shell, embedded Python, Ruff and formatting checks passed.
  • Dual-architecture dry run on 59612e6f succeeded with publish=false. Both builds checked out the committed patch at the run's exact revision and verified its hash. Each architecture passed 5679 Pillow tests (110 skipped, 3 xfailed), plus 3 wheel checks. Each wheel contains 26 ELF objects with a maximum requirement of GLIBC_2.17. SBOM generation, checksums, override generation and uploads passed; publishing was skipped.
  • Downloaded both new wheels and verified their SHA-256 values, override rows, embedded patch bytes and immutable SBOM patch URL at 59612e6f. The actual artifacts passed the workflow's isolated publication-time filename/tag/hash validation locally, stopping before any GitHub writes.
  • PR CI on 59612e6f is successful across Linux, macOS and Windows, including lint, architecture, type checks, packaging and wheel installation. On its first attempt, the unchanged fifty-turn process-folding test exceeded the existing 60-second timeout. The hook-indicator cases passed. One diagnostic retry of the failed macOS TUI shard passed all 1185 tests, with folding taking 29.90 seconds (10.89 seconds locally). No timeout or source change was made to that test; the first timeout remains recorded in attempt 1.
  • Local publication probes covered a successful gh warning, a draft on a later page and HTTP 401, with all GitHub writes stubbed. The committed patch matches the patch in the earlier successful wheels byte for byte and applies to the pinned 3.2.0 archive with multibuild's -p0 convention.

No release or tag was created. This PR remains open for maintainer review and merge.

@openjiuwen-collaboration-bot

openjiuwen-collaboration-bot Bot commented Oct 25, 2026 •

Copy link
Copy Markdown
Contributor

head_sha: 9197ba33cf090b693f64a0a749720abf65a95fe2

变更摘要

本 PR 针对 .github/workflows/pillow-manylinux2014.yml 这一专用构建工作流,为 Linux 离线二进制升级 Pillow 依赖 pin 做前置准备:将 PILLOW_VERSION 提升到 13.0.0,并同步锁定 Pillow、pillow-depends 与测试镜像的不可变提交;同时简化依赖源码准备阶段的逻辑,改由 pinned 的 pillow-depends 检出直接提供所需归档文件并仅保留 SHA-256 校验;发布环节新增基于实际 wheel 文件名与哈希生成的 offline_wheel_overrides.txt,并强制要求 x86_64 与 aarch64 两个架构的 wheel 均存在才允许发布。

主要改动

  • 版本与依赖提交 pin 更新:PILLOW_VERSION 由 12.3.0 改为 13.0.0,PILLOW_COMMIT、PILLOW_DEPENDS_COMMIT、TEST_IMAGES_COMMIT 全部替换为 13.0.0 发布时的对应提交,确保构建与测试源码可复现。
  • 依赖源码准备步骤简化:原先把补丁式 case 分支复制/下载归档的循环改为直接对 pinned pillow-depends 目录中的归档执行 sha256sum --strict -c -,仅保留显式校验清单,归档名随之调整(如 2.3.3.tar.gz、v2.5.4.tar.gz)。
  • HarfBuzz 版本升级:HarfBuzz 归档由 14.2.1 升级到 14.5.0,并更新为对应的 harfbuzz-14.5.0.tar.xz 文件名与新的 SHA-256 校验值。
  • 新增 offline_wheel_overrides.txt 生成:发布前按 x86_64、aarch64 拼接预期 wheel 文件名,缺失任一架构即报错退出,随后从实际 wheel 计算 SHA-256 并输出引用行,避免使用推测哈希。
  • 发布产物与流程说明更新:gh release create 调用中新增 offline_wheel_overrides.txt 作为附件,并在文件头注释说明该文件需与依赖 pin 升级一并复制到 scripts/offline_wheel_overrides.txt。

@openjiuwen-collaboration-bot

openjiuwen-collaboration-bot Bot commented Oct 25, 2026 •

Copy link
Copy Markdown
Contributor

head_sha: 9197ba33cf090b693f64a0a749720abf65a95fe2

代码审查

审查结论

逐文件审查确认

  • .github/workflows/pillow-manylinux2014.yml(唯一改动文件,+30 −25):已逐条审查全部 4 处 hunk —— ①头部注释新增两行(25-26,仅文档,YAML 键拼写无误);②env 中 PILLOW_VERSION/PILLOW_COMMIT/PILLOW_DEPENDS_COMMIT/TEST_IMAGES_COMMIT 版本与提交升级(59-65,键名拼写正确,env 下均为标量,无结构错误);③Stage pinned dependency sources 从“下载/复制 + 逐条校验”改为对已检出目录直接 sha256sum --strict -c - 校验(146-157,heredoc 缩进与 hash␠␠name 两空格格式在 YAML block scalar 剥离后仍合法,HarfBuzz 升到 14.5.0 后哈希行随之更新,缺失文件会显式失败而非静默通过,未发现逻辑缺陷);④publish 作业新增 offline_wheel_overrides.txt 生成并作为 release 资产上传(286-296、308,发现下述两处问题)。YAML 键名(on/inputs/permissions/concurrency/strategy.matrix/runs-on/uses/with/working-directory 等)拼写均正确。

问题统计

  • P0:0
  • P1:0
  • P2:1(硬编码 wheel 文件名的平台标签顺序/脆弱性,位于 288-296)
  • P3:1(循环重定向吞掉 ::error:: 日志,位于 291-296)

整体风险判断:构建路径(依赖钉住、哈希校验、manifest 比对、glibc 下限检查)改动稳健,风险集中在新增的发布路径。第 1 条问题一旦成立,会让 publish=true 的运行在完成两次完整 manylinux 构建后必然失败、拿不到 release,而它正是本次 PR 的交付目标(Rollout 第 1 步);建议合并前至少按建议改为从实际 wheel 列表筛选。其余为诊断可观测性降级,不影响正确性。

类型 数量
🔴 阻塞 0
🟡 建议 1

💬 仅评论

fi
sha256=$(sha256sum -- "$wheel" | cut -d ' ' -f 1)
echo "pillow ${PILLOW_VERSION} ${machine} ${sha256} ${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/releases/download/${tag}/${wheel}"
done > offline_wheel_overrides.txt

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

head_sha: 9197ba33cf090b693f64a0a749720abf65a95fe2

🟡 Medium Priority

改动行(289)把期望的 wheel 文件名写死为 pillow-${PILLOW_VERSION}-cp314-cp314-manylinux2014_<arch>.manylinux_2_17_<arch>.whl,即把 manylinux2014 这个旧别名放在 PEP 600 标签 manylinux_2_17_<arch> 之前。
证据链:auditwheel/cibuildwheel 生成 manylinux2014 wheel 时,平台标签来自 packaging 的 manylinux 标签序列(先 PEP 600 精确标签,再旧别名),实际产物形如 pillow-13.0.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl;PyPI 上大量 manylinux2014 wheel 均为 manylinux_2_17_<arch>.manylinux2014_<arch> 顺序。本行给出的顺序与之相反。
失败模式:紧邻的 wheels=(*.whl) 已经保证恰好存在两个 wheel,所以 [ ! -f "$wheel" ] 唯一现实的触发条件就是文件名不匹配——此时该步打印 missing expected wheel ... 后 exit 1,整个 publish 作业在完成两次完整构建之后失败,release 不会创建,PR 中 Rollout 第 1 步(用 publish=true、build=1 手工运行)直接无法完成;旧版本此处直接用 "${wheels[@]}" 通配结果,不存在该脆弱点。此外,即使当前顺序凑巧匹配,任何上游标签集合/顺序变化(auditwheel 版本、--plat 参数、新增别名)都会让这行硬编码字符串与实际产物不一致,与 286 行注释所说的“from the actual wheels”自相矛盾。

建议:把 for 循环体改成按架构从已收集的 ${wheels[@]} 中筛选实际 wheel(后缀 _<arch>.whl),校验恰好一个,再对其计算 sha256;错误信息里同时打印实际的 wheel 文件名,便于诊断。

Suggested change
done > offline_wheel_overrides.txt
for machine in x86_64 aarch64; do
matches=()
for candidate in "${wheels[@]}"; do
case $candidate in
*"${machine}.whl") matches+=("$candidate") ;;
esac
done
if [ "${#matches[@]}" -ne 1 ]; then
echo "::error::expected exactly one ${machine} wheel, found ${#matches[@]} of: ${wheels[*]}"
exit 1
fi
wheel=${matches[0]}
sha256=$(sha256sum -- "$wheel" | cut -d ' ' -f 1)
echo "pillow ${PILLOW_VERSION} ${machine} ${sha256} ${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/releases/download/${tag}/${wheel}"
done > offline_wheel_overrides.txt

@openjiuwen-collaboration-bot

Copy link
Copy Markdown
Contributor

head_sha: 9197ba33cf090b693f64a0a749720abf65a95fe2

任务名称 结果 日志操作
静态检查 ✅SUCCESS 点此跳转
禁用词扫描 ✅SUCCESS 点此跳转
防投毒检查 ✅SUCCESS 点此跳转
开源合规检查 ✅SUCCESS 点此跳转
UT测试 ✅SUCCESS 点此跳转
ST测试 N/A N/A
build 编译包 N/A N/A
ruff codecheck ✅SUCCESS N/A
issue关联检查 N/A N/A
pr size检查 N/A N/A

@openjiuwen-collaboration-bot

Copy link
Copy Markdown
Contributor

head_sha: 3cf4a8d5b8135f1f59fea8021e8ec657dd85b869

任务名称 结果 日志操作
静态检查 ✅SUCCESS 点此跳转
禁用词扫描 ✅SUCCESS 点此跳转
防投毒检查 ✅SUCCESS 点此跳转
开源合规检查 ✅SUCCESS 点此跳转
UT测试 ✅SUCCESS 点此跳转
ST测试 N/A N/A
build 编译包 N/A N/A
ruff codecheck ✅SUCCESS N/A
issue关联检查 N/A N/A
pr size检查 N/A N/A

@openjiuwen-collaboration-bot

Copy link
Copy Markdown
Contributor

head_sha: 1974e96c3fa456ea3949d56c90538f4de95f056f

任务名称 结果 日志操作
静态检查 ✅SUCCESS 点此跳转
禁用词扫描 ✅SUCCESS 点此跳转
防投毒检查 ✅SUCCESS 点此跳转
开源合规检查 ✅SUCCESS 点此跳转
UT测试 ✅SUCCESS 点此跳转
ST测试 N/A N/A
build 编译包 N/A N/A
ruff codecheck ✅SUCCESS N/A
issue关联检查 N/A N/A
pr size检查 N/A N/A

@openjiuwen-collaboration-bot

Copy link
Copy Markdown
Contributor

head_sha: 1974e96c3fa456ea3949d56c90538f4de95f056f

任务名称 结果 日志操作
静态检查 ✅SUCCESS 点此跳转
禁用词扫描 ✅SUCCESS 点此跳转
防投毒检查 ✅SUCCESS 点此跳转
开源合规检查 ✅SUCCESS 点此跳转
UT测试 ✅SUCCESS 点此跳转
ST测试 N/A N/A
build 编译包 N/A N/A
ruff codecheck ✅SUCCESS N/A
issue关联检查 N/A N/A
pr size检查 N/A N/A

@openjiuwen-collaboration-bot

Copy link
Copy Markdown
Contributor

head_sha: 3f44e8cd1bb6a0890a94555554d65b0994887056
Stale: GitHub PR head has moved on; preserving this CI result without changing ci-running.

任务名称 结果 日志操作
静态检查 ✅SUCCESS 点此跳转
禁用词扫描 ✅SUCCESS 点此跳转
防投毒检查 ✅SUCCESS 点此跳转
开源合规检查 ✅SUCCESS 点此跳转
UT测试 ✅SUCCESS 点此跳转
ST测试 N/A N/A
build 编译包 N/A N/A
ruff codecheck ✅SUCCESS N/A
issue关联检查 N/A N/A
pr size检查 N/A N/A

@openjiuwen-collaboration-bot

Copy link
Copy Markdown
Contributor

head_sha: 4200959ec65c7e5dcddea8499edab0f4c21e32b3

任务名称 结果 日志操作
静态检查 ✅SUCCESS 点此跳转
禁用词扫描 ✅SUCCESS 点此跳转
防投毒检查 ✅SUCCESS 点此跳转
开源合规检查 ✅SUCCESS 点此跳转
UT测试 ✅SUCCESS 点此跳转
ST测试 N/A N/A
build 编译包 N/A N/A
ruff codecheck ✅SUCCESS N/A
issue关联检查 N/A N/A
pr size检查 N/A N/A

Build Pillow 13.0.0 for CPython 3.14 at the glibc 2.17 floor using
immutable upstream source, cibuildwheel and patched manylinux image pins.
Check the complete native source manifest before and after compilation,
record SBOM provenance, and validate real wheel names, hashes and override
URLs before publishing. Reject reused tags and leftover draft releases.

Vendor the upstream libjpeg-turbo libspng compatibility patch in its applied
-p0 form, check it out at the workflow revision, and verify its SHA-256.
This avoids rebuilding from GitHub's dynamically generated patch response.

Also stabilize the hook-indicator threshold tests reported by macOS CI:
control only the indicator's clock while preserving real Textual timers
so GC pauses cannot advance a hook past its one-second display threshold.

Runtime Pillow/pypdf pins and offline wheel references follow in a separate
PR after the rebuilt wheels are published and their GitCode tag is synced.
@0x7c13
0x7c13 force-pushed the 0x7c13/pillow-13-manylinux2014 branch from 4200959 to 59612e6 Compare October 26, 2026 00:35
@openjiuwen-collaboration-bot

Copy link
Copy Markdown
Contributor

head_sha: 59612e6f0bb01e26a8b1ff9a1938513d975176c0

任务名称 结果 日志操作
静态检查 ✅SUCCESS 点此跳转
禁用词扫描 ✅SUCCESS 点此跳转
防投毒检查 ✅SUCCESS 点此跳转
开源合规检查 ✅SUCCESS 点此跳转
UT测试 ✅SUCCESS 点此跳转
ST测试 N/A N/A
build 编译包 N/A N/A
ruff codecheck ✅SUCCESS N/A
issue关联检查 N/A N/A
pr size检查 N/A N/A

@openjiuwenai
openjiuwenai merged commit d8d5f24 into openJiuwen-ai:main Oct 26, 2026
33 of 35 checks passed
@openjiuwen-release-bot

Copy link
Copy Markdown
Contributor

🤖 This pull request has been merged, and the target branch is up to date.

openjiuwen-release-bot Bot pushed a commit that referenced this pull request Oct 26, 2026
[mirror] #123: build: bump Pillow to 13.0.0 and pypdf to 6.21.2

Created-by: openjiuwen-sync
Commit-by: Jiaqi (0x7c13) Liu
Merged-by: Ox7c13
Description: Paired: [GitHub #123](#123) ↔ [GitCode !90](https://gitcode.com/openJiuwen/iCode/merge_requests/90)

<!-- bot1-mirror-meta -->
github_pr: 123
head_repo: 0x7c13/iCode
head_ref: 0x7c13/pillow-13-pin
head_sha: dbbef11
base_repo: openJiuwen-ai/iCode
base_ref: main
github_repo: openJiuwen-ai/iCode
base_branch: main
base_sha: d8d5f24
github_user: 0x7c13
<!-- /bot1-mirror-meta -->

GitHub PR mirror for CodeArts CI.

<!-- bot1-source-body -->
Upgrade Pillow from 12.3.0 to 13.0.0 and pypdf from 6.21.1 to 6.21.2, and regenerate `uv.lock`. The same commit updates both Linux offline overrides to the published `pillow-13.0.0-manylinux2014.1` wheels built by #122. Only the two requested dependency versions change in the lockfile.

The release tag resolves to `d8d5f24fa69037d3b24af83a6284ca602c0a5a78`. Both public wheel downloads and both manifest downloads were verified against their release SHA-256 digests; the committed override rows exactly match the published manifest. The release is a pre-release and is not a draft.

Compatibility review against the [Pillow 13 release notes](https://pillow.readthedocs.io/en/stable/releasenotes/13.0.0.html) and [pypdf 6.21.2 changelog](https://pypdf.readthedocs.io/en/6.21.2/meta/CHANGELOG.html):
- No removed Pillow APIs are used by `src/`. `Image.open(formats=...)` still accepts the existing allowlists, and pypdf still decodes through the `PIL.Image` module wrapped by the document parser. Its explicitly named image formats remain within the reviewed set.
- Pillow no longer saves mode I directly as PNG; the clipboard path already converts unsupported modes to RGBA, and document/attachment compression converts to RGB before JPEG encoding.
- Pillow now applies `reducing_gap` when thumbnailing RGBA/LA images. This can change chat-preview sampling pixels; it requires no API adaptation. Document/attachment downscaling operates on RGB. Existing image preview, clipboard, document-image and PDF decoder restriction tests exercise these paths.

Validation:
- `uv lock --check`: passed.
- Ruff checks and formatting: passed.
- `uv build` and `uv run python scripts/check_wheel.py dist/icode_tui-0.31.0-py3-none-any.whl`: passed, including fresh-index dependency resolution, all CLI help commands, TUI/document imports, bundled docs and ripgrep.
- Smart Test with exactly `pyproject.toml uv.lock scripts/offline_wheel_overrides.txt` automatically escalated to the full non-integration suite: **33,163 tests passed, 60 skipped; 1,241 architecture checks passed, 1 deselected**. This includes `test_offline_wheel_overrides_match_the_lock` and the image/PDF restriction tests.
- Installed-version probes decoded and normalized all seven allowed document formats, verified pypdf's named-format subset and confirmed the decoder wrapper still installs. Both published Linux wheels contain 26 ELF objects with a maximum requirement of GLIBC_2.17.
- [PR CI on dbbef11](https://github.com/openJiuwen-ai/iCode/actions/runs/40254598242): all jobs passed on the first attempt across Linux, macOS and Windows, including lint, architecture, test shards, type checks, builds and wheel installation.

Follow-up: recheck that the release remains published after the next GitCode-to-GitHub sync. No merge or new release is requested by this PR.
<!-- /bot1-source-body -->

See merge request: openJiuwen/iCode!90
openjiuwen-release-bot Bot pushed a commit that referenced this pull request Oct 26, 2026
[mirror] #124: chore(release): bump version to 0.32.0

Created-by: openjiuwen-sync
Commit-by: Jiaqi (0x7c13) Liu
Merged-by: Ox7c13
Description: Paired: [GitHub #124](#124) ↔ [GitCode !91](https://gitcode.com/openJiuwen/iCode/merge_requests/91)

<!-- bot1-mirror-meta -->
github_pr: 124
head_repo: 0x7c13/iCode
head_ref: dev/release-0.32.0
head_sha: c9d1882
base_repo: openJiuwen-ai/iCode
base_ref: main
github_repo: openJiuwen-ai/iCode
base_branch: main
base_sha: e225cb1
github_user: 0x7c13
<!-- /bot1-mirror-meta -->

GitHub PR mirror for CodeArts CI.

<!-- bot1-source-body -->
Bump iCode to 0.32.0 so a release is cut from current `main`.

## Changes
- `pyproject.toml` and `uv.lock`: the package version moves from 0.31.0 to 0.32.0.
- i18n catalogs (`locales/chrys.pot`, `locales/zh-Hans/LC_MESSAGES/chrys.po`, the compiled `chrys.mo`): the `Project-Id-Version` header now says 0.32.0. No message changes.

## Release
Merging this changes the version in `pyproject.toml` on `main`, so `tag-release.yml` creates the `v0.32.0` tag and starts `cd.yml` for that tag.

This is the first release whose Linux offline binaries bundle Pillow 13.0.0, from the glibc 2.17 wheels published as `pillow-13.0.0-manylinux2014.1` (#122, #123).

## Included since 0.31.0
- #123 Pillow 13.0.0 and pypdf 6.21.2 (pypdf security fixes); the Linux offline binaries take the matching glibc 2.17 Pillow wheels
- #122 the manylinux2014 Pillow wheel workflow builds 13.0.0 on patched build images, with every source archive pinned by SHA-256 (build-only); hook indicator tests stabilized
- #121 completed turns fold into activity sections; the docs show how to request readable Claude thinking summaries
- #120 the prompt editor asks for confirmation before its Discard button closes it
- #111 a sidebar Hooks tab lists every hook run, and each run is recorded once
- GitCode !85 the main chat shows the model's thinking as it streams; a resumed session replays it folded, and `/fold` folds it too
- GitCode !84 the chat follows new content only while you are at the bottom
- GitCode !83 a hook run log cut to size keeps file paths that are not valid UTF-8 intact
- GitCode !82 faster startup: a loading screen with the logo paints before the main screen and agent load, and F12 works again once the agent is ready

## Verification
- `uv lock --check` passes.
- `scripts/i18n.py extract/update/compile/check` runs clean, and a second run changes nothing.
- Tests were not run locally; CI covers them.
<!-- /bot1-source-body -->

See merge request: openJiuwen/iCode!91
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants