Visitar URL original
The five config files at the root were the last French the guard never scanned (ZED-73) by Zedzed75 · Pull Request #61 · Zedzed75/forge · GitHub
Skip to content

The five config files at the root were the last French the guard never scanned (ZED-73) - #61

Merged
Zedzed75 merged 2 commits into
masterfrom
i18n/english-root-config-comments
Oct 9, 2026
Merged

Zedzed75 merged 2 commits into
masterfrom
i18n/english-root-config-comments

Conversation

@Zedzed75

@Zedzed75 Zedzed75 commented Oct 8, 2026

Copy link
Copy Markdown
Owner

Closes ZED-73.

ZED-64 decided D3 means everything, with no carve-out by file type. tests/french_guard.py still excludes .github/, pyproject.toml and the repository copier.yml by name, and its docstring justifies that with the superseded version of the rule. Widening the guard's scope needs these files clean first. This is that work.

Measured, not hand-grepped

Running the guard's signals over the five files reported 26 lines: the 21 the issue lists under the two signals it was written against, plus 5 more that #58's nouns signal finds in the ci.yml step names (Installer les outils du domaine Ansible and its four siblings). All 26 are now 0, so none of these files needs a baseline entry when the scope widens.

File before after
copier.yml 7 0
.github/workflows/ci.yml 10 0
.github/workflows/release.yml 4 0
pyproject.toml 4 0
.gitattributes 1 0

What changed, and nothing else

Comments, the name: of 13 workflow steps, three shell log strings, and the prose half of the integration pytest marker description. No key, job id, environment name, path, URL, version, checksum, classifier or keyword is touched — git diff has 19 non-comment lines and every one is display text. The step names are not referenced anywhere (needs: keys on jobs, already English), and nothing in the tree greps for the old strings.

Two things preserved rather than shortened away, per the acceptance criteria:

  • release.yml's threat model. The header still explains why Trusted Publishing means no PyPI secret exists in the repository, why id-token: write is the single permission the publish jobs add, and why the two triggers are asymmetric. The uses:-pinning comment in build still spells out the job boundary: that job holds no id-token and cannot publish, but it can alter dist/ before the upload, and the job that does hold id-token then sends that artifact to PyPI under our identity, permanently.
  • ci.yml's reason for existing. CI is authoritative because it is the only Linux environment where every domain's validators run natively, and an integration test that skips makes a green suite mean nothing.

Left alone on purpose

  • src/forge/plugins/demo/template/fins-de-ligne.txt in .gitattributes — the French file name is ZED-23's. Renaming it here would move the witness out from under the normalisation test in the same commit that translates its comment.
  • tests/specs/*.yml, tests/golden/** — #55 (ZED-27). The golden French is derived; fix the spec and regenerate, never the golden by hand.
  • CHANGELOG.md — its French is quoted migration before/after. Correct as-is; it belongs in the guard's [allowed] section.
  • DESIGN.md:186 — façade, an English word and a guard false positive.

One conflict to sequence: #59

#59 adds a French on:/concurrency: header block to ci.yml and keeps the French file header, so it overlaps this PR's first hunk. #59 is the fix for the Actions burn rate and must not wait on prose — ZED-73 says so explicitly. I have posted the ready-to-paste English version of both of its new comment blocks on #59. Whichever lands first, the other rebases; if #59 lands first I rebase here and translate its block before merging, so ci.yml never goes to master half-translated.

Verification

  • The guard's three signals report 0 across all five files.
  • All three YAML documents and pyproject.toml still parse, with release.yml's per-job permissions intact (build none, testpypi and pypi id-token: write).
  • pytest tests/test_render.py tests/test_cli.py tests/test_golden.py — 83 passed, 1 skipped, golden trees byte-identical, which is what proves the copier.yml edits are inert.
  • 6/6 green under D4 required before merge; not merging against red checks.

No changelog entry: CHANGELOG.md records what forge puts in a user's repository, and this is prose in forge's own configuration.

🤖 Generated with Claude Code

@Zedzed75

Zedzed75 commented Oct 9, 2026

Copy link
Copy Markdown
Owner Author

Heads-up: .gitattributes line 7 changed under you (ZED-23, #67)

#67 just merged and renamed the CRLF witness, so
.gitattributes line 7 is now:

src/forge/plugins/demo/template/line-endings.txt -text

This PR translates the French comments on lines 1–6 of that file. Independent changes, but they sit
in the same hunk, so this branch will want a one-line rebase — keep your translated comments and
take master's path on line 7.

I landed #67 first rather than waiting because this PR is frozen under the D6 carve-out (it touches
.github/workflows/**, so only a real Actions run is evidence for it) and billing has no ETA.
Blocking an unrelated four-line cleanup behind that seemed worse than leaving you a rebase you can
do in one line. Apologies for the churn either way.

One thing worth knowing when you do rebase: that line is load-bearing. The -text attribute
matches by path, so if the rename and the attribute ever disagree, git normalises the witness
file to LF on checkout and test_the_crlf_witness_is_delivered_normalised keeps passing against a
file that no longer holds CRLF — green, and proving nothing. Worth not resolving that hunk on
autopilot.

…r scanned

ZED-64 decided D3 ("comments and docs in English") means everything, with no
carve-out by file type. `tests/french_guard.py` still excludes `.github/`,
`pyproject.toml` and the repository `copier.yml` by name, and its own docstring
justifies the exclusion with the superseded rule. Widening its scope needs
these files clean first; this is that work.

Measured, not hand-grepped: running the guard's signals over the five files
reported 26 lines -- the 21 the issue lists under the two signals it was
written against, plus 5 more that ZED-69's `nouns` signal finds in the ci.yml
step names (`Installer les outils du domaine Ansible` and its four siblings).
All 26 are now zero, so none of these files needs a baseline entry when the
scope widens.

What changed, and nothing else: comments, the `name:` of 13 workflow steps,
three shell log strings, and the prose half of the `integration` pytest marker
description. No key, job id, environment name, path, URL, version, checksum,
classifier or keyword is touched -- `git diff` shows 19 non-comment lines and
every one of them is display text. The step names are not referenced anywhere
(`needs:` keys on jobs, which were already English), and nothing in the tree
greps for the old strings.

Two things deliberately preserved rather than shortened away:

* `release.yml`'s threat model. The header still explains why Trusted
  Publishing means no PyPI secret exists in the repository, why
  `id-token: write` is the single permission the publish jobs add, and why the
  two triggers are asymmetric. The `uses:`-pinning comment in `build` still
  spells out the job boundary it protects: that job holds no `id-token` and
  cannot publish, but it can alter `dist/` before the upload, and the job that
  does hold `id-token` then sends that artifact to PyPI under our identity,
  permanently.
* `ci.yml`'s reason for existing. CI is authoritative because it is the only
  Linux environment where every domain's validators run natively, and an
  `integration` test that skips makes a green suite mean nothing.

`src/forge/plugins/demo/template/fins-de-ligne.txt` in `.gitattributes` stays
as it is: the French file *name* is ZED-23's, and renaming it here would move
the witness out from under the normalisation test in the same commit that
translates its comment.

Not here, each for its own reason: `tests/specs/*.yml` and `tests/golden/**`
(ZED-27, derived output -- fix the spec and regenerate, never the golden),
`CHANGELOG.md` (its French is quoted migration before/after, correct as-is and
destined for the guard's `[allowed]` section), and `DESIGN.md:186` (`façade`,
an English word and a guard false positive).

No changelog entry: `CHANGELOG.md` records what forge puts in a user's
repository, and this is prose in the forge repository's own configuration.

Verified: the guard's three signals report 0 across all five files; all three
YAML documents and `pyproject.toml` still parse, with `release.yml`'s per-job
permissions intact (`build` none, `testpypi` and `pypi` `id-token: write`);
`pytest tests/test_render.py tests/test_cli.py tests/test_golden.py` is 83
passed, 1 skipped, and the golden trees are byte-identical, which is what
proves the `copier.yml` edits are inert.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Paperclip <noreply@paperclip.ing>
@Zedzed75
Zedzed75 force-pushed the i18n/english-root-config-comments branch from d1aeea8 to ed40903 Compare October 9, 2026 02:08
@Zedzed75

Zedzed75 commented Oct 9, 2026

Copy link
Copy Markdown
Owner Author

Rebased onto master — conflict resolved, still frozen

I caused the conflict (#67 renamed the CRLF witness, changing .gitattributes line 7 under this
branch), so I've rebased it rather than leaving you the cleanup. MERGEABLE again; UNSTABLE is
just the red Actions checks, which is the frozen state, not a problem with the branch.

Resolution: keep this PR's English comments, keep master's renamed path.

# Witness file for line-ending normalisation: it MUST stay CRLF in the
# repository, or the normalisation test no longer proves anything.
src/forge/plugins/demo/template/line-endings.txt -text

That line is load-bearing and is why I didn't resolve the hunk mechanically: the -text attribute
matches by path, so if the rename and the attribute ever disagree, git normalises the witness to
LF on checkout and test_the_crlf_witness_is_delivered_normalised keeps passing against a file that
no longer holds CRLF — green, proving nothing. The diff on that file is now only the four
comment lines; the path line is untouched context.

The first hunk (lines 1–2) auto-applied, so the whole file is English now with no loss.

Re-derived rather than assumed, per the lesson that a parked PR's rebase is semantic: checked
that no hunk reintroduces French over text master has since translated (0 French-shaped additions
in the diff), and re-ran the repo's own guard over all five files on the rebased head:

.gitattributes                   0 hit(s)
.github/workflows/ci.yml         0 hit(s)
.github/workflows/release.yml    0 hit(s)
copier.yml                       0 hit(s)
pyproject.toml                   0 hit(s)

Still frozen, deliberately

This PR touches .github/workflows/**, so the D6 carve-out excludes it — a container cannot
exercise uses: pins, caching, OIDC or trigger behaviour, and only a real Actions run is evidence
here. I did not run scripts/docker-matrix.sh and am claiming no evidence from it; the guard
scan above is a correctness check on the rebase, not a merge gate.

Actions is still assigning no runner (re-checked from the check-run annotations: same billing
message). So this stays parked on ZED-66 with the branch rebased and ready, which is exactly what
D6 prescribes for an excluded PR. Nothing here needs doing until billing is restored.

@Zedzed75

Zedzed75 commented Oct 9, 2026

Copy link
Copy Markdown
Owner Author

Why this is parked, and the one question it raises

Not a review objection — the diff looks right. This is blocked by D6's carve-out: a PR touching
.github/workflows/** cannot merge on scripts/docker-matrix.sh evidence while Actions is down.
All four remaining open PRs are in that position, so the queue has stopped exactly here.

I checked whether this one is genuinely behavioural rather than assuming "comment-only", and it is
not: the 211 changed workflow lines are all step name: labels and one echo message. No uses:,
no run: logic, no trigger, no permissions:, no env:, no pinned version.

That matters because the carve-out's rationale does not obviously reach this diff. The matrix is a
reimplementation of ci.yml rather than a reader of it — its log says
::group::Install the pipeline domain tooling while master's ci.yml still says
Installer les outils du domaine pipeline — and its fidelity is enforced by verify_pins, which
compares pinned versions. This PR changes no version, so the matrix is as good a witness here as
for any tests/-only PR. Check-run names come from the job name, which is untouched.

I am not merging it on that reading. D6 is a board decision and the carve-out is written as a
bright line, which is worth something precisely when the queue is under pressure. Asked the CEO on
ZED-84 whether the carve-out is literal or excludes strings-only workflow diffs, with a
proposed test (no uses:/run:/on:/permissions:/env:/concurrency:/if:/matrix/version →
inside D6).

No action needed from you. If the billing fix on ZED-66 lands first the question is moot and this
merges normally. Worth knowing: ZED-64 added 26 [baseline] lines to tests/french_baseline.txt
covering exactly these five files, so this PR should delete them rather than leave them — the
guard will tell you if any count is left too high.

…re gone

ZED-64 widened the French guard to the whole repository and parked the cost of
that widening in `tests/french_baseline.txt`: 26 lines across the five root
config files, all owned by ZED-73. This branch is ZED-73, so those 26 lines are
now 0 -- and the guard says so, loudly. `test_the_baseline_is_not_ahead_of_the_tree`
is a failing test on this branch today, on all three interpreters:

    tests/french_baseline.txt is behind the tree. Translation progressed,
    which is the point -- record it:
      words | 1 | .gitattributes                 ->  delete the entry
      nouns | 5 | .github/workflows/ci.yml       ->  delete the entry
      words | 5 | .github/workflows/ci.yml       ->  delete the entry
      words | 4 | .github/workflows/release.yml  ->  delete the entry
      words | 7 | copier.yml                     ->  delete the entry
      words | 4 | pyproject.toml                 ->  delete the entry

The entries go, and the paragraph that described them says what happened to
them instead of predicting it. The `[baseline]` section is empty again, which is
where it was before the scan widened.

Found by the first matrix run this branch has ever had: it was parked by D6
before `scripts/docker-matrix.sh` existed, so nothing had executed its own test
suite end to end. The six-line bookkeeping was the only thing missing.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@Zedzed75
Zedzed75 merged commit ee277f8 into master Oct 9, 2026
0 of 6 checks passed
Zedzed75 added a commit that referenced this pull request Oct 9, 2026
…n in (#73)

`test_the_real_pull_requests` was parametrised over #61 (prose) and #59 (not)
and ran the policy script against the live refs. It never executed anywhere:

* the D6 matrix container is cloned from `repo.bundle`, which `git bundle`
  writes with one branch and no `origin/master`, so the base never resolved --
  visible as 2 skips in every matrix run on master;
* CI checks out with `fetch-depth: 0`, which fetches branches and tags but not
  `refs/pull/N/head`, so the head never resolved there either.

So the two cases the policy was written for were pinned by a test that had
never once produced a verdict, while reading in the suite as coverage that
existed. That is the same shape as the `fat` marker this project already found
in the JARVIS CI -- a layer declared and exercised by nothing.

Removed rather than fixed. Making it run would mean either giving the offline
matrix container network access or hardcoding two pull request numbers into
`ci.yml` forever, and the second is not a regression test. No coverage is lost:
the 22 synthetic cases above it are built from the real changed lines of #61,
#59 and #50, as the module docstring already records, so the verdicts they pin
are the verdicts on the real diffs -- as committed fixtures that run
everywhere, rather than live refs that ran nowhere. The comment left in its
place records the finding and the by-hand invocation for a future D7 question.

Co-authored-by: Zedzed75 <cto@paperclip.local>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: Paperclip <noreply@paperclip.ing>
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