myfeeds.sgit.ai v0.1.8

myfeeds.sgit.ai / The argument

ai-generated, unreviewed what this means

The grammar

Two ontologies and the join between them

One ontology says what a piece of news contains. Another says what a role watches for. Neither is interesting on its own — the whole value is in the third thing, the join, which is where an article meets an audience and a sentence comes out saying why. The grammar is adapted from the one pt.newsroom.sgit.ai uses for the Portuguese graph, and keeps its hardest rule.

The rules

The ontology does not have to be right. It has to be wrong in ways a human reader can see and correct.

Correctness is not available: nobody can write a complete taxonomy of what six roles care about, and waiting until it is right means never publishing. Legibility IS available — every classification shown with its working out, every concern that fires on everything or fires on nothing surfaced as a question rather than buried in a score. This rule outranks the others: where a modelling choice is more correct but less checkable, take the checkable one, and where the corpus contradicts the ontology, the corpus is right.

Every edge is a verb with a distinct named inverse, and both directions read as sentences.

An edge you cannot read aloud in both directions is usually two different claims wearing one label.

No symmetric verb. Where a relation genuinely is symmetric, reify it as a node.

A symmetric verb is its own inverse, which means it carries no direction and therefore no information. `contradicts` is the case that matters here: two sources disagreeing is a Discrepancy node, which can then be dated, sourced and pointed at.

Classification is a published formula or it does not happen.

The entire argument of this site is that a recommendation must be checkable. A selection rule nobody can read is the black box in a different coat.

An article NOT reaching an audience is recorded with the same structure as one that does.

Any system can explain what it chose. Explaining what it rejected, and why, is the harder half and the one a reader actually doubts.

The article ontology

What a piece of news contains. Deliberately small: a type earns its place by being something at least one audience watches for, and every type here is named in at least one concern.

TypeIs
ArticleOne published piece, in its original language.
ClaimA single assertion the article makes, which walks back to a frozen source.
SourceA frozen, hashed copy of the page a claim rests on. Evidence, not a page of this site.
OrganisationA named company, institution or body.
PersonA named individual, in a professional capacity only.
EventA dated, located happening: a conference, a deadline, an incident.
ProgrammeA funding call, accelerator or scheme somebody can apply to.
InstrumentA law, regulation, designation or formal decision.
ObligationA duty an instrument creates, and who it binds.
TechnologyA named product, protocol, model or version.
WeaknessA way something fails or can be made to fail.
ControlA change to a system that reduces a weakness.
SectorA population of organisations treated as one.
MeasureA count or rate, with the thing it counts and the date it was true.
MoneyAn amount, with what it was for.
DiscrepancyTwo sources answering the same question differently. A node, not an edge, so it can be dated and pointed at.

Its verbs

VerbInverseReadsAnd back
statesis_stated_byArticle states ClaimClaim is stated by Article
rests_onsupportsClaim rests on SourceSource supports Claim
namesis_named_inClaim names OrganisationOrganisation is named in Claim
organisesis_organised_byOrganisation organises EventEvent is organised by Organisation
runsis_run_byOrganisation runs ProgrammeProgramme is run by Organisation
imposesis_imposed_byInstrument imposes ObligationObligation is imposed by Instrument
bindsis_bound_byObligation binds OrganisationOrganisation is bound by Obligation
affectsis_affected_byWeakness affects TechnologyTechnology is affected by Weakness
reducesis_reduced_byControl reduces WeaknessWeakness is reduced by Control
belongs_tocontainsOrganisation belongs to SectorSector contains Organisation
countsis_counted_byMeasure counts SectorSector is counted by Measure
revealsis_revealed_byArticle reveals DiscrepancyDiscrepancy is revealed by Article
involvesis_involved_inDiscrepancy involves SourceSource is involved in Discrepancy

Verbs that are not allowed

Naming what is banned, and why, is more useful than naming what is permitted: every one of these is a shortcut somebody will reach for.

VerbWhy not
contradictsSymmetric: A contradicts B is B contradicts A, so it is its own inverse and carries no direction. Use a Discrepancy node, which can also be dated and sourced.
related_toSays nothing a reader could check, and absorbs every edge that was too much trouble to name properly.
mentionsTrue of almost every pair and therefore useless for selection. If it matters, the specific verb exists.
is_relevant_toThis is the conclusion, not an edge. Writing it as an edge hides the reasoning the join exists to expose.

The audience ontology

What a role watches for. Small on purpose: the audience side is the half a human maintains by hand, and a taxonomy nobody can hold in their head stops being maintained and starts being wrong.

TypeIs
AudienceOne of the six roles this site publishes for.
ConcernA thing an audience watches for, declared as the article types that satisfy it.
CurrencyWhat this audience converts a piece of news into. The reason two audiences given the same article produce different pieces rather than different lengths.
AxisA named spectrum audiences sit on: mechanism wanted, scope, horizon.
QualifierA type that must ALSO be present in the article for a concern to fire. The difference between 'this audience cares about source integrity' and 'this audience cares about source integrity in technical material'.
VerbInverseReadsAnd back
watchesis_watched_byAudience watches ConcernConcern is watched by Audience
pays_inis_currency_ofAudience pays in CurrencyCurrency is the currency of Audience
satisfied_bysatisfiesConcern is satisfied by Article typeArticle type satisfies Concern
sits_onpositionsAudience sits on AxisAxis positions Audience

The join

The two worlds meet here, and this is the only part of the system a reader needs to trust. A Connection is a node rather than an edge so that it can be pointed at, dated, disagreed with and — the case that matters — counted when there are none.

join/v1

For every article A and every audience U, a Delivery exists. A concern declaring `requires` is skipped unless A also contains a qualifying type. For each remaining concern C and each entity E in A's graph, a match is attempted; every match found becomes a Connection. The Delivery is `reached` if it holds at least one Connection and `withheld` otherwise. Rank counts each ENTITY once, at its strongest match — summing every connection lets one entity score repeatedly through overlapping concerns, which it did the first time this formula ran.

MatchWeightWhen
qualified0A concern declaring `requires` does not fire at all unless the article also contains one of the qualifying types. Applied before any other match.
exact3E's type is named directly in C's satisfied-by list.
narrower2E's type is one hop below a type named in C, in the published taxonomy.
broader1E's type is one hop above a type named in C. Weakest match, because a broader thing may not carry the specific consequence the audience is watching for.
consequence2A path of at most two article edges runs from E to something C names — and the path reads as a sentence.

Reached at: 1 connection. One connection is enough to reach, deliberately. Ranking, not filtering, is what handles a weak connection — a feed that silently drops items cannot be audited, and an item at the bottom of a ranked list can be.

Withheld: A withheld Delivery records which concerns were tried and why each failed: either the audience watches for types this article has none of, or the only matches available were below threshold. 'Nothing matched' is not an acceptable reason on its own.

Where the model fits, stated plainly. In the running pipeline the matches are PROPOSED by a language model comparing two graphs — that is stage 3 of the MyFeeds architecture. This formula does not replace that; it constrains the shape of what comes back so that every proposed match is recorded with its type, its weight, its two endpoints and a sentence, and can therefore be disagreed with by a human reading the delivery. The model proposes; the formula records and scores; the reader checks. Where the two sides of a match are identical concept ids, no model is needed at all and the match is computed.

The formula is not only described here — it is admin/tools/join.py, and the worked example is its output rather than a drawing of what its output would look like.