fix(docs): unblock Pages build by excluding 5 workspace-only symlinks#59
Conversation
…ekyll The 5 files/dirs are workspace-only symlinks pointing to /Users/nhonh/Documents/personal/docs/ on local dev. They resolve fine locally but are broken on the GitHub Actions Pages runner (which has no sibling docs/ directory), causing Jekyll to die with: No such file or directory @ rb_check_realpath_internal - /github/workspace/docs/HARNESS_BACKLOG.md This has been silently failing on every push to main for 5+ days (9 consecutive failures since 2026-06-01). Adding a Jekyll _config.yml with surgical exclude rules preserves the local dev workflow (the symlinks remain tracked) while letting the Pages build complete. The Pages site is the marketing/landing page; the extension itself is unaffected, but having a broken Pages site during the Sat 2026-06-07 launch window is a credibility hit.
There was a problem hiding this comment.
Code Review
This pull request attempts to prevent Jekyll build failures on the CI runner by adding workspace-only symlinks to the exclude list in docs/_config.yml. However, feedback indicates this approach will not work because Jekyll validates symlinks in safe mode before applying exclusion rules, causing the build to still crash. The reviewer suggests deleting these symlinks during the CI workflow instead.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
| exclude: | ||
| - HARNESS.md | ||
| - HARNESS_BACKLOG.md | ||
| - FEATURE_INTAKE.md | ||
| - evidence | ||
| - templates |
There was a problem hiding this comment.
While adding these paths to the exclude list in _config.yml seems like a logical fix, it unfortunately will not prevent the Jekyll build from failing on GitHub Pages.
Why this happens:
- Security Checks in Safe Mode: GitHub Pages runs Jekyll in
safemode. To prevent directory traversal vulnerabilities, Jekyll validates all symlinks in the source directory to ensure they do not resolve to paths outside the source directory. - Realpath Resolution: To perform this validation, Jekyll (or its path resolution dependencies) calls
File.realpathon every symlink it encounters during the initial directory scan. - The Crash: Because these symlinks are broken on the CI runner,
File.realpaththrowsErrno::ENOENT(No such file or directory @ rb_check_realpath_internal). This security check and directory scanning happen before theexcluderules are applied, meaning Jekyll will still crash with the exact same error.
Recommended Solution:
To preserve your local development workflow while unblocking the Pages build, you should delete these broken symlinks during the CI workflow before Jekyll runs.
Since the default GitHub Pages builder doesn't allow running custom commands, you can switch to a custom GitHub Actions workflow for deployment (which is now the standard recommendation by GitHub).
Here is an example of how you can structure the workflow step in .github/workflows/pages.yml to clean up the symlinks before building:
- name: Clean up workspace-only symlinks
run: |
rm -f docs/HARNESS.md docs/HARNESS_BACKLOG.md docs/FEATURE_INTAKE.md
rm -rf docs/evidence docs/templatesThis ensures the symlinks are tracked in Git for your local dev environment, but are safely removed on the CI runner before Jekyll scans the directory.
The pages build has failed on every main push for 5+ days (9 consecutive failures since 2026-06-01). Root cause: 5 symlinks in docs/ point to sibling workspace directories that don't exist on the CI runner: docs/HARNESS.md -> ../../docs/HARNESS.md docs/HARNESS_BACKLOG.md -> ../../docs/HARNESS_BACKLOG.md docs/FEATURE_INTAKE.md -> ../../docs/FEATURE_INTAKE.md docs/evidence/README.md -> ../../../docs/evidence/README.md docs/templates/story.md -> ../../../docs/templates/story.md Jekyll's `entry_filter.rb:symlink_outside_site_source?` check fires during directory scan, before any `exclude:` filter runs, so `_config.yml` excludes cannot rescue it (verified — PR #59 added a _config.yml exclude rule, Pages build still failed identically). The symlinks were intentionally added in commit d39c598 ('docs: wire harness via workspace symlinks') to wire Sisyphus harness scaffolding from /Users/nhonh/Documents/personal/docs/ on local dev. The local dev workflow can be re-established by re-creating the symlinks locally (they don't need to be tracked — workspace tooling, not repo content). Also removes docs/_config.yml (added in PR #59, now dead config: its exclude list references files that will no longer exist). Verified locally: 0 HARNESS/HARNESS_BACKLOG/FEATURE_INTAKE references in repo source code (`git grep` confirmed). They were docs-only artifacts, no code path depends on them.
Problem
The
pages build and deploymentworkflow has been failing on every push to main for 5+ days (9 consecutive failures since 2026-06-01, run IDs 26739555993 → 27065617557). The CI log shows:Root cause
5 symlinks in
docs/point OUTSIDE the cloned repo (they're workspace-only artifacts that resolve to/Users/nhonh/Documents/personal/docs/on local dev):docs/HARNESS.md../../docs/HARNESS.mddocs/HARNESS_BACKLOG.md../../docs/HARNESS_BACKLOG.mddocs/FEATURE_INTAKE.md../../docs/FEATURE_INTAKE.mddocs/evidence/README.md../../../docs/evidence/README.mddocs/templates/story.md../../../docs/templates/story.mdThey were intentionally added in commit
d39c598 docs: wire harness via workspace symlinksso the Sisyphus harness scaffolding is available locally. The symlinks resolve fine on dev but are dangling on the CI runner (which only has the cloned repo, not the workspace).Fix
Surgical Jekyll
_config.ymlwith anexclude:rule for the 5 workspace paths. This:Verification
After merge, the next
pushto main will trigger thepages build and deploymentworkflow. Expected outcome:conclusion: success. The Pages site (https://hoainho.github.io/react-debugger-extension/) will be live.Files changed
docs/_config.yml(new, 9 lines)That's it. One file, 9 lines.
Risk
Tiny. Adding a Jekyll
_config.ymlwith a singleexclude:directive is the most surgical possible fix. Jekyll will use all other defaults unchanged. If the_config.ymlitself somehow breaks the build,git revertis one click.