tech.transparencia.news.article
Schema Diff
+47 -5
Compatibility Analysis
Breaking Changes Detected
10 breaking changes, 16 non-breaking changes.
Breaking Changes (10)
- ConstraintAdded ConstraintAdded { vertex_id: "tech.transparencia.news.article:body.originalSource.name", sort: "maxLength", value: "256" }
- ConstraintAdded ConstraintAdded { vertex_id: "tech.transparencia.news.article:body.originalSource.name", sort: "maxGraphemes", value: "100" }
- ConstraintTightened ConstraintTightened { vertex_id: "tech.transparencia.news.article:body.description", sort: "maxGraphemes", old_value: "2000", new_value: "1500" }
- ConstraintTightened ConstraintTightened { vertex_id: "tech.transparencia.news.article:body.description", sort: "maxLength", old_value: "10000", new_value: "5000" }
- ConstraintAdded ConstraintAdded { vertex_id: "tech.transparencia.news.article:body.tags:items", sort: "maxGraphemes", value: "64" }
- ConstraintAdded ConstraintAdded { vertex_id: "tech.transparencia.news.article:body.tags:items", sort: "maxLength", value: "200" }
- ConstraintAdded ConstraintAdded { vertex_id: "tech.transparencia.news.article:body.content", sort: "maxGraphemes", value: "15000" }
- ConstraintAdded ConstraintAdded { vertex_id: "tech.transparencia.news.article:body.content", sort: "maxLength", value: "50000" }
- ConstraintAdded ConstraintAdded { vertex_id: "tech.transparencia.news.article:body.mediaCaption", sort: "maxLength", value: "500" }
- ConstraintAdded ConstraintAdded { vertex_id: "tech.transparencia.news.article:body.mediaCaption", sort: "maxGraphemes", value: "200" }
Non-Breaking Changes (16)
- AddedVertex AddedVertex { vertex_id: "tech.transparencia.news.article:body.content" }
- AddedVertex AddedVertex { vertex_id: "tech.transparencia.news.article:body.mediaCaption" }
- AddedVertex AddedVertex { vertex_id: "tech.transparencia.news.article:body.originalSource" }
- AddedVertex AddedVertex { vertex_id: "tech.transparencia.news.article:body.originalSource.name" }
- AddedVertex AddedVertex { vertex_id: "tech.transparencia.news.article:body.originalSource.url" }
- AddedVertex AddedVertex { vertex_id: "tech.transparencia.news.article:body.tags" }
- AddedVertex AddedVertex { vertex_id: "tech.transparencia.news.article:body.tags:items" }
- AddedVertex AddedVertex { vertex_id: "tech.transparencia.news.article:body.updatedAt" }
- AddedEdge AddedEdge { src: "tech.transparencia.news.article:body", tgt: "tech.transparencia.news.article:body.content", kind: "prop", name: Some("content") }
- AddedEdge AddedEdge { src: "tech.transparencia.news.article:body", tgt: "tech.transparencia.news.article:body.mediaCaption", kind: "prop", name: Some("mediaCaption") }
- AddedEdge AddedEdge { src: "tech.transparencia.news.article:body", tgt: "tech.transparencia.news.article:body.originalSource", kind: "prop", name: Some("originalSource") }
- AddedEdge AddedEdge { src: "tech.transparencia.news.article:body", tgt: "tech.transparencia.news.article:body.tags", kind: "prop", name: Some("tags") }
- AddedEdge AddedEdge { src: "tech.transparencia.news.article:body", tgt: "tech.transparencia.news.article:body.updatedAt", kind: "prop", name: Some("updatedAt") }
- AddedEdge AddedEdge { src: "tech.transparencia.news.article:body.originalSource", tgt: "tech.transparencia.news.article:body.originalSource.name", kind: "prop", name: Some("name") }
- AddedEdge AddedEdge { src: "tech.transparencia.news.article:body.originalSource", tgt: "tech.transparencia.news.article:body.originalSource.url", kind: "prop", name: Some("url") }
- AddedEdge AddedEdge { src: "tech.transparencia.news.article:body.tags", tgt: "tech.transparencia.news.article:body.tags:items", kind: "items", name: None }
Migration Guidance
Added Elements
AddedVertex { vertex_id: "tech.transparencia.news.article:body.content" }AddedVertex { vertex_id: "tech.transparencia.news.article:body.mediaCaption" }AddedVertex { vertex_id: "tech.transparencia.news.article:body.originalSource" }AddedVertex { vertex_id: "tech.transparencia.news.article:body.originalSource.name" }AddedVertex { vertex_id: "tech.transparencia.news.article:body.originalSource.url" }AddedVertex { vertex_id: "tech.transparencia.news.article:body.tags" }AddedVertex { vertex_id: "tech.transparencia.news.article:body.tags:items" }AddedVertex { vertex_id: "tech.transparencia.news.article:body.updatedAt" }
Constraint Changes
- ConstraintAdded ConstraintAdded { vertex_id: "tech.transparencia.news.article:body.originalSource.name", sort: "maxLength", value: "256" }
- ConstraintAdded ConstraintAdded { vertex_id: "tech.transparencia.news.article:body.originalSource.name", sort: "maxGraphemes", value: "100" }
- ConstraintTightened ConstraintTightened { vertex_id: "tech.transparencia.news.article:body.description", sort: "maxGraphemes", old_value: "2000", new_value: "1500" }
- ConstraintTightened ConstraintTightened { vertex_id: "tech.transparencia.news.article:body.description", sort: "maxLength", old_value: "10000", new_value: "5000" }
- ConstraintAdded ConstraintAdded { vertex_id: "tech.transparencia.news.article:body.mediaCaption", sort: "maxGraphemes", value: "200" }
- ConstraintAdded ConstraintAdded { vertex_id: "tech.transparencia.news.article:body.mediaCaption", sort: "maxLength", value: "500" }
- ConstraintAdded ConstraintAdded { vertex_id: "tech.transparencia.news.article:body.content", sort: "maxLength", value: "50000" }
- ConstraintAdded ConstraintAdded { vertex_id: "tech.transparencia.news.article:body.content", sort: "maxGraphemes", value: "15000" }
- ConstraintAdded ConstraintAdded { vertex_id: "tech.transparencia.news.article:body.tags:items", sort: "maxLength", value: "200" }
- ConstraintAdded ConstraintAdded { vertex_id: "tech.transparencia.news.article:body.tags:items", sort: "maxGraphemes", value: "64" }
Additional Notes
- Non-breaking: AddedEdge { src: "tech.transparencia.news.article:body", tgt: "tech.transparencia.news.article:body.content", kind: "prop", name: Some("content") }
- Non-breaking: AddedEdge { src: "tech.transparencia.news.article:body", tgt: "tech.transparencia.news.article:body.mediaCaption", kind: "prop", name: Some("mediaCaption") }
- Non-breaking: AddedEdge { src: "tech.transparencia.news.article:body", tgt: "tech.transparencia.news.article:body.originalSource", kind: "prop", name: Some("originalSource") }
- Non-breaking: AddedEdge { src: "tech.transparencia.news.article:body", tgt: "tech.transparencia.news.article:body.tags", kind: "prop", name: Some("tags") }
- Non-breaking: AddedEdge { src: "tech.transparencia.news.article:body", tgt: "tech.transparencia.news.article:body.updatedAt", kind: "prop", name: Some("updatedAt") }
- Non-breaking: AddedEdge { src: "tech.transparencia.news.article:body.originalSource", tgt: "tech.transparencia.news.article:body.originalSource.name", kind: "prop", name: Some("name") }
- Non-breaking: AddedEdge { src: "tech.transparencia.news.article:body.originalSource", tgt: "tech.transparencia.news.article:body.originalSource.url", kind: "prop", name: Some("url") }
- Non-breaking: AddedEdge { src: "tech.transparencia.news.article:body.tags", tgt: "tech.transparencia.news.article:body.tags:items", kind: "items", name: None }
1
1
{
2
2
"id": "tech.transparencia.news.article",
3
3
"defs": {
4
4
"main": {
5
5
"key": "tid",
6
6
"type": "record",
7
7
"record": {
8
8
"type": "object",
9
9
"required": [
10
10
"title",
11
11
"url",
12
12
"source",
13
13
"publishedAt",
14
14
"createdAt"
15
15
],
16
16
"properties": {
17
17
"url": {
18
18
"type": "string",
19
19
"format": "uri",
20
20
"description": "Canonical URL of the article on the source website."
21
21
},
22
22
"guid": {
23
23
"type": "string",
24
24
"maxLength": 1024,
25
25
"description": "Original GUID from the RSS feed, used for deduplication."
26
26
},
27
+
"tags": {
28
+
"type": "array",
29
+
"items": {
30
+
"type": "string",
31
+
"maxLength": 200,
32
+
"maxGraphemes": 64
33
+
},
34
+
"maxLength": 50,
35
+
"description": "All categories the source attached to the article (RSS <category>, <dc:subject>, Atom <category term>, Google News <news:keywords>, JSON Feed `tags`)."
36
+
},
27
37
"title": {
28
38
"type": "string",
29
39
"maxLength": 2048,
30
40
"description": "Original headline of the article as published by the source.",
31
41
"maxGraphemes": 512
32
42
},
33
43
"author": {
34
44
"type": "string",
35
45
"maxLength": 512,
36
46
"description": "Author byline as published.",
37
47
"maxGraphemes": 128
38
48
},
39
49
"source": {
40
50
"ref": "com.atproto.repo.strongRef",
41
51
"type": "ref",
42
52
"description": "Strong reference to the tech.transparencia.news.source record for this outlet."
43
53
},
54
+
"content": {
55
+
"type": "string",
56
+
"maxLength": 50000,
57
+
"description": "Full article body when the feed provides it (RSS <content:encoded>, Atom <content>, JSON Feed `content_html` / `content_text`). Powers Postgres FTS.",
58
+
"maxGraphemes": 15000
59
+
},
44
60
"imageUrl": {
45
61
"type": "string",
46
62
"format": "uri",
47
63
"description": "URL of the article's featured image."
48
64
},
49
65
"language": {
50
66
"type": "string",
51
67
"format": "language",
52
68
"description": "Language of the article content (BCP-47, e.g., 'es', 'en', 'pt-BR')."
53
69
},
54
70
"createdAt": {
55
71
"type": "string",
56
72
"format": "datetime",
57
73
"description": "When this record was created in the AT Protocol network."
58
74
},
75
+
"updatedAt": {
76
+
"type": "string",
77
+
"format": "datetime",
78
+
"description": "When the source last edited the article (RSS <dcterms:modified>, Atom <updated> when distinct from publish time, JSON Feed `date_modified`)."
79
+
},
59
80
"description": {
60
81
"type": "string",
61
-
"maxLength": 10000,
62
-
"description": "Article summary or lead paragraph, typically from the RSS feed description field.",
63
-
"maxGraphemes": 2000
82
+
"maxLength": 5000,
83
+
"description": "Short lead / summary only. Maps to RSS <description>, Atom <summary>, JSON Feed `summary`. No fallback to the full body — that lives in `content`.",
84
+
"maxGraphemes": 1500
64
85
},
65
86
"publishedAt": {
66
87
"type": "string",
67
88
"format": "datetime",
68
-
"description": "When the article was published by the source."
89
+
"description": "When the article was first published by the source."
69
90
},
70
91
"feedCategory": {
71
92
"type": "string",
72
93
"maxLength": 256,
73
-
"description": "Category from the RSS feed (e.g., 'politica', 'deportes', 'economia').",
94
+
"description": "DEPRECATED — equivalent to tags[0]. Kept for backward compatibility with consumers that read it; new consumers should read `tags`. Will be removed in a future revision.",
74
95
"maxGraphemes": 64
96
+
},
97
+
"mediaCaption": {
98
+
"type": "string",
99
+
"maxLength": 500,
100
+
"description": "Caption for imageUrl when the feed provides one (Google News <image:caption>, RSS Media <media:description>).",
101
+
"maxGraphemes": 200
102
+
},
103
+
"originalSource": {
104
+
"type": "object",
105
+
"properties": {
106
+
"url": {
107
+
"type": "string",
108
+
"format": "uri"
109
+
},
110
+
"name": {
111
+
"type": "string",
112
+
"maxLength": 256,
113
+
"maxGraphemes": 100
114
+
}
115
+
},
116
+
"description": "Set when the feed declares the article was syndicated from another outlet (RSS <source url>, <dc:source>). Distinguishes legitimate republication (e.g., OEM regional papers carrying a Sol de México story) from accidental duplicates."
75
117
}
76
118
}
77
119
},
78
120
"description": "A news article scraped from an RSS feed or website."
79
121
}
80
122
},
81
123
"$type": "com.atproto.lexicon.schema",
82
124
"lexicon": 1,
83
125
"description": "A news article from a media outlet, representing the raw published content before any AI enrichment."
84
126
}