feat: an entity names the property that identifies it - #118
Merged
ShocOne merged 1 commit intoAug 25, 2026
Conversation
An API whose item path says {id} while its response spells the same
identifier "aid" left the id attribute bound to an accessor no model has.
The binding was pruned as addressing — correctly, by a premise that is false
here: the model does carry it, under another name — and nothing populated
data.ID, so the settling read addressed the object by an empty string.
The correspondence is stated nowhere in the document, and no naming rule
finds it: the audit's own identifier rule does not match "aid" either, and
among the model's accessors both GetAid and GetOrgId end in "id". It is
learned instead by matching the id the run already extracted against the
response body's own properties, which is evidence rather than spelling. The
run learns an id from a Location header or a self link as readily as from a
body key, so neither name has to match the other.
The observation kind is identifierProperty, the extension key
x-tfpfgen-identifier-property on the read operation, both approved by the
repository owner and recorded in the glossary. It is asserted only where the
two disagree: an entity whose response spells it "id" needs no correction.
The same match generalises idField, which previously recognised only the
literal "id" key and is what excludes an identifier from the per-field
observations.
Proven against the live ThousandEyes document: with the correction in place
account_group derives its id as "aid", populates it from both the create
response and the read, and the entity that emitted no assignment at all now
closes the create-read-state loop.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
ShocOne
deleted the
feat/an-entity-names-the-property-that-identifies-it
branch
August 25, 2026 16:43
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
An API whose item path says
{id}while its response spells the same identifieraidleft the id attribute bound to an accessor no model has. The binding was pruned as addressing — correctly, by a premise that is false here:The model does carry it, under another name. Nothing populated
data.ID, soReadcalledById("")and the settling read could never find the object.Affected
account_group,user,role,alert_suppression_windowandtemplates_sharing_setting.Why this needs an observation rather than a rule
The correspondence is stated nowhere in the document, and no naming rule finds it:
identifierOfdoes not matchaid— it isn'tid, doesn't end_id, doesn't endIdGetAidandGetOrgIdend in "id", so "the one ending in id" is ambiguousIt is learned instead by matching the id the run already extracted against the response body's own properties — evidence, not spelling. The run learns an id from a
Locationheader or a self link as readily as from a body key, so neither name has to match the other.The term
identifierProperty/x-tfpfgen-identifier-property, on the read operation. Both approved by the repository owner and recorded indocs/glossary.md.Asserted only where the two disagree — an entity whose response spells it
idneeds no correction, and emitting one would state what the document already says.Chain
observerun/evidenceidentifyingPropertymatches the learned id against the body; generalisesidField, which previously recognised only the literalidkeyinferidrevise/compilespecmodelderiveensureIDtakes that name over the path parameter'sProven on the live document
With the correction in place,
account_group— which previously emitted nodata.IDassignment at all — now closes the loop:make checkgreen at 90.9%; the tree regenerates and passes postcheck.🤖 Generated with Claude Code