kinemata 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.
- kinemata-0.1.0/AIPOLICY.md +30 -0
- kinemata-0.1.0/CHANGELOG.md +143 -0
- kinemata-0.1.0/LICENSE.md +594 -0
- kinemata-0.1.0/MANIFEST.in +31 -0
- kinemata-0.1.0/PKG-INFO +1003 -0
- kinemata-0.1.0/README.md +979 -0
- kinemata-0.1.0/docs/american-english.toml +53 -0
- kinemata-0.1.0/docs/bibliography.toml +111 -0
- kinemata-0.1.0/docs/citations.md +661 -0
- kinemata-0.1.0/docs/design.md +427 -0
- kinemata-0.1.0/docs/introduction.md +1721 -0
- kinemata-0.1.0/docs/resources.toml +42 -0
- kinemata-0.1.0/docs/structure.md +626 -0
- kinemata-0.1.0/examples/ci-github-actions.yml +69 -0
- kinemata-0.1.0/kinemata.toml +474 -0
- kinemata-0.1.0/pyproject.toml +65 -0
- kinemata-0.1.0/setup.cfg +4 -0
- kinemata-0.1.0/src/kinemata/__init__.py +52 -0
- kinemata-0.1.0/src/kinemata/access.py +156 -0
- kinemata-0.1.0/src/kinemata/adapters/__init__.py +0 -0
- kinemata-0.1.0/src/kinemata/adapters/bibliography.py +555 -0
- kinemata-0.1.0/src/kinemata/adapters/constants.py +229 -0
- kinemata-0.1.0/src/kinemata/adapters/mapping.py +86 -0
- kinemata-0.1.0/src/kinemata/adapters/patterns.py +100 -0
- kinemata-0.1.0/src/kinemata/adapters/substitutions.py +144 -0
- kinemata-0.1.0/src/kinemata/baseline.py +468 -0
- kinemata-0.1.0/src/kinemata/bypass.py +594 -0
- kinemata-0.1.0/src/kinemata/citations.py +133 -0
- kinemata-0.1.0/src/kinemata/claims.py +1690 -0
- kinemata-0.1.0/src/kinemata/cli.py +2407 -0
- kinemata-0.1.0/src/kinemata/config.py +2397 -0
- kinemata-0.1.0/src/kinemata/confirm.py +924 -0
- kinemata-0.1.0/src/kinemata/context.py +284 -0
- kinemata-0.1.0/src/kinemata/contract.py +493 -0
- kinemata-0.1.0/src/kinemata/exclusion.py +276 -0
- kinemata-0.1.0/src/kinemata/gates.py +161 -0
- kinemata-0.1.0/src/kinemata/interpose.py +553 -0
- kinemata-0.1.0/src/kinemata/literals.py +358 -0
- kinemata-0.1.0/src/kinemata/parity.py +746 -0
- kinemata-0.1.0/src/kinemata/probe.py +420 -0
- kinemata-0.1.0/src/kinemata/projection.py +101 -0
- kinemata-0.1.0/src/kinemata/prose.py +736 -0
- kinemata-0.1.0/src/kinemata/provenance.py +566 -0
- kinemata-0.1.0/src/kinemata/pytest_plugin.py +245 -0
- kinemata-0.1.0/src/kinemata/report.py +162 -0
- kinemata-0.1.0/src/kinemata/resources.py +200 -0
- kinemata-0.1.0/src/kinemata/shape.py +526 -0
- kinemata-0.1.0/src/kinemata/stamps.py +404 -0
- kinemata-0.1.0/src/kinemata/targets.py +97 -0
- kinemata-0.1.0/src/kinemata.egg-info/PKG-INFO +1003 -0
- kinemata-0.1.0/src/kinemata.egg-info/SOURCES.txt +86 -0
- kinemata-0.1.0/src/kinemata.egg-info/dependency_links.txt +1 -0
- kinemata-0.1.0/src/kinemata.egg-info/entry_points.txt +2 -0
- kinemata-0.1.0/src/kinemata.egg-info/requires.txt +9 -0
- kinemata-0.1.0/src/kinemata.egg-info/top_level.txt +1 -0
- kinemata-0.1.0/tests/test_access.py +206 -0
- kinemata-0.1.0/tests/test_against_example.py +97 -0
- kinemata-0.1.0/tests/test_baseline.py +406 -0
- kinemata-0.1.0/tests/test_bibliography.py +793 -0
- kinemata-0.1.0/tests/test_bypass.py +336 -0
- kinemata-0.1.0/tests/test_catch_a_ratchet.py +286 -0
- kinemata-0.1.0/tests/test_claims.py +1297 -0
- kinemata-0.1.0/tests/test_claims_declared.py +111 -0
- kinemata-0.1.0/tests/test_claims_ratchet.py +443 -0
- kinemata-0.1.0/tests/test_config_keys.py +357 -0
- kinemata-0.1.0/tests/test_confirm.py +566 -0
- kinemata-0.1.0/tests/test_context.py +338 -0
- kinemata-0.1.0/tests/test_contract.py +256 -0
- kinemata-0.1.0/tests/test_corpus_validation.py +207 -0
- kinemata-0.1.0/tests/test_delivery.py +1569 -0
- kinemata-0.1.0/tests/test_docstring_claims.py +507 -0
- kinemata-0.1.0/tests/test_exclusion.py +232 -0
- kinemata-0.1.0/tests/test_gates.py +549 -0
- kinemata-0.1.0/tests/test_import_kind.py +612 -0
- kinemata-0.1.0/tests/test_interpose.py +800 -0
- kinemata-0.1.0/tests/test_literals.py +137 -0
- kinemata-0.1.0/tests/test_packaging.py +116 -0
- kinemata-0.1.0/tests/test_parity.py +1075 -0
- kinemata-0.1.0/tests/test_probe.py +608 -0
- kinemata-0.1.0/tests/test_prose.py +233 -0
- kinemata-0.1.0/tests/test_provenance.py +631 -0
- kinemata-0.1.0/tests/test_registry_where.py +190 -0
- kinemata-0.1.0/tests/test_resources.py +611 -0
- kinemata-0.1.0/tests/test_section_path.py +344 -0
- kinemata-0.1.0/tests/test_shape.py +769 -0
- kinemata-0.1.0/tests/test_stamps.py +386 -0
- kinemata-0.1.0/tests/test_substitutions.py +187 -0
- kinemata-0.1.0/tests/test_targets.py +115 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Kinemata Project Policy on Use of Generative AI Tools
|
|
2
|
+
*Derived from [Guidance Regarding Use of Generative AI Tools for Open Source Software Development](https://www.linuxfoundation.org/legal/generative-ai)*
|
|
3
|
+
*Linux Foundation, on 2026/02/26.*
|
|
4
|
+
|
|
5
|
+
Open source software has thrived for decades based on the merits of each technical contribution that is
|
|
6
|
+
openly contributed to and reviewed by community peers. Development and review of code generated by AI tools
|
|
7
|
+
should be treated no differently. Code or other content generated in whole or in part using AI tools can be
|
|
8
|
+
contributed to this project. However, there are some unique considerations related to AI generated content
|
|
9
|
+
that developers should factor into their contributions.
|
|
10
|
+
|
|
11
|
+
1. Contributors should ensure that the terms and conditions of the generative AI tool do not place any
|
|
12
|
+
contractual restrictions on how the tool's output can be used that are inconsistent with the project's
|
|
13
|
+
open source [software license](LICENSE.md), the project's intellectual property policies, or the
|
|
14
|
+
[Open Source Definition](https://opensource.org/osd).
|
|
15
|
+
|
|
16
|
+
2. If any pre-existing copyrighted materials (including pre-existing open source code) authored or owned
|
|
17
|
+
by third parties are included in the AI tool's output, prior to contributing such output to the project,
|
|
18
|
+
the Contributor should confirm that they have permission from the third party owners — such as in the form
|
|
19
|
+
of an open source license or public domain declaration that complies with the project's licensing policies
|
|
20
|
+
— to use and modify such pre-existing materials and contribute them to the project. Additionally, the
|
|
21
|
+
contributor should provide notice and attribution of such third party rights, along with information about
|
|
22
|
+
the applicable license terms, with their contribution.
|
|
23
|
+
|
|
24
|
+
3. Organizations that employ open source developers may have more stringent guidelines related to use of AI
|
|
25
|
+
for software development. Contributors should comply with their employer's policies when contributing.
|
|
26
|
+
|
|
27
|
+
Some tools provide features that can assist contributors. For example, some tools provide a feature that
|
|
28
|
+
suppresses responses that are similar to third party materials in the AI tool's output, or a feature that
|
|
29
|
+
flags similarity between copyrighted training data or other materials owned by third parties and the AI
|
|
30
|
+
tool's output and provides information about the licensing terms that apply to such third party materials.
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
What changed between released versions, for a person reading it.
|
|
4
|
+
|
|
5
|
+
**An entry is a list of what changed.** The first release was a single line, on the stated
|
|
6
|
+
condition that this would grow when there was a reader for it to grow for — and there is one now:
|
|
7
|
+
a project outside this repository runs against kinemata and upgrades between published versions.
|
|
8
|
+
|
|
9
|
+
Commits are in `git log`; the reasoning behind a design decision stays in the document that
|
|
10
|
+
carries the decision. A changelog repeating either becomes a second carrier and goes stale.
|
|
11
|
+
|
|
12
|
+
## 0.1.0
|
|
13
|
+
|
|
14
|
+
**The first release that is not a pre-release.** What changes for an installer: while only
|
|
15
|
+
pre-releases existed, a plain `pip install kinemata` resolved to one, because pip skips a
|
|
16
|
+
pre-release only when some other version satisfies the requirement. One does now, so an unpinned
|
|
17
|
+
install moves here and stays on final versions from now on. The interfaces are still not settled
|
|
18
|
+
and the classifiers still say so.
|
|
19
|
+
|
|
20
|
+
**New**
|
|
21
|
+
|
|
22
|
+
- `kinemata probe` compares a declared corpus of inputs against what the project's own code
|
|
23
|
+
accepts and refuses — a fact with no value on either side, which no oracle can print. The
|
|
24
|
+
project supplies the target and the cases; how the answer is read is declared in the config,
|
|
25
|
+
not supplied by the project. A corpus carrying only one polarity fails rather than passing:
|
|
26
|
+
a refusal-only corpus is satisfied by a callable that refuses everything.
|
|
27
|
+
- **This is the first check that calls the project's own code.** kinemata still never runs the
|
|
28
|
+
project's test suite or entry point, and never classifies an outcome by reading output.
|
|
29
|
+
|
|
30
|
+
- `[[registry]]` takes a `where` selector, narrowing a view to the entries it keeps. The vocabulary
|
|
31
|
+
is a `[[shape]]` rule's guard — a table of operators, or a `module:attribute` naming a predicate
|
|
32
|
+
of the project's own — reused rather than invented. It exists because an oracle answering for part
|
|
33
|
+
of a declaration otherwise pays an `unproduced` finding for every row outside it: measured on a
|
|
34
|
+
99-row manifest against an oracle covering 10, **93 findings became 9**, and the 9 are real.
|
|
35
|
+
It narrows the **registry**, so membership keeps meaning *"and there is nothing else"* over the
|
|
36
|
+
set the view declares, and the scan, `undeclared`, `shape` and `unused` see the same narrowing.
|
|
37
|
+
A selector that keeps nothing is refused at load, and `where` may not be combined with `closed` —
|
|
38
|
+
a closed subset would call every identifier of an excluded row undeclared.
|
|
39
|
+
- A `[[parity]]`'s `field`, and a `[[shape]]` rule's `field` / `present` / `absent`, may name a
|
|
40
|
+
**path** into an entry written as a list: `field = ["default", "primary"]` reaches one arm of a
|
|
41
|
+
nested map. A bare string is still exactly one key however many dots it holds, and is never
|
|
42
|
+
split — `extra` keys legitimately contain them, so splitting would resolve an ambiguity by
|
|
43
|
+
guessing, and a wrong guess here compares the wrong cell and passes rather than failing. A path
|
|
44
|
+
that reaches nothing, or that descends through a scalar, reads as *no value declared* rather
|
|
45
|
+
than as an error, so a table mixing scalar and nested rows stays readable.
|
|
46
|
+
|
|
47
|
+
- `[[parity]]` takes a `relation`, saying what the two sets are claimed to be:
|
|
48
|
+
`equal` (the default, and what every parity meant before the key existed),
|
|
49
|
+
`declared_contains`, `produced_contains`, or `disjoint`. Membership could previously claim only
|
|
50
|
+
that the two sets were the same, so a declaration that legitimately names more than the code
|
|
51
|
+
produces — a deny list, a set of rows the code must *not* emit — had to accept the difference
|
|
52
|
+
into the baseline, which is an exemption list standing in for a claim and needs a re-record every
|
|
53
|
+
time a row lands. Measured on a real conformance row: a deny block of eight against a code
|
|
54
|
+
constant of one is **7 findings under `equal` and clean under `declared_contains`**.
|
|
55
|
+
It is spelled as the claim rather than as a direction switched off, because membership otherwise
|
|
56
|
+
means "and there is nothing else" and a reader has to be able to see that a parity is not
|
|
57
|
+
closed-world. A relation other than `equal` **fails a run whose oracle produced nothing** —
|
|
58
|
+
`declared_contains` and `disjoint` are both satisfied by an oracle with nothing to violate them —
|
|
59
|
+
and cannot be combined with `field`, a value comparison needing identifiers on both sides.
|
|
60
|
+
|
|
61
|
+
**Changed**
|
|
62
|
+
|
|
63
|
+
- `kinemata review` and `kinemata check` report how many f-strings a `match_mode = "strings"`
|
|
64
|
+
registry could not read. An f-string is dropped whole by the literal extractor — not merely
|
|
65
|
+
its interpolated parts — so a registry matching on values is blind to every one of them and
|
|
66
|
+
reports clean. The behavior is unchanged; it is no longer silent.
|
|
67
|
+
|
|
68
|
+
**Fixed**
|
|
69
|
+
|
|
70
|
+
- The advice printed for an `exclude` fragment that matched by substring suggested an anchored
|
|
71
|
+
spelling derived from the fragment, which for a directory below the repository root reaches
|
|
72
|
+
none of the paths printed beside it. Following it would have silently stopped excluding whole
|
|
73
|
+
subtrees. The two cases are now told apart and the suggested spellings are derived from the
|
|
74
|
+
paths that actually matched.
|
|
75
|
+
- A `[[parity]]` comparing values threw away the membership result when a cell held a container
|
|
76
|
+
it could not render. The value half still blocks, as it must; the membership half is reported.
|
|
77
|
+
- An inline `command` or `args` written as a string — `command = "python -m tool"` — was iterated
|
|
78
|
+
into one argument per character instead of being refused. The run then failed on the first
|
|
79
|
+
letter and was reported as *the oracle could not be run*, blaming the project's command for a
|
|
80
|
+
defect in the config; and because a blocked parity oracle stops `kinemata baseline --record`,
|
|
81
|
+
the typo disarmed the writer as well. The `[command]` table already refused this; the inline
|
|
82
|
+
spellings on `[[count]]` and `[[parity]]` now do too. Note that `[[gate]]` takes a string
|
|
83
|
+
deliberately, so the key's name does not tell you which form it wants.
|
|
84
|
+
- A claim or citation was dropped without a word when a negation appeared on the line above it, or
|
|
85
|
+
in the sentence before it. Two bounds were wrong. The window limiting how far back a negation
|
|
86
|
+
reaches was measured separately on each line and the two were concatenated, so a 45-character
|
|
87
|
+
rule looked back as far as 91; and a full stop did not end a negation's clause, so "there is no
|
|
88
|
+
compatibility read. The loader is `a.py`" stopped checking `a.py`. Both are fixed, and an
|
|
89
|
+
abbreviation — `e.g.`, `etc.` — is not read as the end of a sentence.
|
|
90
|
+
**This makes the documentation and citation checks report more, not less.** A tree that was
|
|
91
|
+
green may now have findings, and they are not new text: they were always there and never
|
|
92
|
+
visible, because a dropped claim makes a check pass. On this repository the claims check went
|
|
93
|
+
from 99 to 113 and six citations came out from under it, all pre-existing. Expect to accept them
|
|
94
|
+
into your baseline rather than to fix them.
|
|
95
|
+
|
|
96
|
+
## 0.1.0a2.dev1
|
|
97
|
+
|
|
98
|
+
Mechanisms that did not exist in the first release, and changes an existing config can observe.
|
|
99
|
+
|
|
100
|
+
A dev build of the coming `0.1.0a2`, published to get these in front of the one project upgrading
|
|
101
|
+
against them. `0.1.0.dev1` would have been the obvious spelling and is the wrong one: under
|
|
102
|
+
PEP 440 it sorts *behind* the published `0.1.0a1`.
|
|
103
|
+
|
|
104
|
+
**New**
|
|
105
|
+
|
|
106
|
+
- `kinemata parity` compares a registry's declaration against the set the project's own code
|
|
107
|
+
prints — both membership directions, and, where an entry declares a field, each entry's value
|
|
108
|
+
against what the oracle prints for it.
|
|
109
|
+
- `[[interpose]]` watches a declared funnel while the project's own test suite runs, as a pytest
|
|
110
|
+
plugin the project loads for itself. Installing kinemata patches nothing on its own. What
|
|
111
|
+
crossed the funnel is recorded, clean rows included.
|
|
112
|
+
- `kinemata shape` asks whether a declaration is the shape it says it is — the first check here
|
|
113
|
+
whose subject is the declared document rather than the code.
|
|
114
|
+
|
|
115
|
+
**Changed, and visible to a config written for the first release**
|
|
116
|
+
|
|
117
|
+
- Every config table refuses a key it cannot mean. TOML gives a bare key to the most recent
|
|
118
|
+
table, so a stanza written in the wrong place used to be absorbed silently; a top-level gate
|
|
119
|
+
stanza declared zero gates and disarmed the inventory rather than decorating it.
|
|
120
|
+
- `kinemata claims` refuses when nothing is declared for it to check, instead of checking
|
|
121
|
+
nothing and passing.
|
|
122
|
+
- A negative `max_sites` in the config means *off*, as it already did as a flag. It used to
|
|
123
|
+
suppress every site and exit clean.
|
|
124
|
+
- An `exclude` fragment can be anchored with a leading slash, and a fragment that removed
|
|
125
|
+
nothing is reported.
|
|
126
|
+
- A `[[count]]` can say `occurrence = "first"`, reading only the first match in each document
|
|
127
|
+
and treating what is below it as that document's own history. `every` remains the default, so
|
|
128
|
+
no existing declaration changes meaning.
|
|
129
|
+
|
|
130
|
+
**Fixed**
|
|
131
|
+
|
|
132
|
+
- A `[[count]]` whose pattern matched no line passed silently: the oracle answered, nothing was
|
|
133
|
+
compared, and the run stayed green while a declared check was not running.
|
|
134
|
+
- `kinemata confirm --write` corrupted the resource list it re-dated, joining the following
|
|
135
|
+
field onto the line it rewrote.
|
|
136
|
+
- A baseline rewrite treated an oracle that crashed as an oracle that found nothing, and
|
|
137
|
+
deleted its accepted findings as fixed.
|
|
138
|
+
|
|
139
|
+
## 0.1.0a1
|
|
140
|
+
|
|
141
|
+
First release. Registry declarations, the duplication and closed-world catches, documentation
|
|
142
|
+
checked as claims, the citation layer, and a shared ratchet across the gates — published as an
|
|
143
|
+
alpha to exercise the release path, not because the interfaces are settled.
|