hypgraph 0.7.22__tar.gz → 0.7.24__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 (123) hide show
  1. {hypgraph-0.7.22 → hypgraph-0.7.24}/CHANGELOG.md +67 -0
  2. {hypgraph-0.7.22 → hypgraph-0.7.24}/PKG-INFO +1 -1
  3. {hypgraph-0.7.22 → hypgraph-0.7.24}/docs/PLAN.md +1 -1
  4. {hypgraph-0.7.22 → hypgraph-0.7.24}/docs/RELEASE-READINESS.md +35 -0
  5. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/__init__.py +1 -1
  6. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/checks.py +342 -91
  7. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/language.py +8 -1
  8. hypgraph-0.7.24/tests/test_direction_and_units.py +167 -0
  9. hypgraph-0.7.24/tests/test_quantifiers_and_identity.py +207 -0
  10. {hypgraph-0.7.22 → hypgraph-0.7.24}/.gitignore +0 -0
  11. {hypgraph-0.7.22 → hypgraph-0.7.24}/AGENTS.md +0 -0
  12. {hypgraph-0.7.22 → hypgraph-0.7.24}/CITATION.cff +0 -0
  13. {hypgraph-0.7.22 → hypgraph-0.7.24}/DISCLAIMER.md +0 -0
  14. {hypgraph-0.7.22 → hypgraph-0.7.24}/LICENSE +0 -0
  15. {hypgraph-0.7.22 → hypgraph-0.7.24}/NOTICE +0 -0
  16. {hypgraph-0.7.22 → hypgraph-0.7.24}/README.md +0 -0
  17. {hypgraph-0.7.22 → hypgraph-0.7.24}/docs/decisions/ADR-001-token-bound-authors.md +0 -0
  18. {hypgraph-0.7.22 → hypgraph-0.7.24}/docs/decisions/ADR-002-governance-profiles.md +0 -0
  19. {hypgraph-0.7.22 → hypgraph-0.7.24}/docs/profile-workflows-plan.md +0 -0
  20. {hypgraph-0.7.22 → hypgraph-0.7.24}/docs/review-2026-10-24.md +0 -0
  21. {hypgraph-0.7.22 → hypgraph-0.7.24}/docs/site-plan.md +0 -0
  22. {hypgraph-0.7.22 → hypgraph-0.7.24}/docs/spec.md +0 -0
  23. {hypgraph-0.7.22 → hypgraph-0.7.24}/docs/ui-plan.md +0 -0
  24. {hypgraph-0.7.22 → hypgraph-0.7.24}/docs/verification.md +0 -0
  25. {hypgraph-0.7.22 → hypgraph-0.7.24}/docs/workflows/README.md +0 -0
  26. {hypgraph-0.7.22 → hypgraph-0.7.24}/docs/workflows/knowledge.md +0 -0
  27. {hypgraph-0.7.22 → hypgraph-0.7.24}/docs/workflows/optimization.md +0 -0
  28. {hypgraph-0.7.22 → hypgraph-0.7.24}/docs/workflows/scientific.md +0 -0
  29. {hypgraph-0.7.22 → hypgraph-0.7.24}/docs/workflows/software.md +0 -0
  30. {hypgraph-0.7.22 → hypgraph-0.7.24}/docs/workflows/trading.md +0 -0
  31. {hypgraph-0.7.22 → hypgraph-0.7.24}/examples/frameworks/README.md +0 -0
  32. {hypgraph-0.7.22 → hypgraph-0.7.24}/pyproject.toml +0 -0
  33. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/__main__.py +0 -0
  34. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/blind.py +0 -0
  35. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/bundle.py +0 -0
  36. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/cli.py +0 -0
  37. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/coord.py +0 -0
  38. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/demos/__init__.py +0 -0
  39. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/demos/broad_street.py +0 -0
  40. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/demos/linked.py +0 -0
  41. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/derive.py +0 -0
  42. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/graph.py +0 -0
  43. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/mcp.py +0 -0
  44. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/plan.py +0 -0
  45. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/policy.py +0 -0
  46. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/profiles.py +0 -0
  47. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/references.py +0 -0
  48. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/refusals.py +0 -0
  49. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/report_check.py +0 -0
  50. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/schema.py +0 -0
  51. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/server.py +0 -0
  52. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/skill/SKILL.md +0 -0
  53. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/stats.py +0 -0
  54. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/store.py +0 -0
  55. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/ui/__init__.py +0 -0
  56. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/ui/atlas.css +0 -0
  57. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/ui/atlas.js +0 -0
  58. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/ui/hypgraph.css +0 -0
  59. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/ui/hypgraph.i18n.js +0 -0
  60. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/ui/hypgraph.js +0 -0
  61. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/ui/hypgraph.svg +0 -0
  62. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/ui/index.html +0 -0
  63. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/ui/vendor/LICENSES.md +0 -0
  64. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/ui/vendor/cose-base.js +0 -0
  65. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/ui/vendor/cytoscape-fcose.js +0 -0
  66. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/ui/vendor/cytoscape.min.js +0 -0
  67. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/ui/vendor/layout-base.js +0 -0
  68. {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/workflow.py +0 -0
  69. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_accept_work_kind.py +0 -0
  70. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_anchoring.py +0 -0
  71. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_blind.py +0 -0
  72. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_blind_oracles.py +0 -0
  73. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_bound_support.py +0 -0
  74. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_bundle_telemetry.py +0 -0
  75. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_cancel_releases_lease.py +0 -0
  76. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_cited_and_failed_support.py +0 -0
  77. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_contradictions.py +0 -0
  78. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_coord.py +0 -0
  79. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_d10.py +0 -0
  80. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_engine.py +0 -0
  81. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_engine_fixes.py +0 -0
  82. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_framework_examples.py +0 -0
  83. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_i18n.py +0 -0
  84. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_incremental.py +0 -0
  85. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_link_translate.py +0 -0
  86. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_linked_records.py +0 -0
  87. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_log_and_check.py +0 -0
  88. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_measure_questions.py +0 -0
  89. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_opposed_answers.py +0 -0
  90. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_option_lead.py +0 -0
  91. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_order_detail.py +0 -0
  92. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_profiles.py +0 -0
  93. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_profiles_041.py +0 -0
  94. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_questions_not_assertions.py +0 -0
  95. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_references.py +0 -0
  96. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_refusal_friction.py +0 -0
  97. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_refusal_results.py +0 -0
  98. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_refusals.py +0 -0
  99. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_relation_words.py +0 -0
  100. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_report_answers.py +0 -0
  101. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_rerunnable.py +0 -0
  102. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_restates_scale.py +0 -0
  103. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_server_auth.py +0 -0
  104. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_server_hosts.py +0 -0
  105. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_shape_refusals.py +0 -0
  106. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_stats_not_backtests.py +0 -0
  107. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_stats_values.py +0 -0
  108. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_surfaces.py +0 -0
  109. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_telemetry_stream.py +0 -0
  110. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_trust_boundary.py +0 -0
  111. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_ui_app.py +0 -0
  112. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_ui_engine.py +0 -0
  113. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_uncorrected_effect.py +0 -0
  114. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_unnamed_inputs.py +0 -0
  115. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_verify_complete.py +0 -0
  116. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_verify_lifecycle.py +0 -0
  117. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_verify_scope.py +0 -0
  118. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_verify_scoped_views.py +0 -0
  119. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_verify_trust.py +0 -0
  120. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_verify_views.py +0 -0
  121. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_versions_not_figures.py +0 -0
  122. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_vocabulary_friction.py +0 -0
  123. {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_workflows.py +0 -0
@@ -1,5 +1,72 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.7.24 — 2026-11-01: what a quantifier needs, where a comparison's boundary falls, one check per extreme
4
+
5
+ Fixes from an independent audit of 0.7.23 (HG-023-01 to -05); each case below failed on 0.7.23 and is now a test.
6
+
7
+ - **"Nothing" needs none, "every" needs all** (HG-023-01). Any count of none or all backed an absolute, so "nothing
8
+ is longer than 26 km" went in with all 3 routes longer, and "every route is longer than 26 km" with none. When a
9
+ count's comparison is known, the claim now needs the extreme its quantifier names; the other extreme shows it false
10
+ (`COUNT_CONTRADICTS`). A count of what lies outside the claim's exceptions is read as its complement: none of 3
11
+ longer than 26 is 3 of 3 at 26 or shorter. "Every" in a clause that states its own count ("a count of every route
12
+ finds 1 of 76 shorter") names the set counted and is not read as a quantifier. A count whose comparison can't be
13
+ told ("failures") is read as before.
14
+ - **"At least" is not "longer than"** (HG-023-02). Comparisons keep their boundary: `op` takes `<`, `<=`, `=`, `!=`,
15
+ `>=`, `>`, and names say "at least", "at most", "26 km or longer", "not / no shorter than", "no more than". A count
16
+ refutes a claim only if everything it found is an exception, and backs it only if it covers every exception: two
17
+ routes at least 26 km neither refute nor back "no route is longer than 26 km" (the routes of exactly 26 lie between),
18
+ and none longer than 26 doesn't back "no route is 26 km or longer". `=` and `!=` counts don't bear on a comparison.
19
+ "At least" used to be read as pointing down and "at most" up. "No route is 26 km or longer" and "no route is at
20
+ least 26 km" are absolutes too.
21
+ - **Two extremes are two claims** (HG-023-03). "The shortest route is 26 km; the longest route is 35 km" pooled both
22
+ figures and both directions, and the count of 2 longer than 26 refused the true sentence. Each extreme, and each
23
+ thing an absolute rules out, is now checked with its own figure and direction; the refusal names the extreme it
24
+ found false.
25
+ - **What "of" and "for" name says which thing** (HG-023-04). "Weights of cargo" and "weights of passengers" both read
26
+ as bare "weights", and "shipping cargo weights" met "shipping passenger weights" on one shared word. The object of
27
+ "of" / "for" now counts, and two subjects that each say something the other doesn't are left apart: unresolved, not
28
+ a contradiction. One that only adds to the other ("the recorded weights of cargo") is the same thing.
29
+ - **A contrast keeps the unit it asserts** (HG-023-05). "Not in pounds but in kilograms" lost its kilograms, and
30
+ "kilograms rather than pounds" kept both, so a claim of pounds citing either went in. A clause with no subject or
31
+ verb of its own takes the subject its sentence named last ("… but always in kilograms"); one that names its own
32
+ ("and passenger weights in pounds") doesn't. What follows "rather than" / "instead of", up to its unit, is set aside.
33
+ - Limits: subjects, units of record, quantifiers and comparisons are still read from words, not typed (only a count's
34
+ `figure` and `op` are); a missed contradiction is preferred to a false one, so subjects left apart are not
35
+ compared; conversions aren't checked; and the replay of earlier recorded entries changes nothing, which shows no
36
+ regression but none of those entries tries these cases.
37
+
38
+ ## 0.7.23 — 2026-11-01: a count points one way, "no route is longer", what a unit is said of
39
+
40
+ Fixes from an independent audit of 0.7.22 (HG-022-01 to -05); each case below failed on 0.7.22 and is now a test.
41
+
42
+ - **A count points one way** (HG-022-01, -02). A count of routes longer than 26 km matched "the shortest route is
43
+ 26 km" on the figure, so the true claim was refused as `COUNT_CONTRADICTS`; and a count of none shorter than 26
44
+ backed "nothing is longer than 26 km". Comparisons now carry a direction on an axis ("longer" / "shorter",
45
+ "faster" / "slower"; "more", "above", "highest" meet any axis), and a count that points the other way from the
46
+ claim's exceptions neither refutes nor backs it. A result can state the comparison with the count
47
+ (`{"k": 2, "n": 3, "figure": 26, "op": ">"}`); that is the only direction, and a measurement whose name points the
48
+ other way is refused as `MEASUREMENT_MISMATCH`. Without one, a name and key that point opposite ways can widen what
49
+ a count refutes, never what it backs.
50
+ - **"No route is longer than 26 km" is an absolute** (HG-022-02), like "nothing is longer": it needs a count of
51
+ exceptions. Only a "no" that opens its clause, followed within three words by a copula and a comparison, is read
52
+ this way ("routes that visit no town twice" is not one).
53
+ - **A unit of record said with a verb** (HG-022-03). Only "is / are / was / were" stated a unit, so "recorded parcel
54
+ weights use pounds" went in beside the note that every recorded parcel weight is in kilograms. A short, fixed list
55
+ is read too: use, recorded / measured / expressed / given / listed / reported / denominated / kept / stated /
56
+ written / logged / entered / priced / quoted in. A hedge ("might be recorded in pounds") asserts nothing.
57
+ - **Two things that share a word are two things** (HG-022-04). "Passenger weights are recorded in pounds" was refused
58
+ against a source saying shipping weights are in kilograms, on the word "weights". A unit is now compared only when
59
+ the two subjects have the same head and don't each carry modifiers the other lacks entirely; every clause of the
60
+ source is read, and one that says the claim's unit of that thing means no contradiction.
61
+ - **A quantity is not a unit of record** (HG-022-05). "The parcel mass is about 2.2 pounds", citing "the parcel mass
62
+ is one kilogram", was refused: a unit after a number ("2.2 pounds", "one kilogram", "36 kg") is a quantity, and
63
+ isn't compared. The refusal no longer says a quantity can't be in two units; it says the source doesn't support the
64
+ statement.
65
+ - Limits: which thing a subject names and which unit a record uses are read from words, not typed; conversions
66
+ aren't checked, so "2.2 pounds" against "50 kilograms" goes in; verbs outside the list aren't read; the "no X is
67
+ longer" pattern is narrow ("there is no route longer" isn't read); and a direction is read only from the comparison
68
+ words above.
69
+
3
70
  ## 0.7.22 — 2026-11-01: a label can't move a count, every part of a claim is checked, units rule each other out
4
71
 
5
72
  Fixes from an independent audit of 0.7.21 (HG-021-01 to -04); each case below failed on 0.7.21 and is now a test.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: hypgraph
3
- Version: 0.7.22
3
+ Version: 0.7.24
4
4
  Summary: The evidence layer for AI research agents: a hash-chained research record that checks every claim as it is written and derives how well each is known.
5
5
  Project-URL: Homepage, https://hypgraph.com
6
6
  Project-URL: Documentation, https://hypgraph.com/engineers/
@@ -109,7 +109,7 @@ claim's derived standing.
109
109
  Multi-writer sync between graphs (bundles cover sharing), authentication (the host's job; the HTTP server binds to
110
110
  loopback and is read-only unless started with `--writable`), and a hosted service.
111
111
 
112
- ## Status at 0.7.22 (2026-11-01)
112
+ ## Status at 0.7.24 (2026-11-01)
113
113
 
114
114
  All seven phases are done: the library, bundles, the server and UI, the MCP server, the website, Pegasus running on
115
115
  the package, and releases to PyPI from tags with trusted publishing. What came after the plan, by release, is in
@@ -114,6 +114,41 @@ was taken from a changelog without being checked against the code.*
114
114
  > suite is 482 passed, and hypswarm (118 passed) and hypmesh (37 passed) pass on it. The audit asks for a fresh
115
115
  > independent audit before anyone claims 0.7.22 resists these attack classes. Released as 0.7.22.
116
116
 
117
+ > **Audit of 0.7.22 (2026-11-01), fixed for 0.7.23.** A third independent audit found five cases, each reproduced on
118
+ > the 0.7.22 wheel. Two let a count stand for its opposite: a count of routes longer than 26 km refused the true "the
119
+ > shortest route is 26 km" (HG-022-01), and none shorter than 26 backed "nothing / no route is longer than 26 km"
120
+ > (HG-022-02). One let a unit claim in: "recorded parcel weights use pounds" stated no copula (HG-022-03). Two made
121
+ > false accusations: "passenger weights" was matched with "shipping weights" on a shared word (HG-022-04), and a
122
+ > quantity converted to another unit was read as a unit of record (HG-022-05). Comparisons now carry a direction, and
123
+ > a result can state its comparison (`op`); "no X is longer than…" opening a clause is an absolute; a short fixed list
124
+ > of verbs states a unit; units are compared only between subjects with the same head and compatible modifiers; a unit
125
+ > after a number is a quantity. Each case is a regression test written to fail on 0.7.22. Replaying the 1,900
126
+ > recorded adversarial entries names exactly the same parties as 0.7.22; one repeated false unit claim is no longer
127
+ > refused, because 0.7.22 had refused it on a shared word and a quantity, and its author is still named.
128
+ >
129
+ > **Where that stands.** #87 is merged with green CI (17 of 17 checks); from the 0.7.23 wheel in a fresh venv the
130
+ > suite is 504 passed, and hypswarm (118 passed) and hypmesh (37 passed) pass on it. Which thing a subject names and
131
+ > which unit a record uses are still read from words, not typed; a fresh independent audit should precede any claim
132
+ > that 0.7.23 resists these attack classes. Released as 0.7.23.
133
+
134
+ > **Audit of 0.7.23 (2026-11-01), fixed for 0.7.24.** A fourth independent audit, a code review without running the
135
+ > wheel, named five candidate defects; each reproduced on the PyPI 0.7.23 wheel, plus two of the same kind. A count of
136
+ > none or all backed any absolute, so "nothing is longer than 26 km" went in with all routes longer and "every route
137
+ > is longer" with none (HG-023-01). Comparisons lost their boundary, so a count at least 26 refuted the true "no route
138
+ > is longer than 26" and "at least" was read as pointing down (HG-023-02). Two extremes in one sentence were pooled
139
+ > and a true one refused (HG-023-03). "Weights of cargo" and "weights of passengers" read as one thing (HG-023-04),
140
+ > and "not in pounds but in kilograms" lost its kilograms (HG-023-05). A claim now needs the extreme its quantifier
141
+ > names; comparisons keep their boundary across six operators; each extreme is checked on its own; the object of "of"
142
+ > / "for" says which thing, and subjects that each say something the other doesn't are left apart, unresolved; a
143
+ > contrast keeps its unit. Each case is a regression test written to fail on 0.7.23. Replaying the 1,900 recorded
144
+ > adversarial entries changes nothing against 0.7.23 (a first version over-read "a count of every route" and named
145
+ > one honest party wrongly; caught by the replay, fixed and tested), but none of those entries tries these cases.
146
+ >
147
+ > **Where that stands.** #89 is merged with green CI (17 of 17 checks); from the 0.7.24 wheel in a fresh venv the
148
+ > suite is 549 passed, and hypswarm (118 passed) and hypmesh (37 passed) pass on it. The audit recommends a typed
149
+ > claim layer (subject, property, comparator, threshold, unit, quantifier) so that strong verdicts rest on typed fields
150
+ > rather than prose; that is not built. Released as 0.7.24.
151
+
117
152
  ## Recommendation: CONDITIONAL GO
118
153
 
119
154
  HypGraph is ready for a public developer preview once #59, #60 and #61 are merged with green CI and released as one
@@ -16,7 +16,7 @@ Standing is derived on every read, never stored; every write is an event in a SH
16
16
  their numbers; reviews pin versions; independence is counted, not assumed. See https://hypgraph.com.
17
17
  """
18
18
 
19
- __version__ = "0.7.22"
19
+ __version__ = "0.7.24"
20
20
 
21
21
  from .bundle import anchored, verify_bundle # noqa: E402
22
22
  from .graph import Author, Graph, GraphError, file_sha256 # noqa: E402