tech.transparencia.news.article

transparencia.pds.transparencia.tech

Schema Diff

+47 -5

From

CID
bafyreigj2feexux...
Indexed At
2026-04-04 16:34 UTC
View this version

To

CID
bafyreicegbswema...
Indexed At
2026-05-19 00:55 UTC
View this version

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
}

Compare Other Versions

Lexicon Garden

@