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