Skip to content

Trend-tracking jq recipe prints evaluation_completed=false as 'n/a', because jq's // operator treats false like null (F-W1-DOCS-TRAIN-16) #884

Open

Description

@cemililik

Wave 4 · group W4 Docs · highest severity Low · 1 finding(s) · effort docs fix

Summary

The page explains that evaluation_completed: false marks a safety run that produced no usable evidence, then gives a jq view that renders the field with .evaluation_completed // "n/a". jq's alternative operator falls back on false as well as null, so exactly the rows the view is meant to expose print as completed=n/a, indistinguishable from older rows that lack the field.

Primary finding

F-W1-DOCS-TRAIN-16 — The trend query hides an explicit evaluation failure as missing telemetry

severity Low · confidence high · reproduced with jq 1.7.1

What happens. docs/usermanuals/en/evaluation/trend-tracking.md:47 and the Turkish mirror at the same line. Rows with evaluation_completed: false do occur: the safety orchestrator sets it when the classifier abstains (forgelm/safety/_orchestrator.py:359-361) and _append_trend_entry writes it to safety_trend.jsonl (forgelm/safety/_results.py:168).

Where.

Evidence (re-verified on 2026-10-09).

  • With jq 1.7.1 the documented expression prints completed=n/a for {"evaluation_completed": false}, completed=true for true, and completed=n/a when the field is absent.

Recommended fix. Render the field without the alternative operator, for example completed=\(if .evaluation_completed == null then "n/a" else .evaluation_completed end), which prints true, false and n/a for the three cases.

Acceptance criteria

  • The jq view prints true, false and n/a for true, false and missing values.
  • Documentation listed above is corrected in English and in its Turkish mirror in the same PR.
  • The finding is resolved or explicitly closed with a reason.

Found by the September 2026 independent review of ForgeLM against commit cab2947 and re-verified against development at f94595f on 2026-10-09. Code links point at cab2947; line numbers may have moved since. Finding IDs (F-W1-…) are stable references for this backlog.

Activity

  1. added
    documentationImprovements or additions to documentation
    severity: lowMinor defect, inaccuracy or rough edge
    wave: 4Roadmap wave 4: low / info / watch, when touching the module
    source: review-2026-09Found by the September 2026 independent review
    on Oct 9, 2026
  2. cemililik commented on Oct 11, 2026

    @cemililik
    CollaboratorAuthor

    Where to start

    Thanks for taking a look. Please confirm the issue is unassigned and comment before starting so work does not overlap.

    Start with these files on development:

    Use an explicit null/missing check so evaluation_completed=false prints false. Exercise the recipe with true, false, null and a missing key, and keep EN/TR shell blocks identical.

    Run the focused tests:

    pytest tests/test_safety_advanced.py --no-cov

    Run these guards/checks as applicable to the changed files:

    ruff format --check tests/test_safety_advanced.py
    ruff check tests/test_safety_advanced.py
    python3 tools/check_bilingual_parity.py --strict
    python3 tools/check_bilingual_code_blocks.py --strict
    python3 tools/check_anchor_resolution.py --strict
    python3 tools/check_tr_links_prefer_mirror.py --strict
    python3 tools/check_usermanual_self_contained.py --strict
    python3 tools/check_usermanual_schema_drift.py --strict

    If user-facing documentation changes, update the existing Turkish mirror in the same PR; keep commands, code and terminal output in English and structurally aligned. English-only contributor standards need no new mirror.

    Open the PR against development with Fixes #884 once every finding is resolved or explicitly closed with a reason; use Refs #884 for partial work and list the resolved finding IDs.

  3. cemililik commented on Oct 17, 2026

    @cemililik
    CollaboratorAuthor

    Update — re-verified on development (0766e94). The expression is unchanged in both
    pages (line 47).

    No Python test is needed; the pytest/ruff lines above are only a sanity run. Check the
    replacement against three rows — true, false and a missing field: the documented
    expression prints n/a for false, the corrected one prints false. Put the identical
    line in the English and the Turkish page.

  4. pinned this issue on Oct 17, 2026
  5. yuefdev commented on Oct 17, 2026

    @yuefdev

    I'll take this one. I'll keep the English and Turkish jq recipes identical and check true, false, null and missing values.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

documentationImprovements or additions to documentationfirst-timers-onlyReserved for a contributor's very first pull requestgood first issueGood for newcomersseverity: lowMinor defect, inaccuracy or rough edgesource: review-2026-09Found by the September 2026 independent reviewwave: 4Roadmap wave 4: low / info / watch, when touching the module

Type

No type

Projects

Relationships

None yet

Development

No branches or pull requests

Issue actions