jekyll-agent-audit 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +8 -0
  3. data/Gemfile +10 -0
  4. data/LICENSE.txt +17 -0
  5. data/README.md +180 -0
  6. data/Rakefile +38 -0
  7. data/doc/Jekyll/AgentAudit/BuildInventory.md +29 -0
  8. data/doc/Jekyll/AgentAudit/Configuration.md +42 -0
  9. data/doc/Jekyll/AgentAudit/ConfigurationError.md +6 -0
  10. data/doc/Jekyll/AgentAudit/Error.md +6 -0
  11. data/doc/Jekyll/AgentAudit/Extractor.md +20 -0
  12. data/doc/Jekyll/AgentAudit/Finding.md +30 -0
  13. data/doc/Jekyll/AgentAudit/InputError.md +6 -0
  14. data/doc/Jekyll/AgentAudit/LinkGraph.md +26 -0
  15. data/doc/Jekyll/AgentAudit/Registry.md +38 -0
  16. data/doc/Jekyll/AgentAudit/Report.md +27 -0
  17. data/doc/Jekyll/AgentAudit/ReportError.md +6 -0
  18. data/doc/Jekyll/AgentAudit/Reporters/Console.md +19 -0
  19. data/doc/Jekyll/AgentAudit/Reporters/JSON.md +9 -0
  20. data/doc/Jekyll/AgentAudit/Reporters.md +5 -0
  21. data/doc/Jekyll/AgentAudit/Rules/Provenance.md +127 -0
  22. data/doc/Jekyll/AgentAudit/Rules/Publication.md +73 -0
  23. data/doc/Jekyll/AgentAudit/Rules.md +5 -0
  24. data/doc/Jekyll/AgentAudit/Runner.md +13 -0
  25. data/doc/Jekyll/AgentAudit/UrlResolver.md +13 -0
  26. data/doc/Jekyll/AgentAudit.md +35 -0
  27. data/doc/Jekyll/Commands/AgentAudit/CommandParser.md +9 -0
  28. data/doc/Jekyll/Commands/AgentAudit/ParserErrors.md +9 -0
  29. data/doc/Jekyll/Commands/AgentAudit.md +13 -0
  30. data/doc/Jekyll/Commands.md +5 -0
  31. data/doc/Jekyll.md +5 -0
  32. data/doc/README.md +180 -0
  33. data/doc/index.csv +154 -0
  34. data/docs/example-report.json +281 -0
  35. data/docs/implementation-plan.md +26 -0
  36. data/docs/limitations.md +31 -0
  37. data/docs/verification.md +52 -0
  38. data/lib/jekyll/agent_audit/build_inventory.rb +196 -0
  39. data/lib/jekyll/agent_audit/command.rb +179 -0
  40. data/lib/jekyll/agent_audit/configuration.rb +196 -0
  41. data/lib/jekyll/agent_audit/errors.rb +10 -0
  42. data/lib/jekyll/agent_audit/extractor.rb +230 -0
  43. data/lib/jekyll/agent_audit/finding.rb +57 -0
  44. data/lib/jekyll/agent_audit/link_graph.rb +82 -0
  45. data/lib/jekyll/agent_audit/registry.rb +133 -0
  46. data/lib/jekyll/agent_audit/report.rb +79 -0
  47. data/lib/jekyll/agent_audit/reporters/console.rb +144 -0
  48. data/lib/jekyll/agent_audit/reporters/json.rb +16 -0
  49. data/lib/jekyll/agent_audit/rules/provenance.rb +412 -0
  50. data/lib/jekyll/agent_audit/rules/publication.rb +186 -0
  51. data/lib/jekyll/agent_audit/runner.rb +266 -0
  52. data/lib/jekyll/agent_audit/url_resolver.rb +98 -0
  53. data/lib/jekyll/agent_audit/version.rb +7 -0
  54. data/lib/jekyll-agent-audit.rb +24 -0
  55. data/llms.txt +35 -0
  56. data/schema/report-1.0.json +66 -0
  57. data/script/benchmark.rb +68 -0
  58. metadata +133 -0
data/doc/index.csv ADDED
@@ -0,0 +1,154 @@
1
+ name,type,path
2
+ README.md,File,README.md
3
+ Jekyll,Module,Jekyll.md
4
+ Jekyll::AgentAudit,Module,Jekyll/AgentAudit.md
5
+ Jekyll::AgentAudit.VERSION,Constant,Jekyll/AgentAudit.md#constant-VERSION
6
+ Jekyll::Commands,Module,Jekyll/Commands.md
7
+ Jekyll::Commands::AgentAudit::ParserErrors,Module,Jekyll/Commands/AgentAudit/ParserErrors.md
8
+ Jekyll::Commands::AgentAudit::ParserErrors.parse!,Method,Jekyll/Commands/AgentAudit/ParserErrors.md#method-i-parse-21
9
+ Jekyll::Commands::AgentAudit::CommandParser,Module,Jekyll/Commands/AgentAudit/CommandParser.md
10
+ Jekyll::Commands::AgentAudit::CommandParser.go,Method,Jekyll/Commands/AgentAudit/CommandParser.md#method-i-go
11
+ Jekyll::AgentAudit::Registry,Module,Jekyll/AgentAudit/Registry.md
12
+ Jekyll::AgentAudit::Registry.SEVERITIES,Constant,Jekyll/AgentAudit/Registry.md#constant-SEVERITIES
13
+ Jekyll::AgentAudit::Registry.SOURCE_URLS,Constant,Jekyll/AgentAudit/Registry.md#constant-SOURCE_URLS
14
+ Jekyll::AgentAudit::Registry.MVP_RULES,Constant,Jekyll/AgentAudit/Registry.md#constant-MVP_RULES
15
+ Jekyll::AgentAudit::Registry.DEFERRED_RULES,Constant,Jekyll/AgentAudit/Registry.md#constant-DEFERRED_RULES
16
+ Jekyll::AgentAudit::Registry.DETAILS,Constant,Jekyll/AgentAudit/Registry.md#constant-DETAILS
17
+ Jekyll::AgentAudit::Registry.[],Method,Jekyll/AgentAudit/Registry.md#method-c--5B-5D
18
+ Jekyll::AgentAudit::Registry.all,Method,Jekyll/AgentAudit/Registry.md#method-c-all
19
+ Jekyll::AgentAudit::Registry.deferred?,Method,Jekyll/AgentAudit/Registry.md#method-c-deferred-3F
20
+ Jekyll::AgentAudit::Registry.known?,Method,Jekyll/AgentAudit/Registry.md#method-c-known-3F
21
+ Jekyll::AgentAudit::Registry.mvp_ids,Method,Jekyll/AgentAudit/Registry.md#method-c-mvp_ids
22
+ Jekyll::AgentAudit::Reporters,Module,Jekyll/AgentAudit/Reporters.md
23
+ Jekyll::AgentAudit::Reporters::JSON,Module,Jekyll/AgentAudit/Reporters/JSON.md
24
+ Jekyll::AgentAudit::Reporters::JSON.render,Method,Jekyll/AgentAudit/Reporters/JSON.md#method-c-render
25
+ Jekyll::AgentAudit::Rules,Module,Jekyll/AgentAudit/Rules.md
26
+ Jekyll::AgentAudit::Rules::Provenance,Module,Jekyll/AgentAudit/Rules/Provenance.md
27
+ Jekyll::AgentAudit::Rules::Provenance.ARTICLE_TYPES,Constant,Jekyll/AgentAudit/Rules/Provenance.md#constant-ARTICLE_TYPES
28
+ Jekyll::AgentAudit::Rules::Provenance.INTENT_KEYS,Constant,Jekyll/AgentAudit/Rules/Provenance.md#constant-INTENT_KEYS
29
+ Jekyll::AgentAudit::Rules::Provenance.ambiguous_article?,Method,Jekyll/AgentAudit/Rules/Provenance.md#method-c-ambiguous_article-3F
30
+ Jekyll::AgentAudit::Rules::Provenance.article?,Method,Jekyll/AgentAudit/Rules/Provenance.md#method-c-article-3F
31
+ Jekyll::AgentAudit::Rules::Provenance.author_identity_kind,Method,Jekyll/AgentAudit/Rules/Provenance.md#method-c-author_identity_kind
32
+ Jekyll::AgentAudit::Rules::Provenance.author_set,Method,Jekyll/AgentAudit/Rules/Provenance.md#method-c-author_set
33
+ Jekyll::AgentAudit::Rules::Provenance.author_sources,Method,Jekyll/AgentAudit/Rules/Provenance.md#method-c-author_sources
34
+ Jekyll::AgentAudit::Rules::Provenance.canonical_urls,Method,Jekyll/AgentAudit/Rules/Provenance.md#method-c-canonical_urls
35
+ Jekyll::AgentAudit::Rules::Provenance.collect_nodes,Method,Jekyll/AgentAudit/Rules/Provenance.md#method-c-collect_nodes
36
+ Jekyll::AgentAudit::Rules::Provenance.comparable_date,Method,Jekyll/AgentAudit/Rules/Provenance.md#method-c-comparable_date
37
+ Jekyll::AgentAudit::Rules::Provenance.date_order,Method,Jekyll/AgentAudit/Rules/Provenance.md#method-c-date_order
38
+ Jekyll::AgentAudit::Rules::Provenance.disjoint?,Method,Jekyll/AgentAudit/Rules/Provenance.md#method-c-disjoint-3F
39
+ Jekyll::AgentAudit::Rules::Provenance.draft,Method,Jekyll/AgentAudit/Rules/Provenance.md#method-c-draft
40
+ Jekyll::AgentAudit::Rules::Provenance.evaluate,Method,Jekyll/AgentAudit/Rules/Provenance.md#method-c-evaluate
41
+ Jekyll::AgentAudit::Rules::Provenance.explicit_sources,Method,Jekyll/AgentAudit/Rules/Provenance.md#method-c-explicit_sources
42
+ Jekyll::AgentAudit::Rules::Provenance.infer_seo_rendered_fallback!,Method,Jekyll/AgentAudit/Rules/Provenance.md#method-c-infer_seo_rendered_fallback-21
43
+ Jekyll::AgentAudit::Rules::Provenance.intent_value,Method,Jekyll/AgentAudit/Rules/Provenance.md#method-c-intent_value
44
+ Jekyll::AgentAudit::Rules::Provenance.interval_before?,Method,Jekyll/AgentAudit/Rules/Provenance.md#method-c-interval_before-3F
45
+ Jekyll::AgentAudit::Rules::Provenance.invalid_dates,Method,Jekyll/AgentAudit/Rules/Provenance.md#method-c-invalid_dates
46
+ Jekyll::AgentAudit::Rules::Provenance.invalid_jsonld,Method,Jekyll/AgentAudit/Rules/Provenance.md#method-c-invalid_jsonld
47
+ Jekyll::AgentAudit::Rules::Provenance.jsonld_nodes,Method,Jekyll/AgentAudit/Rules/Provenance.md#method-c-jsonld_nodes
48
+ Jekyll::AgentAudit::Rules::Provenance.line,Method,Jekyll/AgentAudit/Rules/Provenance.md#method-c-line
49
+ Jekyll::AgentAudit::Rules::Provenance.locations_for,Method,Jekyll/AgentAudit/Rules/Provenance.md#method-c-locations_for
50
+ Jekyll::AgentAudit::Rules::Provenance.metadata_comparable?,Method,Jekyll/AgentAudit/Rules/Provenance.md#method-c-metadata_comparable-3F
51
+ Jekyll::AgentAudit::Rules::Provenance.metadata_conflict,Method,Jekyll/AgentAudit/Rules/Provenance.md#method-c-metadata_conflict
52
+ Jekyll::AgentAudit::Rules::Provenance.metadata_sources,Method,Jekyll/AgentAudit/Rules/Provenance.md#method-c-metadata_sources
53
+ Jekyll::AgentAudit::Rules::Provenance.normalize_name,Method,Jekyll/AgentAudit/Rules/Provenance.md#method-c-normalize_name
54
+ Jekyll::AgentAudit::Rules::Provenance.overlaps?,Method,Jekyll/AgentAudit/Rules/Provenance.md#method-c-overlaps-3F
55
+ Jekyll::AgentAudit::Rules::Provenance.parse_date,Method,Jekyll/AgentAudit/Rules/Provenance.md#method-c-parse_date
56
+ Jekyll::AgentAudit::Rules::Provenance.primary_article,Method,Jekyll/AgentAudit/Rules/Provenance.md#method-c-primary_article
57
+ Jekyll::AgentAudit::Rules::Provenance.provenance_sources,Method,Jekyll/AgentAudit/Rules/Provenance.md#method-c-provenance_sources
58
+ Jekyll::AgentAudit::Rules::Provenance.publisher_sources,Method,Jekyll/AgentAudit/Rules/Provenance.md#method-c-publisher_sources
59
+ Jekyll::AgentAudit::Rules::Provenance.resolved_value,Method,Jekyll/AgentAudit/Rules/Provenance.md#method-c-resolved_value
60
+ Jekyll::AgentAudit::Rules::Provenance.scripts,Method,Jekyll/AgentAudit/Rules/Provenance.md#method-c-scripts
61
+ Jekyll::AgentAudit::Rules::Provenance.seo_fallback_date?,Method,Jekyll/AgentAudit/Rules/Provenance.md#method-c-seo_fallback_date-3F
62
+ Jekyll::AgentAudit::Rules::Provenance.seo_plugin_active?,Method,Jekyll/AgentAudit/Rules/Provenance.md#method-c-seo_plugin_active-3F
63
+ Jekyll::AgentAudit::Rules::Provenance.source,Method,Jekyll/AgentAudit/Rules/Provenance.md#method-c-source
64
+ Jekyll::AgentAudit::Rules::Provenance.source_observation,Method,Jekyll/AgentAudit/Rules/Provenance.md#method-c-source_observation
65
+ Jekyll::AgentAudit::Rules::Provenance.timezone,Method,Jekyll/AgentAudit/Rules/Provenance.md#method-c-timezone
66
+ Jekyll::AgentAudit::Rules::Provenance.timezone_free_timestamp?,Method,Jekyll/AgentAudit/Rules/Provenance.md#method-c-timezone_free_timestamp-3F
67
+ Jekyll::AgentAudit::Reporters::Console,Module,Jekyll/AgentAudit/Reporters/Console.md
68
+ Jekyll::AgentAudit::Reporters::Console.SEVERITIES,Constant,Jekyll/AgentAudit/Reporters/Console.md#constant-SEVERITIES
69
+ Jekyll::AgentAudit::Reporters::Console.MAX_VALUE_LENGTH,Constant,Jekyll/AgentAudit/Reporters/Console.md#constant-MAX_VALUE_LENGTH
70
+ Jekyll::AgentAudit::Reporters::Console.render,Method,Jekyll/AgentAudit/Reporters/Console.md#method-c-render
71
+ Jekyll::AgentAudit::Reporters::Console.result_line,Method,Jekyll/AgentAudit/Reporters/Console.md#method-c-result_line
72
+ Jekyll::AgentAudit::Rules::Publication,Module,Jekyll/AgentAudit/Rules/Publication.md
73
+ Jekyll::AgentAudit::Rules::Publication.IDS,Constant,Jekyll/AgentAudit/Rules/Publication.md#constant-IDS
74
+ Jekyll::AgentAudit::Rules::Publication.SEVERITIES,Constant,Jekyll/AgentAudit/Rules/Publication.md#constant-SEVERITIES
75
+ Jekyll::AgentAudit::Rules::Publication.architecture_orphan,Method,Jekyll/AgentAudit/Rules/Publication.md#method-c-architecture_orphan
76
+ Jekyll::AgentAudit::Rules::Publication.architecture_output_collision,Method,Jekyll/AgentAudit/Rules/Publication.md#method-c-architecture_output_collision
77
+ Jekyll::AgentAudit::Rules::Publication.asset_target?,Method,Jekyll/AgentAudit/Rules/Publication.md#method-c-asset_target-3F
78
+ Jekyll::AgentAudit::Rules::Publication.collision,Method,Jekyll/AgentAudit/Rules/Publication.md#method-c-collision
79
+ Jekyll::AgentAudit::Rules::Publication.evaluate,Method,Jekyll/AgentAudit/Rules/Publication.md#method-c-evaluate
80
+ Jekyll::AgentAudit::Rules::Publication.finding,Method,Jekyll/AgentAudit/Rules/Publication.md#method-c-finding
81
+ Jekyll::AgentAudit::Rules::Publication.graph,Method,Jekyll/AgentAudit/Rules/Publication.md#method-c-graph
82
+ Jekyll::AgentAudit::Rules::Publication.identity_canonical_invalid,Method,Jekyll/AgentAudit/Rules/Publication.md#method-c-identity_canonical_invalid
83
+ Jekyll::AgentAudit::Rules::Publication.identity_canonical_multiple,Method,Jekyll/AgentAudit/Rules/Publication.md#method-c-identity_canonical_multiple
84
+ Jekyll::AgentAudit::Rules::Publication.identity_canonical_target_missing,Method,Jekyll/AgentAudit/Rules/Publication.md#method-c-identity_canonical_target_missing
85
+ Jekyll::AgentAudit::Rules::Publication.links,Method,Jekyll/AgentAudit/Rules/Publication.md#method-c-links
86
+ Jekyll::AgentAudit::Rules::Publication.links_fragment_missing,Method,Jekyll/AgentAudit/Rules/Publication.md#method-c-links_fragment_missing
87
+ Jekyll::AgentAudit::Rules::Publication.links_target_missing,Method,Jekyll/AgentAudit/Rules/Publication.md#method-c-links_target_missing
88
+ Jekyll::AgentAudit::Rules::Publication.root?,Method,Jekyll/AgentAudit/Rules/Publication.md#method-c-root-3F
89
+ Jekyll::AgentAudit::Rules::Publication.structure_h1_absent,Method,Jekyll/AgentAudit/Rules/Publication.md#method-c-structure_h1_absent
90
+ Jekyll::AgentAudit::Rules::Publication.structure_heading_empty,Method,Jekyll/AgentAudit/Rules/Publication.md#method-c-structure_heading_empty
91
+ Jekyll::AgentAudit::Rules::Publication.structure_heading_jump,Method,Jekyll/AgentAudit/Rules/Publication.md#method-c-structure_heading_jump
92
+ Jekyll::AgentAudit::Rules::Publication.structure_id_duplicate,Method,Jekyll/AgentAudit/Rules/Publication.md#method-c-structure_id_duplicate
93
+ Jekyll::AgentAudit::Rules::Publication.structure_link_unnamed,Method,Jekyll/AgentAudit/Rules/Publication.md#method-c-structure_link_unnamed
94
+ Jekyll::AgentAudit::Rules::Publication.structure_title_missing,Method,Jekyll/AgentAudit/Rules/Publication.md#method-c-structure_title_missing
95
+ Jekyll::AgentAudit::Error,Class,Jekyll/AgentAudit/Error.md
96
+ Jekyll::AgentAudit::ConfigurationError,Class,Jekyll/AgentAudit/ConfigurationError.md
97
+ Jekyll::AgentAudit::InputError,Class,Jekyll/AgentAudit/InputError.md
98
+ Jekyll::AgentAudit::ReportError,Class,Jekyll/AgentAudit/ReportError.md
99
+ Jekyll::AgentAudit::Report,Class,Jekyll/AgentAudit/Report.md
100
+ Jekyll::AgentAudit::Report.SCHEMA_VERSION,Constant,Jekyll/AgentAudit/Report.md#constant-SCHEMA_VERSION
101
+ Jekyll::AgentAudit::Report.exit_code,Method,Jekyll/AgentAudit/Report.md#method-i-exit_code
102
+ Jekyll::AgentAudit::Report.findings,Method,Jekyll/AgentAudit/Report.md#method-i-findings
103
+ Jekyll::AgentAudit::Report.initialize,Method,Jekyll/AgentAudit/Report.md#method-i-initialize
104
+ Jekyll::AgentAudit::Report.to_h,Method,Jekyll/AgentAudit/Report.md#method-i-to_h
105
+ Jekyll::AgentAudit::Report.data,Attribute,Jekyll/AgentAudit/Report.md#attribute-i-data
106
+ Jekyll::AgentAudit::Runner,Class,Jekyll/AgentAudit/Runner.md
107
+ Jekyll::AgentAudit::Runner.initialize,Method,Jekyll/AgentAudit/Runner.md#method-i-initialize
108
+ Jekyll::AgentAudit::Runner.run,Method,Jekyll/AgentAudit/Runner.md#method-i-run
109
+ Jekyll::Commands::AgentAudit,Class,Jekyll/Commands/AgentAudit.md
110
+ Jekyll::Commands::AgentAudit.init_with_program,Method,Jekyll/Commands/AgentAudit.md#method-c-init_with_program
111
+ Jekyll::Commands::AgentAudit.process,Method,Jekyll/Commands/AgentAudit.md#method-c-process
112
+ Jekyll::AgentAudit::Finding,Class,Jekyll/AgentAudit/Finding.md
113
+ Jekyll::AgentAudit::Finding.SEVERITY_ORDER,Constant,Jekyll/AgentAudit/Finding.md#constant-SEVERITY_ORDER
114
+ Jekyll::AgentAudit::Finding.[],Method,Jekyll/AgentAudit/Finding.md#method-i--5B-5D
115
+ Jekyll::AgentAudit::Finding.initialize,Method,Jekyll/AgentAudit/Finding.md#method-i-initialize
116
+ Jekyll::AgentAudit::Finding.severity_rank,Method,Jekyll/AgentAudit/Finding.md#method-i-severity_rank
117
+ Jekyll::AgentAudit::Finding.suppressed?,Method,Jekyll/AgentAudit/Finding.md#method-i-suppressed-3F
118
+ Jekyll::AgentAudit::Finding.to_h,Method,Jekyll/AgentAudit/Finding.md#method-i-to_h
119
+ Jekyll::AgentAudit::Finding.data,Attribute,Jekyll/AgentAudit/Finding.md#attribute-i-data
120
+ Jekyll::AgentAudit::Extractor,Class,Jekyll/AgentAudit/Extractor.md
121
+ Jekyll::AgentAudit::Extractor.MAX_NAME_BYTES,Constant,Jekyll/AgentAudit/Extractor.md#constant-MAX_NAME_BYTES
122
+ Jekyll::AgentAudit::Extractor.MAX_EXCERPT_BYTES,Constant,Jekyll/AgentAudit/Extractor.md#constant-MAX_EXCERPT_BYTES
123
+ Jekyll::AgentAudit::Extractor.extract,Method,Jekyll/AgentAudit/Extractor.md#method-i-extract
124
+ Jekyll::AgentAudit::Extractor.initialize,Method,Jekyll/AgentAudit/Extractor.md#method-i-initialize
125
+ Jekyll::AgentAudit::LinkGraph,Class,Jekyll/AgentAudit/LinkGraph.md
126
+ Jekyll::AgentAudit::LinkGraph.edges,Method,Jekyll/AgentAudit/LinkGraph.md#method-i-edges
127
+ Jekyll::AgentAudit::LinkGraph.edges_for,Method,Jekyll/AgentAudit/LinkGraph.md#method-i-edges_for
128
+ Jekyll::AgentAudit::LinkGraph.incoming,Method,Jekyll/AgentAudit/LinkGraph.md#method-i-incoming
129
+ Jekyll::AgentAudit::LinkGraph.initialize,Method,Jekyll/AgentAudit/LinkGraph.md#method-i-initialize
130
+ Jekyll::AgentAudit::LinkGraph.reachable,Method,Jekyll/AgentAudit/LinkGraph.md#method-i-reachable
131
+ Jekyll::AgentAudit::LinkGraph.diagnostics,Attribute,Jekyll/AgentAudit/LinkGraph.md#attribute-i-diagnostics
132
+ Jekyll::AgentAudit::UrlResolver,Class,Jekyll/AgentAudit/UrlResolver.md
133
+ Jekyll::AgentAudit::UrlResolver.initialize,Method,Jekyll/AgentAudit/UrlResolver.md#method-i-initialize
134
+ Jekyll::AgentAudit::UrlResolver.resolve,Method,Jekyll/AgentAudit/UrlResolver.md#method-i-resolve
135
+ Jekyll::AgentAudit::Configuration,Class,Jekyll/AgentAudit/Configuration.md
136
+ Jekyll::AgentAudit::Configuration.DEFAULTS,Constant,Jekyll/AgentAudit/Configuration.md#constant-DEFAULTS
137
+ Jekyll::AgentAudit::Configuration.TOP_KEYS,Constant,Jekyll/AgentAudit/Configuration.md#constant-TOP_KEYS
138
+ Jekyll::AgentAudit::Configuration.LIMITS,Constant,Jekyll/AgentAudit/Configuration.md#constant-LIMITS
139
+ Jekyll::AgentAudit::Configuration.[],Method,Jekyll/AgentAudit/Configuration.md#method-i--5B-5D
140
+ Jekyll::AgentAudit::Configuration.enabled_rules,Method,Jekyll/AgentAudit/Configuration.md#method-i-enabled_rules
141
+ Jekyll::AgentAudit::Configuration.expired_suppressions,Method,Jekyll/AgentAudit/Configuration.md#method-i-expired_suppressions
142
+ Jekyll::AgentAudit::Configuration.initialize,Method,Jekyll/AgentAudit/Configuration.md#method-i-initialize
143
+ Jekyll::AgentAudit::Configuration.selected?,Method,Jekyll/AgentAudit/Configuration.md#method-i-selected-3F
144
+ Jekyll::AgentAudit::Configuration.suppression_for,Method,Jekyll/AgentAudit/Configuration.md#method-i-suppression_for
145
+ Jekyll::AgentAudit::Configuration.to_h,Method,Jekyll/AgentAudit/Configuration.md#method-i-to_h
146
+ Jekyll::AgentAudit::Configuration.raw,Attribute,Jekyll/AgentAudit/Configuration.md#attribute-i-raw
147
+ Jekyll::AgentAudit::BuildInventory,Class,Jekyll/AgentAudit/BuildInventory.md
148
+ Jekyll::AgentAudit::BuildInventory.capture!,Method,Jekyll/AgentAudit/BuildInventory.md#method-i-capture-21
149
+ Jekyll::AgentAudit::BuildInventory.complete?,Method,Jekyll/AgentAudit/BuildInventory.md#method-i-complete-3F
150
+ Jekyll::AgentAudit::BuildInventory.finalize!,Method,Jekyll/AgentAudit/BuildInventory.md#method-i-finalize-21
151
+ Jekyll::AgentAudit::BuildInventory.initialize,Method,Jekyll/AgentAudit/BuildInventory.md#method-i-initialize
152
+ Jekyll::AgentAudit::BuildInventory.collisions,Attribute,Jekyll/AgentAudit/BuildInventory.md#attribute-i-collisions
153
+ Jekyll::AgentAudit::BuildInventory.diagnostics,Attribute,Jekyll/AgentAudit/BuildInventory.md#attribute-i-diagnostics
154
+ Jekyll::AgentAudit::BuildInventory.entries,Attribute,Jekyll/AgentAudit/BuildInventory.md#attribute-i-entries
@@ -0,0 +1,281 @@
1
+ {
2
+ "schema_version": "1.0",
3
+ "tool": {
4
+ "name": "jekyll-agent-audit",
5
+ "version": "0.1.0"
6
+ },
7
+ "run": {
8
+ "mode": "local_build",
9
+ "complete": true,
10
+ "site_url": "https://example.com",
11
+ "baseurl": "",
12
+ "environment": "development",
13
+ "reference_time": "2026-09-09T10:00:00Z",
14
+ "ruleset_version": "0.1.0",
15
+ "effective_configuration": {
16
+ "fail_on": "error",
17
+ "format": "console",
18
+ "include": [
19
+ "**/*"
20
+ ],
21
+ "exclude": [],
22
+ "content": {
23
+ "selector": null,
24
+ "exclude_selectors": [
25
+ "nav",
26
+ "footer",
27
+ "aside",
28
+ "script",
29
+ "style",
30
+ "template"
31
+ ]
32
+ },
33
+ "metadata": {
34
+ "selectors": {
35
+ "author": null,
36
+ "publisher": null,
37
+ "published": null,
38
+ "modified": null
39
+ }
40
+ },
41
+ "graph": {
42
+ "roots": [
43
+ "/"
44
+ ]
45
+ },
46
+ "routes": {
47
+ "directory_index": "index.html",
48
+ "external_paths": [],
49
+ "aliases": {}
50
+ },
51
+ "rules": {},
52
+ "suppressions": [],
53
+ "limits": {
54
+ "max_html_bytes": 5242880,
55
+ "max_jsonld_bytes": 1048576,
56
+ "max_documents": 50000,
57
+ "max_edges": 1000000
58
+ }
59
+ },
60
+ "build": {
61
+ "incremental": false,
62
+ "show_drafts": false,
63
+ "future": false,
64
+ "timezone": ""
65
+ }
66
+ },
67
+ "policy": {
68
+ "fail_on": "error",
69
+ "passed": false,
70
+ "exit_code": 1
71
+ },
72
+ "summary": {
73
+ "documents_inspected": 1,
74
+ "active": {
75
+ "error": 1,
76
+ "warning": 1,
77
+ "info": 1,
78
+ "experimental": 0
79
+ },
80
+ "suppressed": 0,
81
+ "affected_documents": 1
82
+ },
83
+ "coverage": {
84
+ "discovery": {
85
+ "status": "not_assessed",
86
+ "owner": "jekyll-agent-discovery"
87
+ },
88
+ "rules": {
89
+ "architecture.output_collision": {
90
+ "candidate": 1,
91
+ "evaluated": 1,
92
+ "not_applicable": 0,
93
+ "skipped": 0
94
+ },
95
+ "links.target_missing": {
96
+ "candidate": 1,
97
+ "evaluated": 1,
98
+ "not_applicable": 0,
99
+ "skipped": 0
100
+ },
101
+ "links.fragment_missing": {
102
+ "candidate": 1,
103
+ "evaluated": 1,
104
+ "not_applicable": 0,
105
+ "skipped": 0
106
+ },
107
+ "architecture.orphan": {
108
+ "candidate": 1,
109
+ "evaluated": 1,
110
+ "not_applicable": 0,
111
+ "skipped": 0
112
+ },
113
+ "identity.canonical_invalid": {
114
+ "candidate": 1,
115
+ "evaluated": 1,
116
+ "not_applicable": 0,
117
+ "skipped": 0
118
+ },
119
+ "identity.canonical_multiple": {
120
+ "candidate": 1,
121
+ "evaluated": 1,
122
+ "not_applicable": 0,
123
+ "skipped": 0
124
+ },
125
+ "identity.canonical_target_missing": {
126
+ "candidate": 1,
127
+ "evaluated": 1,
128
+ "not_applicable": 0,
129
+ "skipped": 0
130
+ },
131
+ "structure.title_missing": {
132
+ "candidate": 1,
133
+ "evaluated": 1,
134
+ "not_applicable": 0,
135
+ "skipped": 0
136
+ },
137
+ "structure.h1_absent": {
138
+ "candidate": 1,
139
+ "evaluated": 1,
140
+ "not_applicable": 0,
141
+ "skipped": 0
142
+ },
143
+ "structure.heading_empty": {
144
+ "candidate": 1,
145
+ "evaluated": 1,
146
+ "not_applicable": 0,
147
+ "skipped": 0
148
+ },
149
+ "structure.heading_jump": {
150
+ "candidate": 1,
151
+ "evaluated": 1,
152
+ "not_applicable": 0,
153
+ "skipped": 0
154
+ },
155
+ "structure.id_duplicate": {
156
+ "candidate": 1,
157
+ "evaluated": 1,
158
+ "not_applicable": 0,
159
+ "skipped": 0
160
+ },
161
+ "structure.link_unnamed": {
162
+ "candidate": 1,
163
+ "evaluated": 1,
164
+ "not_applicable": 0,
165
+ "skipped": 0
166
+ },
167
+ "provenance.jsonld_invalid": {
168
+ "candidate": 1,
169
+ "evaluated": 1,
170
+ "not_applicable": 0,
171
+ "skipped": 0
172
+ },
173
+ "provenance.date_invalid": {
174
+ "candidate": 1,
175
+ "evaluated": 1,
176
+ "not_applicable": 0,
177
+ "skipped": 0
178
+ },
179
+ "provenance.date_order": {
180
+ "candidate": 1,
181
+ "evaluated": 1,
182
+ "not_applicable": 0,
183
+ "skipped": 0
184
+ },
185
+ "provenance.metadata_conflict": {
186
+ "candidate": 1,
187
+ "evaluated": 0,
188
+ "not_applicable": 0,
189
+ "skipped": 1
190
+ }
191
+ }
192
+ },
193
+ "findings": [
194
+ {
195
+ "rule_id": "links.target_missing",
196
+ "rule_version": "1.0",
197
+ "category": "architecture",
198
+ "severity": "error",
199
+ "evidence_level": "A",
200
+ "confidence": "direct",
201
+ "message": "Link points to a missing local target.",
202
+ "extraction_basis": "main",
203
+ "document_url": "https://example.com/",
204
+ "source_path": "index.html",
205
+ "source_line": null,
206
+ "rendered_location": {
207
+ "path": "/index.html",
208
+ "line": 12
209
+ },
210
+ "observation": {
211
+ "href": "/guides/old/",
212
+ "path": "/guides/old/"
213
+ },
214
+ "remediation": "Correct the href or declare the target outside the managed build.",
215
+ "evidence_urls": [
216
+ "https://www.rfc-editor.org/rfc/rfc3986",
217
+ "https://developers.google.com/search/docs/crawling-indexing/links-crawlable"
218
+ ],
219
+ "related_locations": [],
220
+ "fingerprint": "c7154e973c95902f7a4d4cb0cb12fa902c3fe9f32cdaba1040faf46845b4eb56",
221
+ "suppression": null
222
+ },
223
+ {
224
+ "rule_id": "provenance.date_order",
225
+ "rule_version": "1.0",
226
+ "category": "provenance",
227
+ "severity": "warning",
228
+ "evidence_level": "B",
229
+ "confidence": "heuristic",
230
+ "message": "Explicit dateModified precedes datePublished for the primary article.",
231
+ "extraction_basis": "main",
232
+ "document_url": "https://example.com/",
233
+ "source_path": "index.html",
234
+ "source_line": null,
235
+ "rendered_location": {
236
+ "path": "/index.html",
237
+ "line": 6
238
+ },
239
+ "observation": {
240
+ "published": "2026-08-10",
241
+ "modified": "2026-07-01",
242
+ "published_origin": "jsonld",
243
+ "modified_origin": "jsonld"
244
+ },
245
+ "remediation": "Check the metadata sources and correct the modification/publication ordering.",
246
+ "evidence_urls": [
247
+ "https://developers.google.com/search/docs/appearance/publication-dates",
248
+ "https://developers.google.com/search/docs/appearance/structured-data/article"
249
+ ],
250
+ "related_locations": [],
251
+ "fingerprint": "4f393a86a71faed14b2907b2d1503b1fc979ab772b111fa8f63b36ea29bad813",
252
+ "suppression": null
253
+ },
254
+ {
255
+ "rule_id": "structure.h1_absent",
256
+ "rule_version": "1.0",
257
+ "category": "structure",
258
+ "severity": "info",
259
+ "evidence_level": "C",
260
+ "confidence": "heuristic",
261
+ "message": "No level-one heading detected within the extracted content.",
262
+ "extraction_basis": "main",
263
+ "document_url": "https://example.com/",
264
+ "source_path": "index.html",
265
+ "source_line": null,
266
+ "rendered_location": {
267
+ "path": "/index.html",
268
+ "line": null
269
+ },
270
+ "observation": {},
271
+ "remediation": "Review the content selector or render a level-one heading.",
272
+ "evidence_urls": [
273
+ "https://www.w3.org/WAI/tutorials/page-structure/headings/"
274
+ ],
275
+ "related_locations": [],
276
+ "fingerprint": "22801e7d6a4dd3b3161a1beafa667a3cbd59c825bac31d6b3d6d3c0b0765dbe6",
277
+ "suppression": null
278
+ }
279
+ ],
280
+ "diagnostics": []
281
+ }
@@ -0,0 +1,26 @@
1
+ # Implementation plan
2
+
3
+ Implement the 17 MVP rules in `../../docs/jekyll-agent-audit/product-and-technical-specification.md`; deferred rules remain unavailable.
4
+
5
+ 1. Luna foundation lane: configuration validation, closed rule registry, findings/report/suppressions, CLI and temporary-build runner, packaging and CLI tests.
6
+ 2. Luna publication lane: prewrite ownership inventory, final artifact inventory, confined URL resolution, compact HTML extraction, graph and 13 non-provenance rules with tests.
7
+ 3. Luna provenance lane: JSON-LD and explicit metadata extraction/comparison, four provenance rules with tests.
8
+ 4. Integrate components; run real Jekyll/subprocess tests, independent specification review followed by quality review, packaging checks and benchmark. Document measured compatibility and limits.
9
+
10
+ ## Shared component contract
11
+
12
+ Namespace: `Jekyll::AgentAudit`. All hashes use symbol keys internally, except Jekyll/configuration input hashes (string keys). Extracted documents are compact Hash records; DOMs are released after extraction.
13
+
14
+ `Configuration.new(raw_namespace = {}, overrides = {})` exposes `to_h` (string keys), `[]`, `enabled_rules`, `selected?(source_path)`. Configuration errors use `ConfigurationError < StandardError`.
15
+
16
+ `BuildInventory.new(site, configuration)` exposes `capture!` (called from scoped post_render), `finalize!` (after process), `entries`, `collisions`, `diagnostics`, `complete?`. Entries contain `identity`, `source_path` (nullable), `output_path` (slash-prefixed destination-relative), `absolute_path` (internal only), `url` (absolute public URL), `route` (public path), `data` (Jekyll merged), `explicit_data` (raw front matter/default declarations), `selected` boolean. Collision records contain primary entry and owners.
17
+
18
+ `Extractor.new(configuration).extract(entry)` returns the entry merged with `title`, `ids` (Set), `duplicate_ids`, `links`, `canonicals`, `headings`, `base_href`, `content_basis`, `content_confident`, `redirect`, `jsonld_scripts` (array of `{text:, line:}`), `metadata_nodes` (hash), `diagnostics`. Occurrences use `href`, `line`, `name`, `name_supported`, `hidden`, `kind` (`navigation`, `citation`, `alternate`). Headings use `level`, `name`, `name_supported`, `hidden`, `line`. `metadata_nodes` includes `published`, `modified`, `author`, `publisher` arrays of `{value:, line:, origin:}`. Extractor raises `InputError` for supported input/resource failures.
19
+
20
+ `UrlResolver.new(entries, site_config, configuration)` exposes `resolve(href, document, base: true)` returning `{status:, url:, path:, fragment:, target:, reason:}`; status is `local`, `missing`, `external`, `unsupported`, or `invalid`; target is entry or nil. `LinkGraph.new(documents, resolver, configuration)` exposes `incoming(document)` Set and `diagnostics`; roots validation belongs here.
21
+
22
+ `Rules::Publication.evaluate(id, document, context)` handles 13 non-provenance MVP rules. `Rules::Provenance.evaluate(id, document, context)` handles four provenance rules. Context Hash has `documents`, `inventory`, `resolver`, `graph`, `configuration`, `site_config`. Return `{status: :evaluated/:not_applicable/:skipped, findings: [], reason: optional}`. Site collision rule receives nil document. Partial occurrence skips may additionally return `diagnostics` array. Finding drafts contain `document` (record), `message`, `observation` (Hash), `line`, `related_locations`, `remediation` optional; foundation adds registry fields, location, fingerprint, suppressions. No rules do I/O or mutate site.
23
+
24
+ `Runner.new(options = {}).run` returns Report; `Report#to_h`, `#exit_code`; CLI owns rendering and atomic output. Options are string keys, same as Jekyll command options, with audit flags overriding namespace configuration. Entry point requires all components and registers only a no-op-unless-active inventory hook.
25
+
26
+ Test files owned by each lane use distinct names and may require individual components; foundation owns `test/test_helper.rb`. Tests must use real temporary fixtures and Minitest. No commits or modifications to sibling gems. Utility scripts use Ruby standard library only.
@@ -0,0 +1,31 @@
1
+ # Limits and evidence
2
+
3
+ This audit observes a local build, not a browser or deployed server. It does not execute JavaScript, inspect CSS visibility, fetch remote JSON-LD contexts, validate all Schema.org types, check HTTP headers, or establish WCAG conformance.
4
+
5
+ ## References
6
+
7
+ Rule metadata includes direct evidence URLs. The engineering boundaries are based on:
8
+
9
+ - [RFC 3986](https://www.rfc-editor.org/rfc/rfc3986): URI resolution; the local route map remains a hosting assumption.
10
+ - [RFC 6596](https://www.rfc-editor.org/rfc/rfc6596): canonical relations can intentionally identify external or superset content.
11
+ - [W3C headings guidance](https://www.w3.org/WAI/tutorials/page-structure/headings/): heading organization aids navigation; it proves no AI retrieval uplift.
12
+ - [W3C link purpose](https://www.w3.org/WAI/WCAG22/Techniques/html/H80): surrounding context can matter; short labels alone are not failures.
13
+ - [Google article structured data](https://developers.google.com/search/docs/appearance/structured-data/article) and [publication dates](https://developers.google.com/search/docs/appearance/publication-dates): equivalent explicit article metadata should agree; no update timestamp is mandatory here.
14
+
15
+ Evidence A is directly observable syntax/reference/identity behavior. B is a conservative check informed by established guidance. C is a contextual recommendation. D is experimental and never gates CI. Certainty that markup exists is distinct from its significance to readers or retrieval systems.
16
+
17
+ The specification's research review includes both favorable benchmark results from [GEO](https://arxiv.org/abs/2311.09735) and less favorable/context-dependent results from [C-SEO Bench](https://arxiv.org/abs/2506.11097). Neither establishes a universal citation quota, paragraph length, fact density, or page score. The gem implements none of those heuristics.
18
+
19
+ ## Extraction and ownership
20
+
21
+ Final written HTML is authoritative. The prewrite manifest captures cooperative Jekyll emitters and is reconciled after processing. Files created by post-write plugins are inspected but may have unattributed ownership. Direct third-party writers that overwrite the same file without declaring an emitter cannot be completely detected. A rendered line never supplies a source line.
22
+
23
+ Ambiguous main content skips heading checks. Supported accessible-name evidence is intentionally narrower than a browser's full accessibility tree; complex ARIA references are unassessed. Unsupported Unicode URI handling is a coverage gap, not a broken-link claim. Filesystem symlinks escaping the temporary destination are not read. Deployment-owned routes and external targets remain unverified.
24
+
25
+ Only an unambiguously mapped primary Article, BlogPosting, or NewsArticle receives semantic JSON-LD comparison. Unrelated entities, unresolved local identities, arbitrary remote contexts, and Microdata/RDFa do not imply missing metadata. Name comparisons are exact after whitespace normalization, not fuzzy identity judgments. Date-only values represent intervals; overlapping precision is not a contradiction. Inferred Jekyll dates and SEO modification fallbacks are not explicit update claims. No build time or filesystem timestamp is substituted.
26
+
27
+ Orphan findings mean no incoming rendered navigation links from other pages in this build. Canonical and alternate links do not count as navigation. This says nothing about external links, indexing, or reachability from an actual deployed homepage.
28
+
29
+ ## Performance scope
30
+
31
+ Documents, bytes per HTML/JSON-LD script, and link occurrences are bounded by configuration. A supported input exceeding a limit makes the run incomplete. The benchmark uses 1,000 HTML pages averaging 50 KiB and 20 navigation links. The specification's target is at most 10 seconds of analysis and 256 MiB additional peak RSS on a documented four-core Linux runner. Local measurements cannot establish that Linux target; see verification notes for actual results.
@@ -0,0 +1,52 @@
1
+ # Verification and compatibility
2
+
3
+ Verified locally on 9 September 2026. These are measured results, not compatibility inferred from dependency constraints.
4
+
5
+ ## Runtime matrix
6
+
7
+ | Ruby | Jekyll | Nokogiri | Minitest | Result |
8
+ | --- | --- | --- | --- | --- |
9
+ | 3.3.6 | 4.4.1 | 1.19.4 | 6.0.6 | Full test suite and syntax/compiler-warning checks pass |
10
+ | 3.4.7 | 4.4.1 | 1.19.4 | 6.0.6 | Full test suite and syntax/compiler-warning checks pass |
11
+ | 4.0.1 | 4.4.1 | 1.19.4 | 6.0.6 | Full test suite and syntax/compiler-warning checks pass |
12
+
13
+ The final matrix run contained 132 tests and 2,340 assertions per runtime, with no failures, errors, or skips. The suite includes real Jekyll builds, fixture Gemfiles with the `:jekyll_plugins` group, offline Bundler resolution/installation, and actual `bundle exec jekyll agent:audit` subprocesses. The documented `bundle exec rake test lint` command also passes.
14
+
15
+ The design's Ruby 3.5 target has not been verified. The matrix above is the supported evidence; do not treat a preview interpreter as a stable release result. CI is configured for Ruby 3.3, 3.4, and 4.0 on Ubuntu, but that remote workflow has not been executed in this local workspace. Other Jekyll 4.4 patches and older Nokogiri releases permitted by the gemspec have not been independently matrix-tested.
16
+
17
+ Optional plugin fixtures cover `jekyll-seo-tag` 2.9.0, `jekyll-sitemap` 1.4.0, the adjacent `jekyll-agent-markdown` checkout, their combination, and no optional plugins. They check external canonical overrides, inferred SEO date fallbacks, Markdown opt-outs, advertised sibling targets, sitemap exclusion from HTML rules, and final post-write HTML. The Markdown combination requires that sibling checkout; its tests explicitly skip when the checkout is unavailable.
18
+
19
+ ## Verification scope
20
+
21
+ - The specification's illustrative page yields exactly the three expected findings.
22
+ - Source and existing `_site` contents remain unchanged in ordinary supported fixtures.
23
+ - Excluded pages still contribute graph links. Static assets and generated Markdown remain resolvable targets.
24
+ - Rule coverage counts, rendered/source location distinctions, fingerprints, suppressions, resource failures, and JSON schema field contracts are tested.
25
+ - CLI tests prove command discovery, valid and invalid invocations, JSON stdout isolation including direct `STDOUT` writes, atomic output, policy exits, interrupt handling, and ordinary builds remaining unaffected.
26
+ - `rake lint` runs Ruby's syntax and compiler-warning checks on project Ruby files. There is no type system or claimed typecheck.
27
+ - The built `.gem` was installed into an isolated temporary gem directory, then loaded by version from a fresh fixture bundle without a checkout path. Command discovery, a successful JSON audit, and packaged schema/benchmark files were verified.
28
+
29
+ Dependency warnings occur under Ruby's verbose test mode: Kramdown reports a duplicated regexp range, and Liquid emits a CGI migration warning under Ruby 4. These are outside this gem; the gem's own lint check passes. RubyGems on this workstation also emits duplicate RDoc constant warnings during packaging.
30
+
31
+ ## Benchmark
32
+
33
+ Command: `/usr/bin/time -l ruby script/benchmark.rb`.
34
+
35
+ Machine: macOS ARM64 (`arm64-darwin25`), 10 logical CPUs; Ruby 4.0.1, Jekyll 4.4.1, Nokogiri 1.19.4. This is a development workstation, not an isolated benchmark runner.
36
+
37
+ | Measurement | Result |
38
+ | --- | --- |
39
+ | HTML documents | 1,000 |
40
+ | Bytes per HTML document | 51,200 |
41
+ | Navigation links per document | 20 |
42
+ | Jekyll build | 0.504 seconds |
43
+ | Analysis, report creation, and temporary cleanup | 7.183 seconds |
44
+ | Total runner time | 7.697 seconds |
45
+ | Whole-process peak RSS, including Ruby and build | 289,161,216 bytes (275.8 MiB) |
46
+ | Audit result | Exit 0; 1,000 inspected; no findings |
47
+
48
+ The specification's target is **10 seconds and 256 MiB additional analysis peak RSS on a four-core Linux runner**. This Mac measurement does not verify that target. Whole-process RSS is not the analyzer's additional RSS, and exceeds 256 MiB in this run. Linux execution and isolated incremental memory measurement remain release-validation work. The benchmark script reports Linux whole-process `VmHWM` when available; it does not relabel that value as incremental analyzer memory.
49
+
50
+ ## Remaining boundaries
51
+
52
+ The analyzer cannot attribute uncooperative direct filesystem overwrites by third-party plugins. It does not verify deployment-only routes, external links, remote JSON-LD contexts, arbitrary accessible-name algorithms, CSS/JavaScript presentation, or semantic truth. Ambiguous extraction is exposed as skipped coverage. See [limitations](limitations.md) for evidence and interpretation.