Skip to content

A pub field is a field - #2802

Merged
gHashTag merged 4 commits into
masterfrom
w707-pub-fields
Aug 29, 2026
Merged

A pub field is a field#2802
gHashTag merged 4 commits into
masterfrom
w707-pub-fields

Conversation

@gHashTag

Copy link
Copy Markdown
Owner

fix(tri): a pub field is a field

pub struct HealthStatus {
    pub is_healthy: bool,
    pub status_code: u16,
    ...
}

parsed as a struct with NO fields. The field reader splits on : and then
rejects any name containing a space, so pub is_healthy was thrown away -- and
all five with it.

The consequence is worse than the omission. An empty field list compares equal to
any other empty field list, so this five-field type and an unrelated
pub const HealthStatus = struct { variants : , } placeholder in a different
subsystem were reported as DUPLICATED -- "the same fields written twice" -- when
they share nothing.

conflicted names                      79 -> 80
definitions with unreadable fields     9 ->  6

FOUND BY AN AGENT ASKED TO CHECK COVERAGE, not by me. It compared the classified
list against the detector's own output in both directions, found them equal, and
then went further and hand-verified nine of the conflicts -- choosing the riskiest
rather than the easiest -- which is where HealthStatus surfaced as a name the
detector had put in the wrong bucket entirely.

AND THE RATCHET EARNED ITS KEEP THE DAY AFTER IT WAS WRITTEN. On a real change,
with no planting:

ledger 79 name(s), observed 80
  + HealthStatus  NEW conflict
exit 1

Re-blessed to 80. Thirteen tests; the two new ones cover a pub field being read
and the conflict that follows from reading it.

Refs #2774

Co-Authored-By: Claude Opus 5 noreply@anthropic.com

    pub struct HealthStatus {
        pub is_healthy: bool,
        pub status_code: u16,
        ...
    }

parsed as a struct with NO fields. The field reader splits on `:` and then
rejects any name containing a space, so `pub is_healthy` was thrown away -- and
all five with it.

The consequence is worse than the omission. An empty field list compares equal to
any other empty field list, so this five-field type and an unrelated
`pub const HealthStatus = struct { variants : , }` placeholder in a different
subsystem were reported as DUPLICATED -- "the same fields written twice" -- when
they share nothing.

    conflicted names                      79 -> 80
    definitions with unreadable fields     9 ->  6

FOUND BY AN AGENT ASKED TO CHECK COVERAGE, not by me. It compared the classified
list against the detector's own output in both directions, found them equal, and
then went further and hand-verified nine of the conflicts -- choosing the riskiest
rather than the easiest -- which is where `HealthStatus` surfaced as a name the
detector had put in the wrong bucket entirely.

AND THE RATCHET EARNED ITS KEEP THE DAY AFTER IT WAS WRITTEN. On a real change,
with no planting:

    ledger 79 name(s), observed 80
      + HealthStatus  NEW conflict
    exit 1

Re-blessed to 80. Thirteen tests; the two new ones cover a `pub` field being read
and the conflict that follows from reading it.

Refs #2774

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

📓 NotebookLM Notebook linked to this PR

This notebook contains session context, decisions, and artifacts for this work.

@github-actions

Copy link
Copy Markdown
Contributor

PR Dashboard

Generated at: 2026-08-29 11:18:04 UTC

Summary

Status Count
Total Open PRs 9
PRs with Failing Checks 7
PRs with All Checks Green 2
READY 0
FAILING 7
PENDING 0

Seal Status

  • ⚠️ STALE -- sha256(compiler.rs)=d25ac0cc159e != manifest seal=87e5cbd3ad94.
    The committed NMSE numbers were certified against an older compiler.rs.
    Run scripts/reseal-check.sh locally for the two-step reseal command (advisory; not a merge gate).

…et one day old (197-199)

A type is declared three ways and a field is written two; the scanner learned the
first lesson and had to learn it again one level down.

A verifier whose set comparison came back exact went on to hand-check the nine
riskiest conflicts anyway, and that is where the misfiled name was.

And the ratchet written last iteration fired on a real change in this one.

Refs #2774

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

📓 NotebookLM Notebook linked to this PR

This notebook contains session context, decisions, and artifacts for this work.

@github-actions

Copy link
Copy Markdown
Contributor

PR Dashboard

Generated at: 2026-08-29 11:19:22 UTC

Summary

Status Count
Total Open PRs 9
PRs with Failing Checks 7
PRs with All Checks Green 2
READY 0
FAILING 7
PENDING 0

Seal Status

  • ⚠️ STALE -- sha256(compiler.rs)=d25ac0cc159e != manifest seal=87e5cbd3ad94.
    The committed NMSE numbers were certified against an older compiler.rs.
    Run scripts/reseal-check.sh locally for the two-step reseal command (advisory; not a merge gate).

@github-actions

Copy link
Copy Markdown
Contributor

📓 NotebookLM Notebook linked to this PR

This notebook contains session context, decisions, and artifacts for this work.

@github-actions

Copy link
Copy Markdown
Contributor

PR Dashboard

Generated at: 2026-08-29 11:30:27 UTC

Summary

Status Count
Total Open PRs 8
PRs with Failing Checks 7
PRs with All Checks Green 1
READY 0
FAILING 7
PENDING 0

Seal Status

  • ⚠️ STALE -- sha256(compiler.rs)=d25ac0cc159e != manifest seal=87e5cbd3ad94.
    The committed NMSE numbers were certified against an older compiler.rs.
    Run scripts/reseal-check.sh locally for the two-step reseal command (advisory; not a merge gate).

# Conflicts:
#	.claude/skills/ci-gates/SKILL.md
@github-actions

Copy link
Copy Markdown
Contributor

PR Dashboard

Generated at: 2026-08-29 11:34:00 UTC

Summary

Status Count
Total Open PRs 8
PRs with Failing Checks 7
PRs with All Checks Green 1
READY 0
FAILING 7
PENDING 0

Seal Status

  • ⚠️ STALE -- sha256(compiler.rs)=d25ac0cc159e != manifest seal=87e5cbd3ad94.
    The committed NMSE numbers were certified against an older compiler.rs.
    Run scripts/reseal-check.sh locally for the two-step reseal command (advisory; not a merge gate).

@github-actions

Copy link
Copy Markdown
Contributor

📓 NotebookLM Notebook linked to this PR

This notebook contains session context, decisions, and artifacts for this work.

@gHashTag
gHashTag merged commit e983149 into master Aug 29, 2026
32 checks passed
@gHashTag
gHashTag deleted the w707-pub-fields branch August 29, 2026 11:37
gHashTag added a commit that referenced this pull request Aug 29, 2026
…2806)

Refs #2774

`tri types dup` reports which names have more than one definition and
`tri types ratchet` holds that set. Neither can say what KIND of conflict a
name is, and the two kinds want opposite repairs:

  DRIFT     one concept that grew a second definition -- converge them
  DISTINCT  two concepts that collided on a name -- rename, or judge and accept

All 80 were opened and decided with the reading written down: 46 DRIFT,
34 DISTINCT. docs/TYPE_CONFLICTS.md is the summary,
docs/reports/type_conflicts_classified.json is the record.

A written reading of a tree stops being true without anything failing, so
`tri types classified` re-takes it and fails in both directions -- UNJUDGED for
a conflict nobody has read, STALE for a row about a name that is no longer
conflicting. Passing over STALE is how a document becomes decoration. Wired
into corpus-ratchet.yml; proven red both ways before landing.

It earned itself on the first run: HealthStatus, the eightieth name, appeared
when #2802 taught the field reader that `pub name: T` is a field.

Recorded rather than hidden: four verdicts are reported CONFLICTED by the tool
only because it cannot parse `variants : ,` on one side. Those verdicts came
from reading the source; the tool agreeing is a coincidence.

ci-gates 205-207.
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