okf: propose typed relationship edges (supersedes, contested_by) (#148)#195
okf: propose typed relationship edges (supersedes, contested_by) (#148)#195andrewcrenshaw wants to merge 2 commits into
Conversation
|
The write-up reads faithful to where #148 landed, and pinning the resolution event to
So the question is whether the winner should also retain |
|
Good catch, and it's a real inconsistency in the sample rather than the definition. Going with keeping the symmetric definition intact: the winner should retain The reasoning that makes it Option A cleanly: Fixing the State 3 sample so the winner carries both |
|
Small process ask, unrelated to the substance — happy for it to be a no. The write-up describes this as a convergence across three production implementations, and the design notes credit it that way throughout. Would you consider One practical snag before you touch anything: |
|
Absolutely, and thank you for raising it aimed at @ajdelaguila. The doc says three producers converged; the history should say the same, and exclusion-follows-affirmation being his is exactly the kind of thing that should be legible in git, not only in prose. The CLA check is the one real gate, so let me handle it transparently instead of guessing and flipping it red. I'll add Once I have the confirmed line-up I'll amend the commits and re-push, then watch |
|
Cheers, appreciate it — |
|
Thank you both, this is really kind. I appreciate the thought and the care you have taken to recognize everyone’s contribution. It has been a pleasure being part of the discussion. |
…gleCloudPlatform#148) Co-authored-by: David Tucker <david@tucker.fm> Co-authored-by: Antonio J. del Águila <ajdelaguila@knaisoma.com>
…(symmetric edge, per review) Co-authored-by: David Tucker <david@tucker.fm> Co-authored-by: Antonio J. del Águila <ajdelaguila@knaisoma.com>
51256cf to
a3dcb73
Compare
|
Antonio — thank you again, and one small snag to sort. The Google CLA bot If you confirm that email is on your GitHub account and matches your CLA |
|
That's interesting @andrewcrenshaw, I actually have it verified and set as my primary email address: Any ideas what to look for? |
|
Thanks Antonio — the GitHub verification is one half; the CLA record itself Could you open https://cla.developers.google.com/clas and tell me the exact
Whichever's easier — I just need the exact email your CLA shows. |
|
My bad @andrewcrenshaw, I didn't have a CLA record created. Now it's created, matching the email and username in my GitHub account. |
|
All green now @ajdelaguila. Thanks! |

Adds
okf/proposals/typed-relationship-edges.md: a self-contained proposal for two optional cross-concept lifecycle edges, in the same proposal-doc form as #159'sreliability.md. Core spec untouched.What this adds
Two optional frontmatter keys for typed relationships between whole concepts, each carrying its query-time semantics so a consumer knows not just that a relationship exists but what to do with it:
supersedes- asymmetric. Once affirmed, exclude the superseded concept from in-force retrieval; retain it in the bundle for lineage.contested_by- symmetric. Surface both disputing concepts and defer adjudication; never resolve the edge as a verdict. (contradictsis a back-compat alias.)Both are additive under section 4.1 and keep a bundle valid under section 9. Untyped consumers preserve the keys on round-trip and see ordinary linked concepts; typed-aware consumers apply the semantics.
Why it's shaped this way
This is the consolidation of a multi-producer convergence on #148 and #158. Three independent production implementations - Lexenne remember, @inkxel's Throughline, and @ajdelaguila's Data Olympus - landed on close-but-not-identical shapes for the same two edges. Rather than bless a spelling, the proposal registers the two edges with their query-time semantics attached, which is the part a consumer cannot reconstruct from a field name.
Key design points carried from that discussion:
supersedesedge an automated writer proposed does not remove the incumbent; the incumbent keeps governing until an appended, attributed resolution event puts it in force. This is what lets an automated writer propose supersessions without silently displacing live guidance.proposed | accepted | superseded | deprecated) without either side bending.Scope
Deliberately limited to the two lifecycle edges. Arbitrary producer-defined relationship typing (
writes_to,imports_from, per #183) is a broader problem and is out of scope; the note in the proposal explains how a broaderlinks:carrier could host these two edges without redefining them.Reference implementation
The Lexenne remember exporter ships both keys in production. The proposal includes a sample bundle exercising all three resolution states, built from public docs.
For maintainers
The design converged across the three producers on #148 before this PR:
contested_byis canonical (the more-adopted production term),contradictsis retained as a back-compat alias with Throughline migrating to match, the closing bound folds into #159'svalidity.valid_until, and the affirmation event's home is the bundle'slog.md(section 7). The open question is now yours: whether this lands as anEXTENSIONS.md-style registry entry or a standalone proposal doc (this PR follows #159's proposal-doc pattern), and whether OKF wants to adopt the two edges as a documented convention. Happy to reshape to whichever container you prefer.Related
#148 (home thread), #158 (maintenance-signals integration view), #159 (reliability object - the intra-concept axis these edges compose with), #120 (stable ids), #183 (arbitrary typed links - the broader out-of-scope case).