What I Shipped This Week
This week first tightened the safety and consistency boundaries around skills sync, then added four new projects, four long-form essays, and an MDX-based writing path to the personal site.
The through-line: tighten the boundary, then grow the content
W31 had two halves. The first half fixed incidents exposed by automated skills sync. The second half expanded the site with new projects and essays. One side was about safety; the other was about growth. Together, they kept the public site richer without letting it drift out of control.
Skills sync incident fixes
The July 26 and July 27 automatic runs proved that the sync mechanism worked, but they also exposed three problems.
First, the old --prune path treated “the directory exists but cannot be read” as “this skill was deleted locally.” That caused broken symlinks or missing SKILL.md files to be pruned, including the site’s own zhanglu skill. The fix added a present set: if a directory exists, it is never automatically pruned; unreadable entries are reported separately.
Second, 17 internal-service aic-* skills were synced to the public site, and their descriptions contained internal service responsibilities and module boundaries. The fix added EXCLUDE = ['aic-*'] to sync-skills.mjs, matching both directory slugs and frontmatter name; excluded entries are not written, and any repository remnants are removed.
Third, Chinese skills grew while the English side lacked matching files, and the build still passed. That made /skills and /en/skills silently inconsistent. After the fix, sync:auto exits with failure when Chinese and English collections are not aligned. A warning that can still deploy is not a real guardrail.
The cleanup also restored /skills/zhanglu, added a skill_md field to skill detail APIs so the README installer can generate a valid SKILL.md, and replaced stale mba examples with the still-present boss skill.
The rules for removing public content became explicit
After the skills cleanup, production verification found a subtler issue: URLs deleted from the repository could still return old 200 pages. Further checks traced this to Cloudflare serving old copies, not to a failed build.
That rule is now documented in AGENTS.md: for any takedown or content-removal change, verification must include the old URLs, and Cloudflare purge may be required. Additions and edits usually deploy cleanly; deletions have an extra acceptance step.
The auto-sync script learned how to update itself
The July 28 automatic sync exposed a lower-level bug. auto-sync-skills.sh begins by fast-forwarding to the latest remote code. If that merge replaces the script file itself, bash can continue reading the new file from the old byte offset, causing later logic to misfire.
The fix compares the script’s md5 before and after the merge. If the file changed, it re-execs itself once with ZHANGLU_REEXEC=1. That makes future changes to the automation script take effect on the next run instead of getting caught between the old process and the new file.
Four new projects entered the site
The second half of the week added four projects, each with Chinese and English content, detail pages, JSON endpoints, and covers:
- SiliconForge: requirements in, software out; turn business intent into a machine-readable PRD, then let an AI team implement and verify it.
- excel-ai-analyst: treat complex spreadsheets as undocumented legacy systems, starting with a browser-local structural analysis.
- AI Achievement Interview: use a 1-2 minute voice interview, adaptive follow-ups, and one scoring ruler to reduce review distortion.
- BRAIN / 27 Opportunity Radar: a PhD / joint-program / research-assistant / campus-hiring radar for brain science x AI candidates graduating in 2027.
The project entries kept each site’s stated boundaries instead of pretending demos are production systems: two-stage delivery labels, browser-local analysis limits, static snapshots, and “official announcements first” all stayed in the copy.
Four essays and the MDX writing path
Each of the four new sites then got a bilingual long-form essay, and new essays moved to MDX.
Older long posts were hand-written .astro files with lots of HTML. The new path adds src/layouts/Post.astro, while each article uses .mdx with markdown body text and frontmatter pointing to the layout. Going forward, an on-site essay needs one .mdx page plus one articles index entry; /posts is derived from the articles collection instead of a hand-maintained array.
The four essays each start from a concrete problem:
- SiliconForge: why “AI writes code” should not only serve developers.
- excel-ai-analyst: why a years-old spreadsheet is really an undocumented legacy codebase.
- AI Achievement Interview: how to make people who do not present well visible.
- BRAIN Radar: why the scarce thing is not a list of opportunities, but their ordering.
This week in one line: the public site can keep growing, but every growth step has to preserve boundaries, bilingual alignment, machine-readable APIs, and verifiable deployment.