seif-cli 0.4.3__tar.gz → 0.5.1__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 (114) hide show
  1. {seif_cli-0.4.3/src/seif_cli.egg-info → seif_cli-0.5.1}/PKG-INFO +24 -15
  2. {seif_cli-0.4.3 → seif_cli-0.5.1}/README.md +23 -14
  3. {seif_cli-0.4.3 → seif_cli-0.5.1}/pyproject.toml +5 -1
  4. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/analysis/stance_detector.py +43 -4
  5. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/cli/cli.py +659 -0
  6. seif_cli-0.5.1/src/seif/cli/setup.py +443 -0
  7. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/cli/wrapper.py +293 -34
  8. seif_cli-0.5.1/src/seif/context/host_init.py +319 -0
  9. seif_cli-0.5.1/src/seif/context/model_probe.py +319 -0
  10. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/context/registry.py +126 -0
  11. seif_cli-0.5.1/src/seif/plugins/__init__.py +0 -0
  12. seif_cli-0.5.1/src/seif/plugins/claude-code/hooks/hooks.json +50 -0
  13. seif_cli-0.5.1/src/seif/plugins/claude-code/scripts/circuit-check.sh +34 -0
  14. seif_cli-0.5.1/src/seif/plugins/claude-code/scripts/circuit-monitor.py +223 -0
  15. seif_cli-0.5.1/src/seif/plugins/claude-code/scripts/classification-gate.sh +141 -0
  16. seif_cli-0.5.1/src/seif/plugins/claude-code/scripts/kernel-seed.py +95 -0
  17. seif_cli-0.5.1/src/seif/plugins/claude-code/scripts/orchestra-probe.py +40 -0
  18. seif_cli-0.5.1/src/seif/plugins/claude-code/scripts/quality-gate.sh +35 -0
  19. seif_cli-0.5.1/src/seif/plugins/claude-code/scripts/session-end.sh +182 -0
  20. seif_cli-0.5.1/src/seif/plugins/claude-code/scripts/session-start.sh +262 -0
  21. seif_cli-0.5.1/src/seif/plugins/claude-code/skills/gate/SKILL.md +18 -0
  22. seif_cli-0.5.1/src/seif/plugins/claude-code/skills/status/SKILL.md +54 -0
  23. seif_cli-0.5.1/src/seif/plugins/claude-code/skills/sync/SKILL.md +17 -0
  24. {seif_cli-0.4.3 → seif_cli-0.5.1/src/seif_cli.egg-info}/PKG-INFO +24 -15
  25. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif_cli.egg-info/SOURCES.txt +20 -0
  26. seif_cli-0.5.1/tests/test_audit_host.py +108 -0
  27. seif_cli-0.5.1/tests/test_host_init.py +163 -0
  28. seif_cli-0.5.1/tests/test_model_probe.py +147 -0
  29. seif_cli-0.5.1/tests/test_rebuild_registry.py +154 -0
  30. {seif_cli-0.4.3 → seif_cli-0.5.1}/tests/test_stance_detector.py +49 -0
  31. {seif_cli-0.4.3 → seif_cli-0.5.1}/LICENSE +0 -0
  32. {seif_cli-0.4.3 → seif_cli-0.5.1}/MANIFEST.in +0 -0
  33. {seif_cli-0.4.3 → seif_cli-0.5.1}/setup.cfg +0 -0
  34. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/__init__.py +0 -0
  35. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/__main__.py +0 -0
  36. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/analysis/__init__.py +0 -0
  37. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/analysis/physical_constants.py +0 -0
  38. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/analysis/quality_gate.py +0 -0
  39. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/analysis/transcompiler.py +0 -0
  40. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/bridge/__init__.py +0 -0
  41. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/bridge/native_client.py +0 -0
  42. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/bridge/telegram_bot.py +0 -0
  43. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/cli/__init__.py +0 -0
  44. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/cli/__main__.py +0 -0
  45. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/cli/chat.py +0 -0
  46. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/cli/identity.py +0 -0
  47. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/cli/main.py +0 -0
  48. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/cli/resonance_display.py +0 -0
  49. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/cli/serve.py +0 -0
  50. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/cli/serve_v2.py +0 -0
  51. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/constants.py +0 -0
  52. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/context/__init__.py +0 -0
  53. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/context/advisor.py +0 -0
  54. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/context/code_compressor.py +0 -0
  55. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/context/context_bridge.py +0 -0
  56. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/context/context_importer.py +0 -0
  57. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/context/context_manager.py +0 -0
  58. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/context/context_qr.py +0 -0
  59. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/context/cycle.py +0 -0
  60. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/context/file_extractor.py +0 -0
  61. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/context/git_context.py +0 -0
  62. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/context/git_hooks.py +0 -0
  63. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/context/ingest.py +0 -0
  64. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/context/nucleus.py +0 -0
  65. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/context/ref.py +0 -0
  66. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/context/seif_io.py +0 -0
  67. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/context/sessions.py +0 -0
  68. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/context/workspace.py +0 -0
  69. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/core/__init__.py +0 -0
  70. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/core/fingerprint.py +0 -0
  71. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/core/resonance_encoding.py +0 -0
  72. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/core/resonance_gate.py +0 -0
  73. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/core/resonance_signal.py +0 -0
  74. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/core/signing.py +0 -0
  75. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/core/timestamping.py +0 -0
  76. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/core/transfer_function.py +0 -0
  77. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/core/triple_gate.py +0 -0
  78. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/data/RESONANCE.json +0 -0
  79. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/data/__init__.py +0 -0
  80. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/data/defaults/__init__.py +0 -0
  81. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/data/defaults/circuit-recovery-v1.seif +0 -0
  82. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/data/defaults/definitions-v1.seif +0 -0
  83. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/data/defaults/ise-dissonance-v1.seif +0 -0
  84. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/data/defaults/multi-agent-sync-v1.seif +0 -0
  85. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/data/defaults/onboarding.seif +0 -0
  86. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/data/defaults/partial-attention-axiom-v1.seif +0 -0
  87. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/data/defaults/seif-cycle-v1.seif +0 -0
  88. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/data/defaults/seif-os-architecture-v1.seif +0 -0
  89. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/data/defaults/triad-convergence-v1.seif +0 -0
  90. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/data/paths.py +0 -0
  91. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/security/__init__.py +0 -0
  92. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif/security/mode.py +0 -0
  93. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif_cli.egg-info/dependency_links.txt +0 -0
  94. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif_cli.egg-info/entry_points.txt +0 -0
  95. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif_cli.egg-info/requires.txt +0 -0
  96. {seif_cli-0.4.3 → seif_cli-0.5.1}/src/seif_cli.egg-info/top_level.txt +0 -0
  97. {seif_cli-0.4.3 → seif_cli-0.5.1}/tests/test_advisor.py +0 -0
  98. {seif_cli-0.4.3 → seif_cli-0.5.1}/tests/test_canonical_inputs.py +0 -0
  99. {seif_cli-0.4.3 → seif_cli-0.5.1}/tests/test_code_compressor.py +0 -0
  100. {seif_cli-0.4.3 → seif_cli-0.5.1}/tests/test_collaborative_seif.py +0 -0
  101. {seif_cli-0.4.3 → seif_cli-0.5.1}/tests/test_context_qr.py +0 -0
  102. {seif_cli-0.4.3 → seif_cli-0.5.1}/tests/test_context_repo.py +0 -0
  103. {seif_cli-0.4.3 → seif_cli-0.5.1}/tests/test_git_context.py +0 -0
  104. {seif_cli-0.4.3 → seif_cli-0.5.1}/tests/test_git_hooks.py +0 -0
  105. {seif_cli-0.4.3 → seif_cli-0.5.1}/tests/test_init.py +0 -0
  106. {seif_cli-0.4.3 → seif_cli-0.5.1}/tests/test_quality_gate.py +0 -0
  107. {seif_cli-0.4.3 → seif_cli-0.5.1}/tests/test_ref.py +0 -0
  108. {seif_cli-0.4.3 → seif_cli-0.5.1}/tests/test_registry.py +0 -0
  109. {seif_cli-0.4.3 → seif_cli-0.5.1}/tests/test_resonance_gate.py +0 -0
  110. {seif_cli-0.4.3 → seif_cli-0.5.1}/tests/test_seif_io.py +0 -0
  111. {seif_cli-0.4.3 → seif_cli-0.5.1}/tests/test_transcompiler.py +0 -0
  112. {seif_cli-0.4.3 → seif_cli-0.5.1}/tests/test_transfer_function.py +0 -0
  113. {seif_cli-0.4.3 → seif_cli-0.5.1}/tests/test_triple_gate.py +0 -0
  114. {seif_cli-0.4.3 → seif_cli-0.5.1}/tests/test_workspace.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: seif-cli
3
- Version: 0.4.3
3
+ Version: 0.5.1
4
4
  Summary: Measure AI output quality, protect sensitive data, watch your AI environment resonate. Quality Gate, Classification, Sentinel & Auto-Healing, SEIF OS.
5
5
  Author: André Cunha Antero de Carvalho
6
6
  License: CC-BY-NC-SA-4.0
@@ -184,29 +184,38 @@ open https://seifprotocol.com/auth
184
184
 
185
185
  ```bash
186
186
  pip install seif-cli
187
+ cd your-project
188
+ seif
189
+ ```
187
190
 
188
- # Works immediately (no backend)
189
- seif --quality-gate "Python 3.11 added tomllib" --role ai
190
- seif --gate "SELECT * FROM users WHERE api_key = 'sk-...'"
191
- seif --encode "any text"
191
+ That's it. One command. SEIF detects that your project is new, initializes `.seif/` context, installs Claude Code hooks, and launches Claude — all automatically.
192
192
 
193
- # With SEIF OS running
194
- seif serve --v2
195
- seif --init # scan project, generate .seif/
196
- seif --sync # re-sync git context
197
- ```
193
+ On subsequent runs, `seif` sees everything is configured and launches Claude directly.
194
+
195
+ ### What happens
196
+
197
+ | Event | What SEIF does |
198
+ |-------|---------------|
199
+ | Session starts | Loads `.seif/` context — your AI remembers |
200
+ | AI writes code | Classification gate blocks credential leaks |
201
+ | AI finishes writing | Quality gate measures stance (GROUNDED vs DRIFT) |
202
+ | You type `/gate` | Measures any text (Grade A-F) |
203
+ | You type `/sync` | Re-syncs project context |
204
+ | You type `/status` | Shows loaded modules and integration health |
198
205
 
199
206
  ---
200
207
 
201
- ## Claude Code Plugin
208
+ ## Claude Code Integration
202
209
 
203
210
  ```bash
204
- cp -r plugins/claude-code/skills/* .claude/skills/
211
+ seif setup claude-code # one command — installs everything
212
+ seif setup --status # verify integration
213
+ seif setup --uninstall # clean removal
205
214
  ```
206
215
 
207
- - **Session start**: loads `.seif/` context automatically
208
- - **Pre-write**: blocks classified data from being written outside `.seif/`
209
- - **Slash commands**: `/gate`, `/sync`, `/status`
216
+ Installs **hooks** (session lifecycle, classification gate, quality gate) and **skills** (`/gate`, `/sync`, `/status`) into Claude Code. Works globally or per-project (`--project`).
217
+
218
+ > **Full guide**: [docs/QUICKSTART.md](docs/QUICKSTART.md) everything a developer needs to get started.
210
219
 
211
220
  ---
212
221
 
@@ -140,29 +140,38 @@ open https://seifprotocol.com/auth
140
140
 
141
141
  ```bash
142
142
  pip install seif-cli
143
+ cd your-project
144
+ seif
145
+ ```
143
146
 
144
- # Works immediately (no backend)
145
- seif --quality-gate "Python 3.11 added tomllib" --role ai
146
- seif --gate "SELECT * FROM users WHERE api_key = 'sk-...'"
147
- seif --encode "any text"
147
+ That's it. One command. SEIF detects that your project is new, initializes `.seif/` context, installs Claude Code hooks, and launches Claude — all automatically.
148
148
 
149
- # With SEIF OS running
150
- seif serve --v2
151
- seif --init # scan project, generate .seif/
152
- seif --sync # re-sync git context
153
- ```
149
+ On subsequent runs, `seif` sees everything is configured and launches Claude directly.
150
+
151
+ ### What happens
152
+
153
+ | Event | What SEIF does |
154
+ |-------|---------------|
155
+ | Session starts | Loads `.seif/` context — your AI remembers |
156
+ | AI writes code | Classification gate blocks credential leaks |
157
+ | AI finishes writing | Quality gate measures stance (GROUNDED vs DRIFT) |
158
+ | You type `/gate` | Measures any text (Grade A-F) |
159
+ | You type `/sync` | Re-syncs project context |
160
+ | You type `/status` | Shows loaded modules and integration health |
154
161
 
155
162
  ---
156
163
 
157
- ## Claude Code Plugin
164
+ ## Claude Code Integration
158
165
 
159
166
  ```bash
160
- cp -r plugins/claude-code/skills/* .claude/skills/
167
+ seif setup claude-code # one command — installs everything
168
+ seif setup --status # verify integration
169
+ seif setup --uninstall # clean removal
161
170
  ```
162
171
 
163
- - **Session start**: loads `.seif/` context automatically
164
- - **Pre-write**: blocks classified data from being written outside `.seif/`
165
- - **Slash commands**: `/gate`, `/sync`, `/status`
172
+ Installs **hooks** (session lifecycle, classification gate, quality gate) and **skills** (`/gate`, `/sync`, `/status`) into Claude Code. Works globally or per-project (`--project`).
173
+
174
+ > **Full guide**: [docs/QUICKSTART.md](docs/QUICKSTART.md) everything a developer needs to get started.
166
175
 
167
176
  ---
168
177
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "seif-cli"
7
- version = "0.4.3"
7
+ version = "0.5.1"
8
8
  description = "Measure AI output quality, protect sensitive data, watch your AI environment resonate. Quality Gate, Classification, Sentinel & Auto-Healing, SEIF OS."
9
9
  readme = "README.md"
10
10
  license = {text = "CC-BY-NC-SA-4.0"}
@@ -85,6 +85,10 @@ seif = [
85
85
  "py.typed",
86
86
  "data/RESONANCE.json",
87
87
  "data/defaults/*.seif",
88
+ "plugins/claude-code/hooks/*.json",
89
+ "plugins/claude-code/scripts/*.sh",
90
+ "plugins/claude-code/scripts/*.py",
91
+ "plugins/claude-code/skills/*/SKILL.md",
88
92
  ]
89
93
 
90
94
  [tool.pytest.ini_options]
@@ -55,8 +55,15 @@ class StanceAnalysis:
55
55
  return "\n".join(lines)
56
56
 
57
57
 
58
- # Patterns that indicate verifiable content
58
+ # Patterns that indicate verifiable content.
59
+ # Two groups: (1) original physics/EE/math patterns, (2) software-engineering
60
+ # verifiable artifacts added by the s14 calibration debate (semver, SHAs,
61
+ # file:line refs, test counts, ISO timestamps, PR refs, code identifiers, etc.).
62
+ # The split exists because session summaries are dense in (2) and were scoring
63
+ # F as "low data" before. Calibrated against 27 positive + 14 negative samples
64
+ # at 100% recall / 0% false positives.
59
65
  VERIFIABLE_PATTERNS = [
66
+ # --- Group 1: physics / EE / math ---
60
67
  r'\d+\.?\d*\s*(%|Hz|Ω|ohm|mH|μF|uF|nF|pF|dB|°|deg|rad|ms|kHz|MHz|V|A|W|bpm|rpm)',
61
68
  r'[=≈≠<>]\s*\d',
62
69
  r'[ζφωπ√]',
@@ -69,9 +76,41 @@ VERIFIABLE_PATTERNS = [
69
76
  r'\b(?:theorem|proof|exhaustive|brute.?force)\b',
70
77
  r'(?:ISE|IAE|ITAE|RLC|PCB|BOM|DRC)',
71
78
  r'formal.?symbolic',
72
- r'\b\w+[_]\w+\s*=', # variable_name = (e.g. f_peak = f_n/2)
73
- r'\b[A-Z]\([a-z]\)', # H(s), F(x), G(s)
74
- r'property|unique|halving', # mathematical property language
79
+ r'\b\w+[_]\w+\s*=', # variable_name = ...
80
+ r'\b[A-Z]\([a-z]\)', # H(s), F(x)
81
+ r'property|unique|halving', # math property language
82
+
83
+ # --- Group 2: software-engineering verifiable artifacts ---
84
+ r'\bv?\d+\.\d+\.\d+(?:[-+][\w.]+)?\b', # semver
85
+ r'\b(?:commit|tag|branch|sha|hash|merge|revert|cherry-?pick|HEAD)\s+[0-9a-f]{7,12}\b', # short SHA in context
86
+ r'\b[0-9a-f]{40}\b', # long SHA
87
+ r'\b(?:sha\d{2,3}|md5|blake[23]b?):[0-9a-f]{16,128}\b', # prefixed digest
88
+ r'\b[\w./-]+\.(?:py|ts|tsx|js|jsx|go|rs|java|cpp|c|h|hpp|md|json|yaml|yml|toml|sh|rb|php|cs|kt|swift|sql|html|css|scss):\d+(?:-\d+)?\b', # file:line
89
+ r'(?:#|\b)L\d+(?:-L?\d+)?\b', # GitHub line anchors
90
+ r'\b\d+\s+(?:tests?|specs?|suites?|cases?|assertions?|examples?)\b\s*(?:passing|failing|skipped|pending|run|across|in)?', # test count fwd
91
+ r'\b(?:tests?|specs?|suites?|cases?|assertions?|examples?)\s+(?:passing|failing|skipped|pending)?\s*(?:is|are|were|equals?|=)\s+\d+\b', # test count inv
92
+ r'\b(?:added|removed|deleted|modified|fixed|merged|reverted|created|closed|reopened|broke|patched|migrated)\s+\d+\b', # eng verb + count
93
+ r'\b\d{4}-\d{2}-\d{2}(?:[T ]\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?(?:Z|[+-]\d{2}:?\d{2})?)?\b', # ISO 8601
94
+ r'(?<!\w)(?:#\d+|(?:PR|GH|MR|RFC|RFD|ISSUE|JIRA|[A-Z]{2,8})-\d+)\b', # PR / issue refs
95
+ r'\b(?:returns?|status|code|HTTP|got|expected|received|responded\s+with)\s+(?:1\d{2}|2\d{2}|3\d{2}|4\d{2}|5\d{2})\b', # HTTP verb-prefixed
96
+ r'\b(?:1\d{2}|2\d{2}|3\d{2}|4\d{2}|5\d{2})\s+(?:OK|Created|Accepted|No\s+Content|Moved|Found|Bad\s+Request|Unauthorized|Forbidden|Not\s+Found|Conflict|Gone|Too\s+Many|Internal\s+Server|Bad\s+Gateway|Service\s+Unavailable|Gateway\s+Timeout)\b', # HTTP code + reason
97
+ r'(?:^|[\s(\[])(?:localhost|127\.0\.0\.1|0\.0\.0\.0|::1)?:(?:[1-9]\d{0,4})\b', # port number
98
+ r'\b[\w.-]+@\^?\d+\.\d+(?:\.\d+)?(?:[-+][\w.]+)?\b', # package@version
99
+ r'\b[a-z][a-z0-9_]+\([^)]{0,80}\)', # snake_case(...)
100
+ r'\b[A-Z][a-zA-Z0-9]+\([^)]{0,80}\)', # PascalCase(...)
101
+ r'\b\w+\.\w+\([^)]{0,80}\)', # foo.bar(...)
102
+ r'[+\-−]\d+\s*(?:[/,]\s*[+\-−]\d+|lines?|loc)?', # diff stats
103
+ r'\bexit(?:ed|s)?\s+(?:with\s+)?(?:code\s+)?-?\d+\b', # exit code
104
+ r'\breturn\s+code\s+-?\d+\b', # return code
105
+ r'\b\d+(?:\.\d+)?\s*(?:[KMGTP]i?B|bytes?|kbps|Mbps|Gbps)\b', # size with unit
106
+ r'\b\d+(?:\.\d+)?\s*(?:ns|us|μs|ms|min|sec|hr|hrs|hours?|minutes?|seconds?)\b', # duration
107
+ r'\b\d+m\s*\d+s\b', # 4m 32s
108
+ r'\b\d+h\s*\d+m\b', # 1h 18m
109
+ r'\b(?:feature|bugfix|hotfix|release|chore|refactor|fix|feat)/[\w./-]+\b', # branch convention
110
+ # File paths — require leading slash, ./, ../, OR dotted extension
111
+ # (rejects casual prose like "production/staging environments").
112
+ r'(?:^|(?<=[\s(\[]))(?:\.{1,2}/|/)[\w-]+(?:/[\w.-]+)+',
113
+ r'\b[\w-]+(?:/[\w.-]+)+\.[a-z]{1,6}\b',
75
114
  ]
76
115
 
77
116
  # Patterns that indicate metaphorical/interpretive drift