data-olympus 0.3.3__tar.gz → 0.3.4__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 (81) hide show
  1. {data_olympus-0.3.3 → data_olympus-0.3.4}/CHANGELOG.md +31 -0
  2. {data_olympus-0.3.3 → data_olympus-0.3.4}/PKG-INFO +1 -1
  3. {data_olympus-0.3.3 → data_olympus-0.3.4}/pyproject.toml +1 -1
  4. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/enforce_policy.py +15 -1
  5. {data_olympus-0.3.3 → data_olympus-0.3.4}/.gitignore +0 -0
  6. {data_olympus-0.3.3 → data_olympus-0.3.4}/LICENSE +0 -0
  7. {data_olympus-0.3.3 → data_olympus-0.3.4}/NOTICE +0 -0
  8. {data_olympus-0.3.3 → data_olympus-0.3.4}/README.md +0 -0
  9. {data_olympus-0.3.3 → data_olympus-0.3.4}/SPEC.md +0 -0
  10. {data_olympus-0.3.3 → data_olympus-0.3.4}/benchmarks/README.md +0 -0
  11. {data_olympus-0.3.3 → data_olympus-0.3.4}/bin/_kb_detect_workspace.sh +0 -0
  12. {data_olympus-0.3.3 → data_olympus-0.3.4}/bin/_kb_enforce.py +0 -0
  13. {data_olympus-0.3.3 → data_olympus-0.3.4}/bin/_kb_fallback.py +0 -0
  14. {data_olympus-0.3.3 → data_olympus-0.3.4}/bin/kb +0 -0
  15. {data_olympus-0.3.3 → data_olympus-0.3.4}/bin/kb-enforce-hook +0 -0
  16. {data_olympus-0.3.3 → data_olympus-0.3.4}/bin/opencode/data-olympus-gate.ts +0 -0
  17. {data_olympus-0.3.3 → data_olympus-0.3.4}/deploy/k8s/README.md +0 -0
  18. {data_olympus-0.3.3 → data_olympus-0.3.4}/deploy/k8s/read-replica/README.md +0 -0
  19. {data_olympus-0.3.3 → data_olympus-0.3.4}/docs/releases/README.md +0 -0
  20. {data_olympus-0.3.3 → data_olympus-0.3.4}/example-bundle/projects/acme-app/README.md +0 -0
  21. {data_olympus-0.3.3 → data_olympus-0.3.4}/example-bundle/projects/acme-app/components/api/README.md +0 -0
  22. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/__init__.py +0 -0
  23. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/audit_log.py +0 -0
  24. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/audit_trailers.py +0 -0
  25. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/auth.py +0 -0
  26. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/cli/__init__.py +0 -0
  27. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/cli/import_cmd.py +0 -0
  28. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/cli/indexgen.py +0 -0
  29. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/cli/main.py +0 -0
  30. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/cli/report_cmd.py +0 -0
  31. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/config.py +0 -0
  32. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/cooccurrence.py +0 -0
  33. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/dedup.py +0 -0
  34. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/durable.py +0 -0
  35. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/embeddings.py +0 -0
  36. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/format/__init__.py +0 -0
  37. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/format/document.py +0 -0
  38. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/format/frontmatter.py +0 -0
  39. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/format/lint.py +0 -0
  40. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/format/validate.py +0 -0
  41. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/git_ops.py +0 -0
  42. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/health.py +0 -0
  43. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/importer/__init__.py +0 -0
  44. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/importer/adr.py +0 -0
  45. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/importer/flat.py +0 -0
  46. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/importer/model.py +0 -0
  47. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/importer/okf.py +0 -0
  48. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/importer/run.py +0 -0
  49. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/importer/stamp.py +0 -0
  50. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/index.py +0 -0
  51. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/markdown_parse.py +0 -0
  52. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/models.py +0 -0
  53. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/onboarding.py +0 -0
  54. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/onboarding_inflight.py +0 -0
  55. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/onboarding_playbook.py +0 -0
  56. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/pending.py +0 -0
  57. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/principals.py +0 -0
  58. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/prompts.py +0 -0
  59. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/push_queue.py +0 -0
  60. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/query_expansion.py +0 -0
  61. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/rate_limit.py +0 -0
  62. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/refresh.py +0 -0
  63. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/report.py +0 -0
  64. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/rest_api.py +0 -0
  65. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/safe_id.py +0 -0
  66. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/search_gate.py +0 -0
  67. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/search_shortcut.py +0 -0
  68. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/server.py +0 -0
  69. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/session_metrics.py +0 -0
  70. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/setup_wizard.py +0 -0
  71. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/thin_pointer.py +0 -0
  72. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/tools_audit.py +0 -0
  73. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/tools_enforce.py +0 -0
  74. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/tools_onboarding.py +0 -0
  75. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/tools_read.py +0 -0
  76. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/tools_write.py +0 -0
  77. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/trigram.py +0 -0
  78. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/viewer/__init__.py +0 -0
  79. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/viewer/generator.py +0 -0
  80. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/worktrees.py +0 -0
  81. {data_olympus-0.3.3 → data_olympus-0.3.4}/src/data_olympus/write_gate.py +0 -0
@@ -12,6 +12,37 @@ This project uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
12
12
 
13
13
  ## [Unreleased]
14
14
 
15
+ ## [0.3.4] - 2026-07-05
16
+
17
+ ### Fixed
18
+
19
+ - **Enforcement gate false-positives on prose that merely mentions a governed
20
+ keyword, for tool calls with a known file path.** `IntentClassifier.classify`
21
+ scanned `action_diff` (the raw Write/Edit content or Bash command text, up
22
+ to 4000 chars) for free-text keywords like `auth`, `rls`, `tenant`, `secret`
23
+ in addition to `intent`, for every tool call. A scratch write whose text
24
+ simply discussed one of those words as a topic - not an actual governed
25
+ action - tripped the pre-tool gate regardless of the real (ungoverned)
26
+ write target, and a fresh `kb_consult` call did not clear it because the
27
+ consult's own classification (`intent`-only) and the gate's classification
28
+ (`intent + action_diff`) disagreed on whether the action was governed.
29
+ Keyword matching on `action_diff` now only applies when the tool call
30
+ carries no `action_path` (Bash commands and OpenCode's `patch`, whose
31
+ content is the only signal available); when an `action_path` is present
32
+ (Write/Edit/MultiEdit), classification uses the path globs and dependency
33
+ command patterns, unchanged, so this keeps full detection for real governed
34
+ edits (a patch touching `package.json`) without flagging unrelated prose in
35
+ files the path globs don't consider governed. Found via a company-knowledge
36
+ KB audit session that reproduced it live (a scratch `.txt` file containing
37
+ "RLS tenant boundaries auth trust model" was blocked with no governed path
38
+ or command in sight); independently reviewed via `codex exec` before
39
+ release.
40
+ - The audit's other finding (CX1: the pre-tool gate and the pre-commit
41
+ `report --staged` gate resolving two different workspace keys) was
42
+ already fixed in v0.2.0 (#64, worktree-invariant workspace key); no
43
+ further change needed. It was still visible in that audit only because
44
+ it predated the deployed kn-dev redeploy.
45
+
15
46
  ## [0.3.3] - 2026-07-05
16
47
 
17
48
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: data-olympus
3
- Version: 0.3.3
3
+ Version: 0.3.4
4
4
  Summary: Governance-grade knowledge-base format (OKF-compatible) plus CLI and single-writer MCP server
5
5
  Project-URL: Homepage, https://github.com/knaisoma/data-olympus
6
6
  Project-URL: Repository, https://github.com/knaisoma/data-olympus
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "data-olympus"
3
- version = "0.3.3"
3
+ version = "0.3.4"
4
4
  description = "Governance-grade knowledge-base format (OKF-compatible) plus CLI and single-writer MCP server"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.13"
@@ -81,7 +81,21 @@ class IntentClassifier:
81
81
  action_diff: str = "",
82
82
  ) -> ClassifyResult:
83
83
  signals: list[str] = []
84
- text = f"{intent} {action_diff}".lower()
84
+ # Free-text keyword signals always scan `intent` (a short, deliberate
85
+ # statement of what the agent is about to do - kb_consult's argument -
86
+ # so a keyword there is a real signal). They scan `action_diff` too,
87
+ # but ONLY when there is no `action_path`: `action_diff` is arbitrary
88
+ # write/command CONTENT up to 4000 chars (Write.content, Edit.new_string,
89
+ # Bash.command, OpenCode patch text), and when a concrete action_path is
90
+ # already given, path-glob matching below is the intended signal for
91
+ # that action - layering the free-text net on top blocked benign writes
92
+ # to ungoverned files that merely discussed a keyword as a topic (a
93
+ # scratch file quoting "RLS"/"auth" from a security standard). Bash
94
+ # commands and OpenCode's `patch` tool carry no action_path at all
95
+ # (their action_diff IS the only content available), so the free-text
96
+ # net still applies there - dropping it entirely would silently lose
97
+ # the only governed-decision signal for those two tool shapes.
98
+ text = intent.lower() if action_path else f"{intent} {action_diff}".lower()
85
99
  for kw, rx in self._keyword_res:
86
100
  if rx.search(text):
87
101
  signals.append(f"keyword:{kw}")
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes