reactive-research 0.1.0__tar.gz

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 (60) hide show
  1. reactive_research-0.1.0/.annotations/annotations.md +10 -0
  2. reactive_research-0.1.0/.editorconfig +197 -0
  3. reactive_research-0.1.0/.gitattributes +209 -0
  4. reactive_research-0.1.0/.github/.yamllint.yml +31 -0
  5. reactive_research-0.1.0/.github/dependabot.yml +47 -0
  6. reactive_research-0.1.0/.github/lychee.toml +88 -0
  7. reactive_research-0.1.0/.github/workflows/ci-python-zensical.yml +152 -0
  8. reactive_research-0.1.0/.github/workflows/deploy-zensical.yml +124 -0
  9. reactive_research-0.1.0/.github/workflows/links.yml +61 -0
  10. reactive_research-0.1.0/.github/workflows/pre-release.yml +123 -0
  11. reactive_research-0.1.0/.github/workflows/release-pypi.yml +111 -0
  12. reactive_research-0.1.0/.gitignore +308 -0
  13. reactive_research-0.1.0/.markdownlint-cli2.yaml +80 -0
  14. reactive_research-0.1.0/.markdownlint.json +10 -0
  15. reactive_research-0.1.0/.pre-commit-config.yaml +119 -0
  16. reactive_research-0.1.0/.vscode/ABOUT_THIS_FOLDER.md +38 -0
  17. reactive_research-0.1.0/.vscode/extensions.json +90 -0
  18. reactive_research-0.1.0/.vscode/settings.json +50 -0
  19. reactive_research-0.1.0/AI_USE.md +13 -0
  20. reactive_research-0.1.0/CHANGELOG.md +179 -0
  21. reactive_research-0.1.0/CITATION.cff +31 -0
  22. reactive_research-0.1.0/LICENSE +21 -0
  23. reactive_research-0.1.0/PKG-INFO +129 -0
  24. reactive_research-0.1.0/README.md +103 -0
  25. reactive_research-0.1.0/SE_MANIFEST.toml +83 -0
  26. reactive_research-0.1.0/docs/en/api.md +284 -0
  27. reactive_research-0.1.0/docs/en/index.md +177 -0
  28. reactive_research-0.1.0/docs/index.md +3 -0
  29. reactive_research-0.1.0/pyproject.toml +162 -0
  30. reactive_research-0.1.0/shape.ps1 +91 -0
  31. reactive_research-0.1.0/sit.ps1 +71 -0
  32. reactive_research-0.1.0/src/reactive_research/__init__.py +1 -0
  33. reactive_research-0.1.0/src/reactive_research/_version.py +24 -0
  34. reactive_research-0.1.0/src/reactive_research/cli.py +127 -0
  35. reactive_research-0.1.0/src/reactive_research/commands/__init__.py +1 -0
  36. reactive_research-0.1.0/src/reactive_research/commands/common.py +93 -0
  37. reactive_research-0.1.0/src/reactive_research/commands/extract.py +47 -0
  38. reactive_research-0.1.0/src/reactive_research/commands/graph.py +56 -0
  39. reactive_research-0.1.0/src/reactive_research/commands/impact.py +80 -0
  40. reactive_research-0.1.0/src/reactive_research/commands/inspect.py +48 -0
  41. reactive_research-0.1.0/src/reactive_research/commands/resolve.py +66 -0
  42. reactive_research-0.1.0/src/reactive_research/commands/snapshot.py +51 -0
  43. reactive_research-0.1.0/src/reactive_research/commands/validate.py +48 -0
  44. reactive_research-0.1.0/src/reactive_research/extract.py +285 -0
  45. reactive_research-0.1.0/src/reactive_research/graph.py +32 -0
  46. reactive_research-0.1.0/src/reactive_research/identifiers.py +42 -0
  47. reactive_research-0.1.0/src/reactive_research/impact.py +37 -0
  48. reactive_research-0.1.0/src/reactive_research/inspect.py +32 -0
  49. reactive_research-0.1.0/src/reactive_research/models.py +106 -0
  50. reactive_research-0.1.0/src/reactive_research/py.typed +0 -0
  51. reactive_research-0.1.0/src/reactive_research/repository.py +86 -0
  52. reactive_research-0.1.0/src/reactive_research/resolve.py +30 -0
  53. reactive_research-0.1.0/src/reactive_research/snapshot.py +32 -0
  54. reactive_research-0.1.0/src/reactive_research/validate.py +24 -0
  55. reactive_research-0.1.0/tests/__init__.py +1 -0
  56. reactive_research-0.1.0/tests/test_cli.py +26 -0
  57. reactive_research-0.1.0/tests/test_extract.py +74 -0
  58. reactive_research-0.1.0/tests/test_identifiers.py +48 -0
  59. reactive_research-0.1.0/uv.lock +619 -0
  60. reactive_research-0.1.0/zensical.toml +68 -0
@@ -0,0 +1,10 @@
1
+ # Annotations
2
+
3
+ <!--
4
+ WHY: This repository uses the Structural Explainability Annotation Standard
5
+ to document decisions, constraints, and alternatives directly alongside
6
+ code and configuration.
7
+ -->
8
+
9
+ This repository uses the annotation standard defined at:
10
+ <https://github.com/structural-explainability/.github/blob/main/ANNOTATIONS.md>
@@ -0,0 +1,197 @@
1
+ # ============================================================
2
+ # .editorconfig (ALL-REPOS)
3
+ # ============================================================
4
+ # Updated: 2026-09-25
5
+ #
6
+ # REQ: All professional GitHub project repositories MUST include .editorconfig.
7
+ # WHY: Establish a cross-editor baseline so diffs stay clean and formatting
8
+ # is consistent across editors and IDEs.
9
+ # ALT: Repository may omit .editorconfig ONLY if formatting is enforced
10
+ # equivalently by CI and formatter tooling.
11
+ # CUSTOM: Adjust indent_size defaults only if organizational standards change;
12
+ # keep stable across projects.
13
+ # EditorConfig: https://editorconfig.org
14
+
15
+ root = true
16
+
17
+
18
+ # === Core defaults ===
19
+
20
+ [*]
21
+ # WHY: Normalize line endings and encoding across Windows, macOS, and Linux.
22
+ charset = utf-8
23
+ end_of_line = lf
24
+
25
+ # WHY: Default to 2 spaces for configs and markup; language-specific overrides follow.
26
+ indent_size = 2
27
+ indent_style = space
28
+
29
+ # WHY: Newline at EOF avoids noisy diffs and tool warnings.
30
+ insert_final_newline = true
31
+
32
+ # WHY: Remove accidental whitespace noise in diffs.
33
+ trim_trailing_whitespace = true
34
+
35
+
36
+ # === Named root and metadata files ===
37
+
38
+ [CITATION.cff]
39
+ # WHY: Citation tooling expects stable YAML formatting.
40
+ indent_size = 2
41
+ indent_style = space
42
+
43
+ [CODEOWNERS]
44
+ # WHY: CODEOWNERS is a structured text file; keep formatting simple and stable.
45
+ indent_size = 2
46
+ indent_style = space
47
+
48
+ [LICENSE]
49
+ # WHY: License text should remain plain, stable, and editor-neutral.
50
+ indent_size = 2
51
+ indent_style = space
52
+
53
+
54
+ # === Build systems ===
55
+
56
+ [Makefile]
57
+ # WHY: Makefile recipe lines require real tab characters.
58
+ indent_style = tab
59
+ indent_size = tab
60
+
61
+ [*.mk]
62
+ # WHY: Makefile includes may contain recipes and should preserve real tabs.
63
+ indent_style = tab
64
+ indent_size = tab
65
+
66
+
67
+ # === Markup and documentation ===
68
+
69
+ [*.md]
70
+ # WHY: Keep Markdown clean; use explicit <br> for hard line breaks.
71
+ indent_size = 2
72
+ trim_trailing_whitespace = true
73
+
74
+ [*.qmd]
75
+ # WHY: Quarto Markdown follows Markdown-style formatting.
76
+ indent_size = 2
77
+ indent_style = space
78
+
79
+ [*.rst]
80
+ # WHY: reStructuredText documentation benefits from stable 2-space indentation.
81
+ indent_size = 2
82
+ indent_style = space
83
+
84
+ [*.{bib,cls,sty,tex,typ}]
85
+ # WHY: LaTeX, BibTeX, and Typst source use a stable 2-space convention.
86
+ indent_size = 2
87
+ indent_style = space
88
+
89
+ [*.{css,html,xml}]
90
+ # WHY: Web and XML markup convention is 2 spaces.
91
+ indent_size = 2
92
+ indent_style = space
93
+
94
+
95
+ # === Configuration and structured text ===
96
+
97
+ [*.env]
98
+ # WHY: Environment templates should remain simple line-oriented text.
99
+ indent_size = 2
100
+ indent_style = space
101
+
102
+ [*.{cfg,ini}]
103
+ # WHY: INI-style configuration convention is 2 spaces.
104
+ indent_size = 2
105
+ indent_style = space
106
+
107
+ [*.{json,jsonc,jsonl,ndjson}]
108
+ # WHY: JSON tooling typically expects 2 spaces.
109
+ indent_size = 2
110
+ indent_style = space
111
+
112
+ [*.toml]
113
+ # WHY: TOML often follows 4-space indentation in many projects.
114
+ indent_size = 4
115
+ indent_style = space
116
+
117
+ [*.{yaml,yml}]
118
+ # WHY: YAML convention is 2 spaces.
119
+ indent_size = 2
120
+ indent_style = space
121
+
122
+
123
+ # === Programming languages and scripts ===
124
+
125
+ [*.{bat,cmd}]
126
+ # WHY: Windows batch and command scripts use a simple 2-space shared baseline.
127
+ indent_size = 2
128
+ indent_style = space
129
+
130
+ [*.{bash,sh}]
131
+ # WHY: Shell script convention is 2 spaces.
132
+ indent_size = 2
133
+ indent_style = space
134
+
135
+ [*.{c,cpp,cs,go,h,hpp,java,rs}]
136
+ # WHY: Many C-family and systems languages commonly use 4 spaces.
137
+ indent_size = 4
138
+ indent_style = space
139
+
140
+ [*.jl]
141
+ # WHY: Julia convention commonly uses 4 spaces.
142
+ indent_size = 4
143
+ indent_style = space
144
+
145
+ [*.{cjs,js,jsx,mjs,ts,tsx}]
146
+ # WHY: JavaScript and TypeScript ecosystems commonly use 2 spaces.
147
+ indent_size = 2
148
+ indent_style = space
149
+
150
+ [*.mojo]
151
+ # WHY: Mojo uses Python-like syntax and commonly follows 4-space indentation.
152
+ indent_size = 4
153
+ indent_style = space
154
+
155
+ [*.ps1]
156
+ # WHY: PowerShell convention is 4 spaces.
157
+ indent_size = 4
158
+ indent_style = space
159
+
160
+ [*.{py,pyi}]
161
+ # WHY: Python convention is 4 spaces.
162
+ indent_size = 4
163
+ indent_style = space
164
+
165
+ [*.{r,R}]
166
+ # WHY: R convention commonly uses 2 spaces.
167
+ indent_size = 2
168
+ indent_style = space
169
+
170
+ [*.sql]
171
+ # WHY: SQL formatting varies, but 2 spaces is a stable shared baseline.
172
+ indent_size = 2
173
+ indent_style = space
174
+
175
+
176
+ # === Formal, math, and proof languages ===
177
+
178
+ [*.lean]
179
+ # WHY: Lean 4 convention is 2 spaces; matches Mathlib and stdlib style.
180
+ indent_size = 2
181
+ indent_style = space
182
+
183
+
184
+ # === Notebooks ===
185
+
186
+ [*.ipynb]
187
+ # WHY: Jupyter notebooks are JSON documents; keep embedded formatting stable.
188
+ indent_size = 2
189
+ indent_style = space
190
+
191
+
192
+ # === Text and tabular data ===
193
+
194
+ [*.{csv,dat,psv,tsv,txt,ged}]
195
+ # WHY: Text and tabular data should remain simple line-oriented text.
196
+ indent_size = 2
197
+ indent_style = space
@@ -0,0 +1,209 @@
1
+ # ============================================================
2
+ # .gitattributes (ALL-REPOS)
3
+ # ============================================================
4
+ # Updated: 2026-09-25
5
+ #
6
+ # REQ: All professional GitHub repositories SHOULD include .gitattributes.
7
+ # WHY: Keep line endings, diffs, merges, and file classification consistent
8
+ # across Windows, macOS, Linux, GitHub Actions, and other environments.
9
+ # CUSTOM: Add repository-specific rules when files require different handling.
10
+ # Git attributes: https://git-scm.com/docs/gitattributes
11
+
12
+
13
+ # === Core defaults ===
14
+
15
+ # WHY: Auto-detect text files and normalize text to LF unless a later rule
16
+ # is more specific.
17
+ * text=auto eol=lf
18
+
19
+
20
+ # === Named root and metadata files ===
21
+
22
+ # WHY: Important repository metadata files are text and should use LF.
23
+ .gitattributes text eol=lf
24
+ .gitignore text eol=lf
25
+ .editorconfig text eol=lf
26
+ .python-version text eol=lf
27
+ CODEOWNERS text eol=lf
28
+ LICENSE text eol=lf
29
+ uv.lock text eol=lf
30
+
31
+
32
+ # === Operating-system files ===
33
+
34
+ # WHY: OS metadata files are binary/noisy and should not be normalized or diffed.
35
+ .DS_Store binary
36
+ Thumbs.db binary
37
+ desktop.ini binary
38
+
39
+
40
+ # === Markup and documentation ===
41
+
42
+ # WHY: Documentation, web, and math markup use LF for stable cross-platform diffs.
43
+ *.bib text eol=lf
44
+ *.cff text eol=lf
45
+ *.cls text eol=lf
46
+ *.css text eol=lf
47
+ *.html text eol=lf
48
+ *.md text eol=lf
49
+ *.qmd text eol=lf
50
+ *.rst text eol=lf
51
+ *.sty text eol=lf
52
+ *.tex text eol=lf
53
+ *.typ text eol=lf
54
+ *.xml text eol=lf
55
+
56
+
57
+ # === Configuration and structured text ===
58
+
59
+ # WHY: Configuration and structured text files should produce stable diffs.
60
+ *.cfg text eol=lf
61
+ *.env text eol=lf
62
+ *.ini text eol=lf
63
+ *.json text eol=lf
64
+ *.jsonc text eol=lf
65
+ *.jsonl text eol=lf
66
+ *.ndjson text eol=lf
67
+ *.toml text eol=lf
68
+ *.txt text eol=lf
69
+ *.yaml text eol=lf
70
+ *.yml text eol=lf
71
+
72
+
73
+ # === Programming languages and scripts ===
74
+
75
+ # WHY: Source and script files use LF for CI, shells, containers, and tooling.
76
+ *.c text eol=lf
77
+ *.cpp text eol=lf
78
+ *.cs text eol=lf
79
+ *.go text eol=lf
80
+ *.h text eol=lf
81
+ *.hpp text eol=lf
82
+ *.java text eol=lf
83
+ *.jl text eol=lf
84
+ *.js text eol=lf
85
+ *.jsx text eol=lf
86
+ *.mjs text eol=lf
87
+ *.cjs text eol=lf
88
+ *.mojo text eol=lf
89
+ *.ps1 text eol=lf
90
+ *.py text eol=lf
91
+ *.pyi text eol=lf
92
+ *.r text eol=lf
93
+ *.R text eol=lf
94
+ *.rs text eol=lf
95
+ *.sh text eol=lf
96
+ *.sql text eol=lf
97
+ *.ts text eol=lf
98
+ *.tsx text eol=lf
99
+
100
+ # WHY: Windows batch scripts conventionally use CRLF and may be consumed by
101
+ # Windows tooling that expects Windows-style line endings.
102
+ *.bat text eol=crlf
103
+ *.cmd text eol=crlf
104
+
105
+
106
+ # === Formal, math, and proof languages ===
107
+
108
+ # WHY: Lean source files are text; Lean build artifacts are binary.
109
+ *.ilean binary
110
+ *.lean text eol=lf
111
+ *.olean binary
112
+ *.trace binary
113
+
114
+ # WHY: Lake build output should not be normalized if accidentally tracked.
115
+ .lake/** binary
116
+
117
+
118
+ # === Notebooks ===
119
+
120
+ # WHY: Jupyter notebooks are JSON-based text files and benefit from stable
121
+ # cross-platform line endings.
122
+ *.ipynb text eol=lf
123
+
124
+
125
+ # === Text and tabular data ===
126
+
127
+ # WHY: Small text data files benefit from readable diffs.
128
+ *.csv text eol=lf
129
+ *.dat text eol=lf
130
+ *.psv text eol=lf
131
+ *.tsv text eol=lf
132
+
133
+
134
+ # === Images and web binary assets ===
135
+
136
+ # WHY: Image and compiled web asset formats are binary; text diffs are not meaningful.
137
+ *.avif binary
138
+ *.bmp binary
139
+ *.gif binary
140
+ *.ico binary
141
+ *.jpeg binary
142
+ *.jpg binary
143
+ *.png binary
144
+ *.webp binary
145
+ *.wasm binary
146
+
147
+ # WHY: SVG is XML-based text and benefits from readable diffs.
148
+ *.svg text eol=lf
149
+
150
+
151
+ # === Databases ===
152
+
153
+ # WHY: Database files are binary; text diffs are not meaningful.
154
+ *.db binary
155
+ *.duckdb binary
156
+ *.sqlite binary
157
+ *.sqlite3 binary
158
+
159
+
160
+ # === Columnar and analytical data ===
161
+
162
+ # WHY: Columnar and analytical formats are binary; text diffs are not meaningful.
163
+ *.arrow binary
164
+ *.avro binary
165
+ *.feather binary
166
+ *.orc binary
167
+ *.parquet binary
168
+
169
+
170
+ # === Office, BI, PDF, and compressed artifacts ===
171
+
172
+ # WHY: Office, BI, PDF, and archive files are binary.
173
+ *.7z binary
174
+ *.bz2 binary
175
+ *.doc binary
176
+ *.docx binary
177
+ *.gz binary
178
+ *.odp binary
179
+ *.ods binary
180
+ *.odt binary
181
+ *.pbix binary
182
+ *.pbit binary
183
+ *.pdf binary
184
+ *.ppt binary
185
+ *.pptx binary
186
+ *.rar binary
187
+ *.tar binary
188
+ *.tgz binary
189
+ *.xls binary
190
+ *.xlsm binary
191
+ *.xlsx binary
192
+ *.xz binary
193
+ *.zip binary
194
+
195
+
196
+ # === Logs and generated runtime output ===
197
+
198
+ # WHY: Logs are text when intentionally committed and should remain readable
199
+ # and diffable.
200
+ # NOTE: Most logs are ignored by .gitignore. Repository-specific research
201
+ # evidence may override text normalization with -text when exact bytes matter.
202
+ *.log text eol=lf
203
+
204
+
205
+ # === GitHub metadata and UI ===
206
+
207
+ # WHY: Exclude documentation and tests from GitHub language statistics.
208
+ docs/** linguist-documentation
209
+ tests/** linguist-documentation
@@ -0,0 +1,31 @@
1
+ # ============================================================
2
+ # .github/.yamllint.yml (ALL-REPOS)
3
+ # ============================================================
4
+ # Updated: 2026-09-25
5
+ #
6
+ # REQ: All repositories with YAML SHOULD lint YAML files
7
+ # to keep them clean and consistent.
8
+ # WHY: Detect malformed YAML, duplicate keys, indentation errors, trailing
9
+ # whitespace, and other structural problems before they reach CI/CD tooling.
10
+ # ALT: Style-only rules that create noise without improving correctness are
11
+ # intentionally relaxed for GitHub Actions and shared project configuration.
12
+ # yamllint: https://yamllint.readthedocs.io/
13
+
14
+ extends: default
15
+
16
+ rules:
17
+ # WHY: Workflow expressions, URLs, commands, and generated values can
18
+ # legitimately exceed an arbitrary line-length limit.
19
+ line-length: disable
20
+
21
+ # WHY: Repository YAML files do not require an explicit YAML document marker.
22
+ document-start: disable
23
+
24
+ # WHY: Comment layout is documentation style rather than YAML correctness.
25
+ comments: disable
26
+
27
+ # WHY: GitHub Actions uses `on` as a mapping key. Under YAML 1.1 semantics,
28
+ # yamllint may otherwise treat that key as a truthy value.
29
+ # WHY: Keep truthy-value checking for actual values while excluding keys.
30
+ truthy:
31
+ check-keys: false
@@ -0,0 +1,47 @@
1
+ # ============================================================
2
+ # .github/dependabot.yml (ALL-REPOS)
3
+ # ============================================================
4
+ # Updated: 2026-09-25
5
+ #
6
+ # REQ: All repositories SHOULD track GitHub Actions updates automatically.
7
+ # WHY: GitHub Actions are executable dependencies and may receive security,
8
+ # reliability, or behavior updates.
9
+ # OBS: Language-level dependencies (for example, Python packages) are upgraded
10
+ # manually using the project's package-management workflow.
11
+ # OBS: GitHub Actions are the only dependency class automated here.
12
+ # ALT: Dependabot version updates may be omitted when Actions are pinned and
13
+ # reviewed manually through another established maintenance process.
14
+ # CUSTOM: Adjust the schedule when repository activity or security posture
15
+ # warrants a different review cadence.
16
+ #
17
+ # NOTE: Dependabot updates GitHub Actions references used in workflow files,
18
+ # including Actions pinned to full commit SHAs.
19
+ # NOTE: When a pinned Action has a version comment on the same line, Dependabot
20
+ # can update that documentation along with the commit reference.
21
+ # NOTE: Dependabot security updates are distinct from scheduled version updates
22
+ # and can raise pull requests for vulnerable Actions when enabled in GitHub.
23
+ #
24
+ # Dependabot:
25
+ # https://docs.github.com/code-security/dependabot
26
+
27
+ version: 2
28
+
29
+ updates:
30
+ - package-ecosystem: "github-actions"
31
+
32
+ # WHY: "/" tells Dependabot to inspect GitHub Actions workflows for this
33
+ # repository.
34
+ directory: "/"
35
+
36
+ schedule:
37
+ # WHY: Weekly checks keep executable CI dependencies reasonably current
38
+ # without creating daily maintenance noise.
39
+ interval: "weekly"
40
+
41
+ commit-message:
42
+ # WHY: Use a recognizable dependency prefix for filtering and history.
43
+ prefix: "(deps)"
44
+
45
+ cooldown:
46
+ default-days: 7
47
+ # WHY: Match the 7-day cooldown used by uv exclude-newer and prek.
@@ -0,0 +1,88 @@
1
+ # ============================================================
2
+ # .github/lychee.toml (ALL-REPOS)
3
+ # ============================================================
4
+ # Updated: 2026-09-25
5
+ #
6
+ # REQ: Repositories with documentation SHOULD check links automatically.
7
+ # WHY: Broken links reduce the reliability and reproducibility of documentation,
8
+ # references, instructions, and external resources.
9
+ # REQ: Link checking MUST be reliable and CI-safe.
10
+ # WHY: Configuration should detect genuinely broken links while minimizing
11
+ # false failures caused by rate limiting, authentication, and anti-bot services.
12
+ # OBS: Lychee configuration uses a flat structure for these options.
13
+ # OBS: Repository-specific path exclusions should be added only when needed.
14
+ # CUSTOM: Add exclusions only for links or paths that are known to be unsuitable
15
+ # for automated checking.
16
+ #
17
+ # Lychee: https://lychee.cli.rs/
18
+
19
+ # === Output ===
20
+
21
+ # WHY: Provide enough information to diagnose failures without excessive CI noise.
22
+ verbose = "info"
23
+
24
+ # WHY: Interactive progress bars are not useful in CI logs.
25
+ no_progress = true
26
+
27
+ # === Request reliability ===
28
+
29
+ # WHY: Limit parallel requests so CI does not overwhelm external servers.
30
+ max_concurrency = 6
31
+
32
+ # WHY: Retry transient network failures before declaring a link broken.
33
+ max_retries = 3
34
+
35
+ # WHY: Allow transient rate limits or service interruptions time to clear.
36
+ retry_wait_time = 8
37
+
38
+ # WHY: Prevent an unresponsive external service from blocking the workflow indefinitely.
39
+ timeout = 30
40
+
41
+ # === Accepted HTTP responses ===
42
+
43
+ # WHY: Accept common status codes that don't indicate broken links
44
+ # OBS: 403 and 429 reduce false positives
45
+ accept = [
46
+ "200..=299", # OK, partial content, etc.
47
+ 301, # Moved permanently
48
+ 302, # Found (temporary redirect)
49
+ 307, # Temporary redirect
50
+ 308, # Permanent redirect
51
+ 403, # Forbidden (often false positive)
52
+ 429, # Too many requests (rate limiting)
53
+ ]
54
+
55
+ # === Network exclusions ===
56
+
57
+ # WHY: Localhost and loopback URLs describe local development services and are
58
+ # not expected to resolve from GitHub Actions.
59
+ exclude_loopback = true
60
+
61
+ # === URL exclusions ===
62
+
63
+ # WHY: Exclude external services known to block or interfere with automated
64
+ # link-checking requests.
65
+ # NOTE: Values are regular expressions matched against URLs.
66
+ exclude = [
67
+ "^https://shields\\.io", # WHY: Shields.io badges often have anti-bot measures that cause false positives
68
+ "^https://img\\.shields\\.io", # WHY: Shields.io image badges often have anti-bot measures that cause false positives
69
+ "^https://badges\\.github\\.com", # WHY: GitHub badges often have anti-bot measures that cause false positives
70
+ "^https://www\\.linkedin\\.com", # WHY: LinkedIn often blocks automated requests, causing false positives
71
+ "example\\.com", # WHY: Exclude example domains in documentation
72
+ "localhost", # WHY: Exclude local development URLs
73
+ "127\\.0\\.0\\.1", # WHY: Exclude local loopback
74
+ "\\.local", # WHY: Exclude local network domains
75
+ ]
76
+
77
+ # === Path exclusions ===
78
+
79
+ # WHY: Exclude paths not relevant for link checking.
80
+ # NOTE: These names are used by the shared template repository and are harmless
81
+ # in repositories that do not contain matching paths.
82
+ exclude_path = [
83
+ "ALL",
84
+ "ALL-PY",
85
+ "ALL-PY-SRC",
86
+ "ALL-COURSE",
87
+ "ALL-COURSE-PY-SRC",
88
+ ]