Skip to content

Commit a8e3988

Browse files
authored
Merge pull request #56 from cemililik/development
docs: README rewrite, inclusive messaging, and v0.7.x housekeeping
2 parents 24de388 + f6f43a6 commit a8e3988

76 files changed

Lines changed: 1459 additions & 720 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.agents/skills/sync-bilingual-docs/SKILL.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ Any change to these paths or their siblings:
1414
- `docs/product_strategy.md` / `product_strategy-tr.md`
1515
- `docs/roadmap.md` / `roadmap-tr.md`
1616
- `docs/reference/*.md` (has matching `-tr.md`)
17+
- `docs/usermanuals/{en,tr}/**/*.md` (the static-site SPA viewer source)
1718

1819
Do **not** use for:
1920
- `docs/standards/*` (English only)
@@ -26,6 +27,24 @@ Do **not** reference any file under gitignored working-memory directories
2627
(`docs/marketing/`, `docs/analysis/`) from the bilingual docs you edit —
2728
those paths are local-only and won't resolve in fresh clones.
2829

30+
**`docs/usermanuals/` is link-isolated.** Pages there feed the static-site
31+
SPA viewer (`site/usermanual.html`), which only renders SPA hash-router
32+
routes (`#/<section>/<page>`) and external HTTPS URLs. Repo-relative
33+
links like `../../../guides/foo.md` or even intra-manual paths like
34+
`../concepts/choosing-trainer.md` 404 in the SPA. When you edit a
35+
usermanual page, every link MUST be one of:
36+
37+
1. A SPA route `#/<section>/<page>` where the target file exists under
38+
`docs/usermanuals/<lang>/<section>/<page>.md`.
39+
2. An absolute HTTPS URL (use `https://github.com/cemililik/ForgeLM/blob/main/<path>`
40+
for project files that live outside the manual — guides, references,
41+
QMS templates, source files, the roadmap).
42+
3. A pure same-file anchor (`#heading-slug`).
43+
44+
The guard `tools/check_usermanual_self_contained.py --strict` enforces
45+
this; see `docs/standards/documentation.md` "User-manual link discipline"
46+
for the full ruleset.
47+
2948
## Required reading
3049

3150
1. [docs/standards/localization.md](../../../docs/standards/localization.md) — the full policy

.claude/skills/sync-bilingual-docs/SKILL.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ Any change to these paths or their siblings:
1414
- `docs/product_strategy.md` / `product_strategy-tr.md`
1515
- `docs/roadmap.md` / `roadmap-tr.md`
1616
- `docs/reference/*.md` (has matching `-tr.md`)
17+
- `docs/usermanuals/{en,tr}/**/*.md` (the static-site SPA viewer source)
1718

1819
Do **not** use for:
1920
- `docs/standards/*` (English only)
@@ -26,6 +27,24 @@ Do **not** reference any file under gitignored working-memory directories
2627
(`docs/marketing/`, `docs/analysis/`) from the bilingual docs you edit —
2728
those paths are local-only and won't resolve in fresh clones.
2829

30+
**`docs/usermanuals/` is link-isolated.** Pages there feed the static-site
31+
SPA viewer (`site/usermanual.html`), which only renders SPA hash-router
32+
routes (`#/<section>/<page>`) and external HTTPS URLs. Repo-relative
33+
links like `../../../guides/foo.md` or even intra-manual paths like
34+
`../concepts/choosing-trainer.md` 404 in the SPA. When you edit a
35+
usermanual page, every link MUST be one of:
36+
37+
1. A SPA route `#/<section>/<page>` where the target file exists under
38+
`docs/usermanuals/<lang>/<section>/<page>.md`.
39+
2. An absolute HTTPS URL (use `https://github.com/cemililik/ForgeLM/blob/main/<path>`
40+
for project files that live outside the manual — guides, references,
41+
QMS templates, source files, the roadmap).
42+
3. A pure same-file anchor (`#heading-slug`).
43+
44+
The guard `tools/check_usermanual_self_contained.py --strict` enforces
45+
this; see `docs/standards/documentation.md` "User-manual link discipline"
46+
for the full ruleset.
47+
2948
## Required reading
3049

3150
1. [docs/standards/localization.md](../../../docs/standards/localization.md) — the full policy

.github/workflows/ci.yml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,20 @@ jobs:
239239
# to ``monkeypatch.delitem`` (auto-restores on teardown).
240240
run: python3 tools/check_no_unguarded_sys_modules_pop.py
241241

242+
- name: User-manual self-contained link guard (strict)
243+
# Post-v0.7.0 cycle: the docs/usermanuals/ tree is the source of
244+
# truth for the static-site SPA viewer (site/usermanual.html +
245+
# site/js/guide.js). The viewer only resolves SPA hash-router
246+
# routes ``#/<section>/<page>`` and external HTTPS URLs.
247+
# Anything else — repo-relative ``../../../guides/...`` paths,
248+
# intra-manual ``../section/page.md`` paths, SPA routes that
249+
# point at a non-existent page — 404s when the user clicks.
250+
# This guard walks every *.md under docs/usermanuals/ and
251+
# fails the gate on any link that would break in the SPA.
252+
# See docs/standards/documentation.md "User-manual link
253+
# discipline" for the full ruleset.
254+
run: python3 tools/check_usermanual_self_contained.py --strict
255+
242256
- name: License check
243257
run: |
244258
test -f LICENSE || (echo "LICENSE file missing" && exit 1)

.markdownlint.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44
"//2": "MD014 (commands-show-output): shell examples in operator docs deliberately show only the command (`$ forgelm audit ...`) without sample output — output snippets rot quickly across versions and would force a doc update on every CLI banner change.",
55
"//3": "MD013 (line-length): bilingual (EN+TR) reference + design docs intentionally carry long lines for paragraph-style explanations, table cells, and prose with long inline links. The 80-col limit is a code-style holdover that hurts readability of documentation; the project's bilingual_parity guard already enforces structural alignment, and the rest of the prose stays human-readable at any reasonable width.",
66
"//4": "MD025 (single-h1): docs/usermanuals/<lang>/<section>/<page>.md pages use a YAML frontmatter `title:` AND a body `# Heading` by design — the frontmatter title feeds the sidebar nav and SPA page title, the body H1 is the visible page heading. Every page in docs/usermanuals/ follows this pattern; disabling MD025 keeps the established docs convention intact.",
7+
"//5": "MD024 (no-duplicate-heading) is restricted to siblings only: docs/roadmap/releases.md, CHANGELOG.md, and similar release-history files repeat the same H3 names (`Summary`, `Highlights`, `Public surface changes`, `Full changelog`) under each release's H2 by design. Same-parent duplicates remain a hard error.",
78
"default": true,
89
"MD051": false,
910
"MD014": false,
1011
"MD013": false,
11-
"MD025": false
12+
"MD025": false,
13+
"MD024": { "siblings_only": true }
1214
}

AGENTS.md

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
55
## What ForgeLM is (in one line)
66

7-
A **config-driven, enterprise-grade LLM fine-tuning toolkit** — YAML in, fine-tuned model + compliance artifacts out. Built for CI/CD pipelines, not notebooks. Covers SFT → DPO → SimPO → KTO → ORPO → GRPO, with integrated safety evaluation, EU AI Act compliance, and auto-revert on quality regression.
7+
A **config-driven, enterprise-grade LLM fine-tuning toolkit** — YAML in, fine-tuned model + compliance artifacts out. Drives the same workflow from a terminal, a notebook, or a CI/CD pipeline step. Covers SFT → DPO → SimPO → KTO → ORPO → GRPO, with integrated safety evaluation, EU AI Act compliance, and auto-revert on quality regression.
88

99
Not a framework for training from scratch. Not an inference engine. Not a GUI. Read [docs/product_strategy.md](docs/product_strategy.md) for the 5-minute background.
1010

@@ -76,6 +76,7 @@ ForgeLM/
7676
│ # check_bilingual_parity, check_cli_help_consistency,
7777
│ # check_field_descriptions, check_no_analysis_refs,
7878
│ # check_pip_audit, check_bandit, check_site_claims,
79+
│ # check_usermanual_self_contained,
7980
│ # check_wizard_defaults_sync, generate_sbom,
8081
│ # generate_wizard_defaults, build_usermanuals
8182
├── docs/
@@ -156,10 +157,11 @@ Default workflow for a non-trivial change:
156157
python3 tools/check_wizard_defaults_sync.py && \
157158
python3 tools/check_no_analysis_refs.py && \
158159
python3 tools/check_no_unguarded_sys_modules_pop.py && \
160+
python3 tools/check_usermanual_self_contained.py --strict && \
159161
python3 tools/update_site_version.py --check
160162
```
161163

162-
All eleven must pass. The first four are the historical gauntlet;
164+
All twelve must pass. The first four are the historical gauntlet;
163165
the three doc guards (Wave 3 / Wave 4 / Wave 5 additions) catch
164166
bilingual structural drift, broken markdown anchors, and CLI ↔ docs
165167
help-text drift before the PR opens. The wizard-defaults guard
@@ -172,12 +174,18 @@ Default workflow for a non-trivial change:
172174
`sys.modules.pop("torch"|"numpy"|"trl"|…)` without
173175
`monkeypatch.delitem` — the v0.5.7 round-3 review traced 35
174176
spurious full-suite failures to that exact pattern. The
175-
site-version guard (v0.6.0 retag cycle) re-derives the marketing
176-
site's displayed version from CHANGELOG's latest released header
177-
and fails the PR if any of the 15+ literals across `site/*.html`
178-
and `site/js/translations.js` has drifted; the v0.5.5 → v0.6.0
179-
release shipped with the hero badge still reading `v0.5.5`, which
180-
this guard now prevents.
177+
usermanual self-contained guard (post-v0.7.0 cycle) blocks any
178+
link inside `docs/usermanuals/` that would 404 in the static SPA
179+
viewer: every link must be either a `#/<section>/<page>` SPA
180+
route backed by a real manual page or an absolute HTTPS URL.
181+
Repo-relative `../../../guides/...` references fail the gate —
182+
see `docs/standards/documentation.md` "User-manual link
183+
discipline". The site-version guard (v0.6.0 retag cycle)
184+
re-derives the marketing site's displayed version from CHANGELOG's
185+
latest released header and fails the PR if any of the 15+ literals
186+
across `site/*.html` and `site/js/translations.js` has drifted; the
187+
v0.5.5 → v0.6.0 release shipped with the hero badge still reading
188+
`v0.5.5`, which this guard now prevents.
181189

182190
## Etiquette when communicating with the user
183191

CLAUDE.md

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
55
## What ForgeLM is (in one line)
66

7-
A **config-driven, enterprise-grade LLM fine-tuning toolkit** — YAML in, fine-tuned model + compliance artifacts out. Built for CI/CD pipelines, not notebooks. Covers SFT → DPO → SimPO → KTO → ORPO → GRPO, with integrated safety evaluation, EU AI Act compliance, and auto-revert on quality regression.
7+
A **config-driven, enterprise-grade LLM fine-tuning toolkit** — YAML in, fine-tuned model + compliance artifacts out. Drives the same workflow from a terminal, a notebook, or a CI/CD pipeline step. Covers SFT → DPO → SimPO → KTO → ORPO → GRPO, with integrated safety evaluation, EU AI Act compliance, and auto-revert on quality regression.
88

99
Not a framework for training from scratch. Not an inference engine. Not a GUI. Read [docs/product_strategy.md](docs/product_strategy.md) for the 5-minute background.
1010

@@ -76,6 +76,7 @@ ForgeLM/
7676
│ # check_bilingual_parity, check_cli_help_consistency,
7777
│ # check_field_descriptions, check_no_analysis_refs,
7878
│ # check_pip_audit, check_bandit, check_site_claims,
79+
│ # check_usermanual_self_contained,
7980
│ # check_wizard_defaults_sync, generate_sbom,
8081
│ # generate_wizard_defaults, build_usermanuals
8182
├── docs/
@@ -156,10 +157,11 @@ Default workflow for a non-trivial change:
156157
python3 tools/check_wizard_defaults_sync.py && \
157158
python3 tools/check_no_analysis_refs.py && \
158159
python3 tools/check_no_unguarded_sys_modules_pop.py && \
160+
python3 tools/check_usermanual_self_contained.py --strict && \
159161
python3 tools/update_site_version.py --check
160162
```
161163

162-
All eleven must pass. The first four are the historical gauntlet;
164+
All twelve must pass. The first four are the historical gauntlet;
163165
the three doc guards (Wave 3 / Wave 4 / Wave 5 additions) catch
164166
bilingual structural drift, broken markdown anchors, and CLI ↔ docs
165167
help-text drift before the PR opens. The wizard-defaults guard
@@ -172,12 +174,18 @@ Default workflow for a non-trivial change:
172174
`sys.modules.pop("torch"|"numpy"|"trl"|…)` without
173175
`monkeypatch.delitem` — the v0.5.7 round-3 review traced 35
174176
spurious full-suite failures to that exact pattern. The
175-
site-version guard (v0.6.0 retag cycle) re-derives the marketing
176-
site's displayed version from CHANGELOG's latest released header
177-
and fails the PR if any of the 15+ literals across `site/*.html`
178-
and `site/js/translations.js` has drifted; the v0.5.5 → v0.6.0
179-
release shipped with the hero badge still reading `v0.5.5`, which
180-
this guard now prevents.
177+
usermanual self-contained guard (post-v0.7.0 cycle) blocks any
178+
link inside `docs/usermanuals/` that would 404 in the static SPA
179+
viewer: every link must be either a `#/<section>/<page>` SPA
180+
route backed by a real manual page or an absolute HTTPS URL.
181+
Repo-relative `../../../guides/...` references fail the gate —
182+
see `docs/standards/documentation.md` "User-manual link
183+
discipline". The site-version guard (v0.6.0 retag cycle)
184+
re-derives the marketing site's displayed version from CHANGELOG's
185+
latest released header and fails the PR if any of the 15+ literals
186+
across `site/*.html` and `site/js/translations.js` has drifted; the
187+
v0.5.5 → v0.6.0 release shipped with the hero badge still reading
188+
`v0.5.5`, which this guard now prevents.
181189

182190
## Etiquette when communicating with the user
183191

0 commit comments

Comments
 (0)