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.
- {hypgraph-0.7.22 → hypgraph-0.7.24}/CHANGELOG.md +67 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/PKG-INFO +1 -1
- {hypgraph-0.7.22 → hypgraph-0.7.24}/docs/PLAN.md +1 -1
- {hypgraph-0.7.22 → hypgraph-0.7.24}/docs/RELEASE-READINESS.md +35 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/__init__.py +1 -1
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/checks.py +342 -91
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/language.py +8 -1
- hypgraph-0.7.24/tests/test_direction_and_units.py +167 -0
- hypgraph-0.7.24/tests/test_quantifiers_and_identity.py +207 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/.gitignore +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/AGENTS.md +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/CITATION.cff +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/DISCLAIMER.md +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/LICENSE +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/NOTICE +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/README.md +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/docs/decisions/ADR-001-token-bound-authors.md +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/docs/decisions/ADR-002-governance-profiles.md +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/docs/profile-workflows-plan.md +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/docs/review-2026-10-24.md +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/docs/site-plan.md +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/docs/spec.md +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/docs/ui-plan.md +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/docs/verification.md +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/docs/workflows/README.md +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/docs/workflows/knowledge.md +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/docs/workflows/optimization.md +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/docs/workflows/scientific.md +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/docs/workflows/software.md +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/docs/workflows/trading.md +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/examples/frameworks/README.md +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/pyproject.toml +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/__main__.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/blind.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/bundle.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/cli.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/coord.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/demos/__init__.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/demos/broad_street.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/demos/linked.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/derive.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/graph.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/mcp.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/plan.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/policy.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/profiles.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/references.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/refusals.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/report_check.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/schema.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/server.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/skill/SKILL.md +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/stats.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/store.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/ui/__init__.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/ui/atlas.css +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/ui/atlas.js +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/ui/hypgraph.css +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/ui/hypgraph.i18n.js +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/ui/hypgraph.js +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/ui/hypgraph.svg +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/ui/index.html +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/ui/vendor/LICENSES.md +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/ui/vendor/cose-base.js +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/ui/vendor/cytoscape-fcose.js +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/ui/vendor/cytoscape.min.js +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/ui/vendor/layout-base.js +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/src/hypgraph/workflow.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_accept_work_kind.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_anchoring.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_blind.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_blind_oracles.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_bound_support.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_bundle_telemetry.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_cancel_releases_lease.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_cited_and_failed_support.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_contradictions.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_coord.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_d10.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_engine.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_engine_fixes.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_framework_examples.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_i18n.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_incremental.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_link_translate.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_linked_records.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_log_and_check.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_measure_questions.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_opposed_answers.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_option_lead.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_order_detail.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_profiles.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_profiles_041.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_questions_not_assertions.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_references.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_refusal_friction.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_refusal_results.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_refusals.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_relation_words.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_report_answers.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_rerunnable.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_restates_scale.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_server_auth.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_server_hosts.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_shape_refusals.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_stats_not_backtests.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_stats_values.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_surfaces.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_telemetry_stream.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_trust_boundary.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_ui_app.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_ui_engine.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_uncorrected_effect.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_unnamed_inputs.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_verify_complete.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_verify_lifecycle.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_verify_scope.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_verify_scoped_views.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_verify_trust.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_verify_views.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_versions_not_figures.py +0 -0
- {hypgraph-0.7.22 → hypgraph-0.7.24}/tests/test_vocabulary_friction.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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
|