Skip to content

fix: frontmatter gate crashed on a tracked symlink with an unreachable target - #3

Merged
scott-wueschinski-GTMify merged 1 commit into
mainfrom
fix/frontmatter-dangling-symlinks
Jul 29, 2026
Merged

fix: frontmatter gate crashed on a tracked symlink with an unreachable target#3
scott-wueschinski-GTMify merged 1 commit into
mainfrom
fix/frontmatter-dangling-symlinks

Conversation

@scott-wueschinski-GTMify

Copy link
Copy Markdown
Contributor

Found by the gate's own first real CI run, against gtmify-config, where it died with a FileNotFoundError on skills/_gstack-command/SKILL.md.

The cause is a real repo defect, not a CI quirk

That path is a committed symlink whose target is the absolute /Users/scottwueschinski/claude/config/gtmify/skills/gstack/SKILL.md, and it points into skills/gstack/, which that repo gitignores. It resolves only on the machine that created it, and is dangling on the second machine and in CI.

An audit found roughly 145 tracked symlinks in gtmify-config, the large majority with absolute /Users/... targets. That is its own piece of work and is not addressed here.

Why skip rather than fail

Three behaviors were possible and only one is right:

Option Verdict
Crash Obviously wrong
Fail Turns tier A permanently red over a pre-existing problem the gate was not built to solve. A permanently red gate gets ignored within a week
Count, name, exclude from the verdict Chosen

The summary now states plainly how many files were not assessed and why. A gate that quietly skips work reads as full coverage, which is worse than one that admits a gap.

A dangling symlink still cannot mask a genuine violation elsewhere in the same run. There is a test for exactly that.

Tests

New tests/frontmatter_gate_test.sh, 8 cases, all passing, including the one that crashed:

ok  valid_skill_passes
ok  missing_frontmatter_fails
ok  missing_description_fails
ok  unclosed_frontmatter_fails
ok  dangling_symlink_is_skipped_not_fatal
ok  dangling_does_not_mask_real_failure
ok  nested_agent_docs_are_out_of_scope
ok  repo_with_no_skills_noops

The self-test now iterates tests/*_test.sh instead of naming one file, so a new suite is picked up without editing the workflow. shellcheck clean, junk suite still 35/0.

🤖 Generated with Claude Code

…e target

Found by the gate's own first real CI run, against gtmify-config, where it died with
a FileNotFoundError on skills/_gstack-command/SKILL.md.

The cause is a genuine repo defect, not a CI quirk. That path is a committed symlink
whose target is the ABSOLUTE /Users/scottwueschinski/claude/config/gtmify/skills/
gstack/SKILL.md, and it points into skills/gstack/, which that repo gitignores. So it
resolves only on the machine that created it and is dangling everywhere else,
including on the second machine and in CI. An audit of that repo found roughly 145
tracked symlinks, the large majority with absolute targets.

Three behaviors were possible and only one is right. Crashing is obviously wrong.
Failing would turn tier A permanently red over a pre-existing problem the gate was
not built to solve, and a permanently red gate gets ignored within a week. So these
are counted, named in the output with their unreachable target, and excluded from the
verdict, and the summary states plainly how many were not assessed. A gate that
quietly skips work reads as full coverage and is worse than one that admits a gap.

A dangling symlink still cannot mask a real violation elsewhere in the same run;
there is a test for exactly that.

Adds tests/frontmatter_gate_test.sh, 8 cases, including the one that crashed. The
self-test now iterates tests/*_test.sh rather than naming one file, so a new suite is
picked up without editing the workflow.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@scott-wueschinski-GTMify
scott-wueschinski-GTMify merged commit 1d4961d into main Jul 29, 2026
1 check passed
@scott-wueschinski-GTMify
scott-wueschinski-GTMify deleted the fix/frontmatter-dangling-symlinks branch July 29, 2026 12:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant