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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +8 -0
- data/Gemfile +10 -0
- data/LICENSE.txt +17 -0
- data/README.md +180 -0
- data/Rakefile +38 -0
- data/doc/Jekyll/AgentAudit/BuildInventory.md +29 -0
- data/doc/Jekyll/AgentAudit/Configuration.md +42 -0
- data/doc/Jekyll/AgentAudit/ConfigurationError.md +6 -0
- data/doc/Jekyll/AgentAudit/Error.md +6 -0
- data/doc/Jekyll/AgentAudit/Extractor.md +20 -0
- data/doc/Jekyll/AgentAudit/Finding.md +30 -0
- data/doc/Jekyll/AgentAudit/InputError.md +6 -0
- data/doc/Jekyll/AgentAudit/LinkGraph.md +26 -0
- data/doc/Jekyll/AgentAudit/Registry.md +38 -0
- data/doc/Jekyll/AgentAudit/Report.md +27 -0
- data/doc/Jekyll/AgentAudit/ReportError.md +6 -0
- data/doc/Jekyll/AgentAudit/Reporters/Console.md +19 -0
- data/doc/Jekyll/AgentAudit/Reporters/JSON.md +9 -0
- data/doc/Jekyll/AgentAudit/Reporters.md +5 -0
- data/doc/Jekyll/AgentAudit/Rules/Provenance.md +127 -0
- data/doc/Jekyll/AgentAudit/Rules/Publication.md +73 -0
- data/doc/Jekyll/AgentAudit/Rules.md +5 -0
- data/doc/Jekyll/AgentAudit/Runner.md +13 -0
- data/doc/Jekyll/AgentAudit/UrlResolver.md +13 -0
- data/doc/Jekyll/AgentAudit.md +35 -0
- data/doc/Jekyll/Commands/AgentAudit/CommandParser.md +9 -0
- data/doc/Jekyll/Commands/AgentAudit/ParserErrors.md +9 -0
- data/doc/Jekyll/Commands/AgentAudit.md +13 -0
- data/doc/Jekyll/Commands.md +5 -0
- data/doc/Jekyll.md +5 -0
- data/doc/README.md +180 -0
- data/doc/index.csv +154 -0
- data/docs/example-report.json +281 -0
- data/docs/implementation-plan.md +26 -0
- data/docs/limitations.md +31 -0
- data/docs/verification.md +52 -0
- data/lib/jekyll/agent_audit/build_inventory.rb +196 -0
- data/lib/jekyll/agent_audit/command.rb +179 -0
- data/lib/jekyll/agent_audit/configuration.rb +196 -0
- data/lib/jekyll/agent_audit/errors.rb +10 -0
- data/lib/jekyll/agent_audit/extractor.rb +230 -0
- data/lib/jekyll/agent_audit/finding.rb +57 -0
- data/lib/jekyll/agent_audit/link_graph.rb +82 -0
- data/lib/jekyll/agent_audit/registry.rb +133 -0
- data/lib/jekyll/agent_audit/report.rb +79 -0
- data/lib/jekyll/agent_audit/reporters/console.rb +144 -0
- data/lib/jekyll/agent_audit/reporters/json.rb +16 -0
- data/lib/jekyll/agent_audit/rules/provenance.rb +412 -0
- data/lib/jekyll/agent_audit/rules/publication.rb +186 -0
- data/lib/jekyll/agent_audit/runner.rb +266 -0
- data/lib/jekyll/agent_audit/url_resolver.rb +98 -0
- data/lib/jekyll/agent_audit/version.rb +7 -0
- data/lib/jekyll-agent-audit.rb +24 -0
- data/llms.txt +35 -0
- data/schema/report-1.0.json +66 -0
- data/script/benchmark.rb +68 -0
- 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.
|
data/docs/limitations.md
ADDED
|
@@ -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.
|