techtree 0.1.0__py3-none-any.whl

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 (174) hide show
  1. techtree/__init__.py +35 -0
  2. techtree/__main__.py +14 -0
  3. techtree/canonical.py +239 -0
  4. techtree/catalog/__init__.py +25 -0
  5. techtree/catalog/repository.py +400 -0
  6. techtree/catalog/service.py +419 -0
  7. techtree/cli/__init__.py +1 -0
  8. techtree/cli/app.py +416 -0
  9. techtree/cli/commands/__init__.py +1 -0
  10. techtree/cli/commands/climb.py +1223 -0
  11. techtree/cli/commands/doctor.py +147 -0
  12. techtree/cli/commands/engine.py +207 -0
  13. techtree/cli/commands/proof.py +556 -0
  14. techtree/cli/commands/publish.py +447 -0
  15. techtree/cli/commands/release.py +303 -0
  16. techtree/cli/commands/run.py +1067 -0
  17. techtree/cli/commands/setup.py +181 -0
  18. techtree/cli/commands/skill.py +221 -0
  19. techtree/cli/commands/uplift.py +698 -0
  20. techtree/cli/commands/withdraw.py +212 -0
  21. techtree/cli/confirm.py +47 -0
  22. techtree/cli/context.py +96 -0
  23. techtree/cli/invoke.py +220 -0
  24. techtree/cli/output.py +280 -0
  25. techtree/constants.py +138 -0
  26. techtree/crypto.py +128 -0
  27. techtree/doctor/__init__.py +1 -0
  28. techtree/doctor/checks.py +675 -0
  29. techtree/doctor/execution_checks.py +435 -0
  30. techtree/doctor/service.py +326 -0
  31. techtree/drafts/__init__.py +32 -0
  32. techtree/drafts/source.py +146 -0
  33. techtree/drafts/store.py +992 -0
  34. techtree/engines/__init__.py +1 -0
  35. techtree/engines/bundle.py +251 -0
  36. techtree/engines/installer.py +679 -0
  37. techtree/engines/registry.py +235 -0
  38. techtree/engines/runner.py +170 -0
  39. techtree/errors.py +262 -0
  40. techtree/fs.py +234 -0
  41. techtree/harness.py +108 -0
  42. techtree/identity/__init__.py +41 -0
  43. techtree/identity/models.py +113 -0
  44. techtree/identity/service.py +199 -0
  45. techtree/identity/store.py +263 -0
  46. techtree/ids.py +85 -0
  47. techtree/manifests/__init__.py +39 -0
  48. techtree/manifests/builder.py +433 -0
  49. techtree/manifests/compare.py +376 -0
  50. techtree/models/__init__.py +282 -0
  51. techtree/models/base.py +201 -0
  52. techtree/models/campaign.py +484 -0
  53. techtree/models/catalog.py +227 -0
  54. techtree/models/cli.py +151 -0
  55. techtree/models/climb.py +254 -0
  56. techtree/models/data_policy.py +130 -0
  57. techtree/models/engine.py +156 -0
  58. techtree/models/episode_receipt.py +130 -0
  59. techtree/models/evaluation_backend.py +113 -0
  60. techtree/models/experiment.py +154 -0
  61. techtree/models/run.py +214 -0
  62. techtree/models/skill.py +156 -0
  63. techtree/models/uplift_report.py +158 -0
  64. techtree/models/validation.py +299 -0
  65. techtree/paths.py +116 -0
  66. techtree/presentation/__init__.py +31 -0
  67. techtree/presentation/build.py +1242 -0
  68. techtree/presentation/compact.py +246 -0
  69. techtree/presentation/evidence.py +169 -0
  70. techtree/presentation/models.py +358 -0
  71. techtree/presentation/rich.py +312 -0
  72. techtree/presentation/sanitize.py +156 -0
  73. techtree/publication/__init__.py +44 -0
  74. techtree/publication/address.py +180 -0
  75. techtree/publication/coordinates.py +26 -0
  76. techtree/publication/journal.py +212 -0
  77. techtree/publication/keccak.py +183 -0
  78. techtree/publication/models.py +209 -0
  79. techtree/publication/offer.py +35 -0
  80. techtree/publication/service.py +618 -0
  81. techtree/publication/transport.py +296 -0
  82. techtree/publication/verify.py +242 -0
  83. techtree/publication/withdraw.py +156 -0
  84. techtree/py.typed +0 -0
  85. techtree/receipts/__init__.py +52 -0
  86. techtree/receipts/bundle.py +578 -0
  87. techtree/receipts/compare.py +1065 -0
  88. techtree/receipts/episode.py +672 -0
  89. techtree/receipts/execution.py +630 -0
  90. techtree/receipts/observed.py +474 -0
  91. techtree/receipts/set.py +336 -0
  92. techtree/receipts/uplift.py +655 -0
  93. techtree/receipts/verify.py +1055 -0
  94. techtree/release/__init__.py +9 -0
  95. techtree/release/bootstrap.py +509 -0
  96. techtree/release/checks.py +376 -0
  97. techtree/release/document.py +125 -0
  98. techtree/release/generate.py +221 -0
  99. techtree/release/models.py +293 -0
  100. techtree/release/provenance.py +109 -0
  101. techtree/resources/catalog/campaigns/hello-world-climb.json +1 -0
  102. techtree/resources/catalog/catalog.json +32 -0
  103. techtree/resources/catalog/climbs/hello-world-climb.json +1 -0
  104. techtree/resources/catalog/data-policies/hello-world-climb.json +1 -0
  105. techtree/resources/catalog/taskset-validations/hello-world-climb.json +1 -0
  106. techtree/resources/catalog/validation-evidence/hello-world-climb.json +1 -0
  107. techtree/resources/engines/default/engine.json +20 -0
  108. techtree/resources/engines/default/packages/procedure-transfer-v1/procedure_transfer_v1/__init__.py +7 -0
  109. techtree/resources/engines/default/packages/procedure-transfer-v1/procedure_transfer_v1/algorithm.py +136 -0
  110. techtree/resources/engines/default/packages/procedure-transfer-v1/procedure_transfer_v1/dataset.py +156 -0
  111. techtree/resources/engines/default/packages/procedure-transfer-v1/procedure_transfer_v1/env.py +48 -0
  112. techtree/resources/engines/default/packages/procedure-transfer-v1/procedure_transfer_v1/taskset.py +163 -0
  113. techtree/resources/engines/default/packages/procedure-transfer-v1/pyproject.toml +13 -0
  114. techtree/resources/engines/default/pyproject.toml +23 -0
  115. techtree/resources/engines/default/tools/inspect_taskset.py +124 -0
  116. techtree/resources/engines/default/tools/normalize_eval_output.py +470 -0
  117. techtree/resources/engines/default/tools/normalize_validation.py +222 -0
  118. techtree/resources/engines/default/uv.lock +1758 -0
  119. techtree/resources/harness/hermes-agent-0.19.0.json +69 -0
  120. techtree/resources/release/build-provenance.json +4 -0
  121. techtree/resources/release/release-core.json +24 -0
  122. techtree/runs/__init__.py +31 -0
  123. techtree/runs/artifacts.py +750 -0
  124. techtree/runs/child_registry.py +228 -0
  125. techtree/runs/events.py +478 -0
  126. techtree/runs/executor.py +140 -0
  127. techtree/runs/fake.py +741 -0
  128. techtree/runs/launcher.py +253 -0
  129. techtree/runs/machine.py +489 -0
  130. techtree/runs/real.py +789 -0
  131. techtree/runs/service.py +616 -0
  132. techtree/runs/store.py +555 -0
  133. techtree/runs/validation.py +259 -0
  134. techtree/runs/variants.py +684 -0
  135. techtree/settings.py +143 -0
  136. techtree/skills/__init__.py +14 -0
  137. techtree/skills/archive.py +282 -0
  138. techtree/skills/policy.py +62 -0
  139. techtree/skills/scanner.py +394 -0
  140. techtree/skills/service.py +752 -0
  141. techtree/skills/starter.py +434 -0
  142. techtree/tasksets/__init__.py +1 -0
  143. techtree/tasksets/membership.py +269 -0
  144. techtree/tasksets/provider.py +207 -0
  145. techtree/tasksets/resolver.py +311 -0
  146. techtree/tasksets/service.py +484 -0
  147. techtree/tasksets/verifiers_cli.py +538 -0
  148. techtree/uplift/__init__.py +20 -0
  149. techtree/uplift/context.py +544 -0
  150. techtree/uplift/derive.py +203 -0
  151. techtree/uplift/public_tasks.py +151 -0
  152. techtree/uplift/service.py +719 -0
  153. techtree/uplift/source.py +160 -0
  154. techtree/verifiers/__init__.py +31 -0
  155. techtree/verifiers/budget.py +219 -0
  156. techtree/verifiers/child.py +633 -0
  157. techtree/verifiers/compiler.py +432 -0
  158. techtree/verifiers/config.py +365 -0
  159. techtree/verifiers/credentials.py +321 -0
  160. techtree/verifiers/image.py +126 -0
  161. techtree/verifiers/models.py +527 -0
  162. techtree/verifiers/outputs.py +368 -0
  163. techtree/verifiers/progress.py +192 -0
  164. techtree/verifiers/supervisor.py +341 -0
  165. techtree/verifiers/verify.py +782 -0
  166. techtree/version.py +39 -0
  167. techtree/worker/__init__.py +18 -0
  168. techtree/worker/execute.py +487 -0
  169. techtree/worker/main.py +57 -0
  170. techtree-0.1.0.dist-info/METADATA +344 -0
  171. techtree-0.1.0.dist-info/RECORD +174 -0
  172. techtree-0.1.0.dist-info/WHEEL +4 -0
  173. techtree-0.1.0.dist-info/entry_points.txt +3 -0
  174. techtree-0.1.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,344 @@
1
+ Metadata-Version: 2.5
2
+ Name: techtree
3
+ Version: 0.1.0
4
+ Summary: Techtree Climb CLI, detached worker, managed Verifiers engine, and Campaign protocol kernel.
5
+ Author: Techtree
6
+ License-File: LICENSE
7
+ Keywords: campaign,climb,evaluation,techtree,verifiers
8
+ Classifier: Programming Language :: Python :: 3.12
9
+ Classifier: Programming Language :: Python :: 3.13
10
+ Requires-Python: <3.14,>=3.12
11
+ Requires-Dist: cryptography<47,>=45
12
+ Requires-Dist: filelock<4,>=3.18
13
+ Requires-Dist: platformdirs<5,>=4
14
+ Requires-Dist: pydantic<3,>=2.12
15
+ Requires-Dist: rfc8785<1,>=0.1
16
+ Requires-Dist: rich<15,>=14
17
+ Requires-Dist: tomli-w<2,>=1.2
18
+ Requires-Dist: typer<1,>=0.16
19
+ Description-Content-Type: text/markdown
20
+
21
+ # Techtree
22
+
23
+ [![License: MIT](https://img.shields.io/badge/license-MIT-lightgrey)](LICENSE) [![Python 3.12](https://img.shields.io/badge/python-3.12-lightgrey)](https://www.python.org/downloads/) [![managed with uv](https://img.shields.io/badge/managed%20with-uv-lightgrey)](https://docs.astral.sh/uv/)
24
+
25
+ ![techtree proof verify — 339 checks, offline](docs/assets/proof-verify.svg)
26
+
27
+ *`techtree proof verify` reading a finished run’s proof bundle from the bytes
28
+ that run stored.*
29
+
30
+ Techtree is the open improvement and proof network for agent systems. Agents
31
+ compete on executable environments, Skills and harnesses climb through
32
+ controlled trials, and every improvement produces reproducible evidence.
33
+
34
+ This repository contains the Techtree CLI, detached worker, managed Verifiers
35
+ engine, and Campaign protocol kernel.
36
+
37
+ ## Climb v0.1
38
+
39
+ > [!IMPORTANT]
40
+ > Techtree Climb v0.1 is a proof of concept for a stack of three independent
41
+ > parts: Prime Intellect’s Verifiers as the evaluation engine,
42
+ > Nous Research’s Hermes as the agent host, and
43
+ > Techtree as the campaign kernel and evidence layer.
44
+ > What it demonstrates is that the three pin together tightly enough for a
45
+ > controlled comparison to run end to end and leave a receipt that verifies
46
+ > offline. It is a development release, and nothing here is a measurement
47
+ > anyone should cite.
48
+
49
+ ```text
50
+ you
51
+ │ one pasted prompt
52
+ ▼
53
+ Hermes (operator) ······ techtree-hermes
54
+ │ fixed argv · one JSON envelope
55
+ ▼
56
+ Techtree CLI ··········· techtree-python ◀ this repository
57
+ │ pinned engine, detached runs
58
+ ▼
59
+ Verifiers evaluation ··· (Prime Intellect, pinned to an exact commit)
60
+ │ model calls, paid by the participant
61
+ ▼
62
+ subject: hermes-agent + pinned model, in a pinned container
63
+ │
64
+ ▼
65
+ signed report · proof that verifies offline
66
+
67
+ techtree-ash ─ the site: pinned guide, catalog, published objects, run log
68
+ ```
69
+
70
+ ## The other two repositories
71
+
72
+ - **[techtree-hermes](https://github.com/regents-ai/techtree-hermes)** — the
73
+ Hermes plugin that gives this CLI a conversational operator: it explains,
74
+ prepares, asks for approval, and relays results. It invokes fixed command
75
+ arrays and reads one machine-readable envelope back — evaluation logic never
76
+ lives in the plugin.
77
+ - **[techtree-ash](https://github.com/regents-ai/techtree-ash)** — the website
78
+ at techtree.sh: the pinned installation guide, the campaign catalog, the
79
+ published protocol objects, the public run log, and the docs. Everything it
80
+ shows is served over GET. It has one address that accepts anything, and what
81
+ that address accepts is a signed run somebody chose to publish.
82
+
83
+ The evaluation engine, the agent host, and the container the subject runs in
84
+ are each pinned to an exact version, and the release is only as reproducible as
85
+ those pins. Those are the seams of the stack, and they are worth knowing about
86
+ before anyone leans on a result.
87
+
88
+ | Layer | What | Pin |
89
+ | --- | --- | --- |
90
+ | Evaluation engine | Prime Intellect’s Verifiers | pinned to an exact commit |
91
+ | Agent host | Nous Research’s Hermes, the operator | host Hermes 0.20.1 or newer |
92
+ | Evaluated subject | hermes-agent, in a pinned container | 0.19.0 |
93
+ | Subject model | qwen/qwen3.7-flash, reached through prime | named by the Campaign |
94
+ | Campaign kernel and evidence | the Techtree CLI | Python 3.12, managed with uv |
95
+
96
+ Techtree Climb v0.1 (“Techtree Hello World”) is a toy, synthetic demonstration
97
+ of Skill uplift. It runs the same pinned agent on the same tasks twice, changes
98
+ only the declared Skill, shows the measured difference, and creates a signed
99
+ local receipt with an offline proof check.
100
+
101
+ The repository contains the real evaluation path: managed engine installation,
102
+ containerized subject runs, append-only run records, signed receipts and
103
+ reports, local proof verification, and one guided single-`SKILL.md` revision
104
+ flow. The release candidate remains inactive until the release gates in
105
+ `docs/v0.1-remaining-tickets.md` are complete and the founder gives the exact
106
+ final approval phrase.
107
+
108
+ > [!NOTE]
109
+ > No Techtree account is required. A model-provider account and an active Prime
110
+ > CLI configuration are required for the introductory comparisons, which spend
111
+ > model tokens.
112
+ > Techtree uploads nothing unless you publish a run yourself, and what travels
113
+ > then is the receipt, never the episodes.
114
+ > Model inference is sent to the selected provider under that provider’s policies.
115
+ > The resulting evidence is participant-attested and has not been independently reproduced.
116
+
117
+ ## Campaign kernel
118
+
119
+ Climb is a public wrapper around a reusable CampaignSpec. Execution artifacts
120
+ reference the CampaignSpec, not the public Climb directly.
121
+
122
+ A Climb owns public identity: slug, version, title, status, schedule, and the
123
+ candidate, publication, and leaderboard policies. A CampaignSpec owns the
124
+ science: taskset reference, selection and membership commitment, environment,
125
+ named agents, evaluation backend, scoring, evidence requirements, and budgets.
126
+ Every campaign points at a DataPolicy, and every artifact a run produces
127
+ carries that policy’s digest, so the rights attached to a submission cannot
128
+ change quietly between preparation and publication.
129
+
130
+ ## Source installation
131
+
132
+ Techtree supports Python 3.12 and 3.13. Release acceptance journeys use a
133
+ pinned Python 3.12 interpreter. Use [uv](https://docs.astral.sh/uv/) for every
134
+ workflow.
135
+
136
+ ```bash
137
+ uv sync --python 3.12
138
+ uv run techtree --version
139
+ ```
140
+
141
+ That creates the project environment and installs the `techtree` and
142
+ `techtree-worker` executables into it. It is a source-development install, not
143
+ the public-coordinate release journey.
144
+
145
+ ## The evaluation credential
146
+
147
+ > [!WARNING]
148
+ > Starting a comparison spends model tokens against your own provider credit.
149
+ > Nothing causing LLM token spend starts on its own: `techtree climb start` and
150
+ > `techtree uplift start` put the prepared comparison in front of you first and
151
+ > begin only once you have approved it.
152
+
153
+ Running a comparison pays for the evaluated agent’s model calls, and that
154
+ credential is yours. Techtree never stores it, never logs it, and never puts it
155
+ in a run’s files. It is also separate from whatever host agent you are talking
156
+ to.
157
+
158
+ **Exporting it in your terminal is not enough.** A comparison does not run
159
+ inside the command you typed: `techtree climb start` and `techtree uplift start`
160
+ hand the work to a separate background process, and that process is given a
161
+ deliberately small environment so that unrelated local state cannot lean into
162
+ an experiment. Variables exported in the shell are not passed to it. A run
163
+ that cannot find the credential stops before model inference begins and says
164
+ so.
165
+
166
+ The supported path is an active Prime CLI configuration:
167
+
168
+ ```bash
169
+ prime login
170
+ techtree doctor --climb hello-world-climb@1
171
+ ```
172
+
173
+ Naming the Climb is what asks about the credential. `--for-evaluation` checks
174
+ the machine — that anything could run here — and `--climb` checks the subject
175
+ this Climb would run: its model credential and its container image. It implies
176
+ `--for-evaluation`, so the command above is the complete check.
177
+
178
+ The credential line answers for the detached run rather than for the terminal
179
+ that invoked Doctor. It never prints the credential itself. A present but
180
+ revoked credential can still fail at the provider’s first model call.
181
+
182
+ ## Local development
183
+
184
+ ```bash
185
+ make install # uv sync
186
+ make format # rewrite formatting and apply safe lint fixes
187
+ make check # format-check, lint, typecheck, test, generated-check
188
+ make test-integration
189
+ ```
190
+
191
+ `make check` and `make test-integration` are the repository gates. The
192
+ scientific environment is separate: the managed engine under
193
+ `src/techtree/resources/engines/default/` has its own pinned dependencies and
194
+ lock file, and the ordinary package never depends on Verifiers, Hermes, or
195
+ NeMo Relay.
196
+
197
+ ## Command overview
198
+
199
+ | Group | Commands | What it does |
200
+ | --- | --- | --- |
201
+ | Getting ready | `techtree setup`<br>`techtree doctor --climb <climb-slug>` | Prepares this machine to run a Climb, and checks that it is ready. Naming a Climb also checks the subject that Climb would run: its model credential and its container image. |
202
+ | Climbs | `techtree climb list`<br>`techtree climb show <climb-slug>`<br>`techtree climb prepare <climb-slug> --skill <path>`<br>`techtree climb start <draft-id>` | Shows the Climbs available in this build; shows what one measures, the data rights it carries, and whether this machine can run it; prepares a Skill for submission; and starts a prepared submission running. |
203
+ | Runs | `techtree run status <run-id> --watch`<br>`techtree run logs <run-id> --tail 200`<br>`techtree run result <run-id>` | Shows how a run is progressing, shows its log output, and shows the finished report for a run. |
204
+ | Proof | `techtree proof verify <run-id>` | Checks a local proof offline, from the bytes the run stored. |
205
+ | Improving a Skill | `techtree uplift context <run-id>`<br>`techtree uplift prepare --from-run <run-id> --candidate-skill <path>`<br>`techtree uplift start <draft-id>` | Exports the sanitized improvement context for a finished run, prepares a comparison between that run’s Skill and a revision of it, and starts the prepared comparison. |
206
+
207
+ The detached worker is started by the CLI and is not a user-facing command.
208
+ Every command has rendered output for a person and, with `--json`, exactly one
209
+ JSON object on standard output for another program. Logs go to standard error.
210
+
211
+ ## Configuration
212
+
213
+ | Setting | What it does |
214
+ | --- | --- |
215
+ | `--home <path>` | The directory Techtree keeps its local state in. |
216
+ | `TECHTREE_OUTPUT_MODE` | `json` emits one JSON envelope instead of human output; `human` otherwise. |
217
+ | `TECHTREE_LOG_LEVEL` | The level of the operational detail written to standard error; `INFO` unless set. |
218
+ | `TECHTREE_ACTIVE_ENGINE_DIGEST` | The digest of the managed evaluation engine to use. |
219
+
220
+ An unrecognized `TECHTREE_*` variable is ignored rather than guessed at.
221
+
222
+ ## Local proof
223
+
224
+ A finished run signs its receipts and report with an Ed25519 key this machine
225
+ made and keeps. The signed documents travel together in a proof bundle inside
226
+ the run directory, and `techtree proof verify` checks that bundle from its
227
+ stored bytes. The proof check needs no network, no Techtree account, and no
228
+ Techtree service state, so a copied bundle can be checked on another machine.
229
+
230
+ A verified proof makes a bounded claim: the participant’s key vouches for
231
+ bytes that verify against one another. Nobody else witnessed the computation,
232
+ and the comparison has not been independently reproduced. Running the
233
+ comparison is different from checking its proof: model inference is sent to
234
+ the model provider whose credentials the run uses.
235
+
236
+ ## Improving a Skill
237
+
238
+ A finished run can be continued. `techtree uplift context` writes a sanitized
239
+ account of what the run showed—the objective, headline numbers, and tasks worth
240
+ looking at—for a host agent to read before proposing a revision. It carries no
241
+ hidden expected answer, grader material, credential, local path, or transcript
242
+ of what the evaluated agent replied.
243
+
244
+ `techtree uplift prepare` sets up the second comparison: the Skill measured in
245
+ the first run versus the revision, with everything else held fixed. The
246
+ baseline is pinned to the archived Skill rather than to a mutable directory.
247
+ The revision goes through the same scanner and controlled-comparison checks,
248
+ and the data policy is shown and accepted again before the second run starts.
249
+ The second comparison produces its own signed report and local proof.
250
+
251
+ The CLI does not write the revision and does not call a model to propose one.
252
+ That one proposal belongs to the host-agent layer and is separately
253
+ approval-gated.
254
+
255
+ ## Repository architecture
256
+
257
+ ```text
258
+ src/techtree/ CLI package
259
+ models/ protocol objects
260
+ cli/ Typer commands and rendering
261
+ catalog/ embedded campaign and Climb catalog
262
+ skills/ Skill scanning and archiving
263
+ manifests/ drafts/ experiment manifests and prepared submissions
264
+ runs/ worker/ run state, events, and detached execution
265
+ engines/ managed engine registry, installer, and runner
266
+ tasksets/ taskset resolution, membership, and validation
267
+ resources/ embedded catalog, release contract, and engine bundle
268
+ docs/ architecture, protocol, decisions, and release contracts
269
+ release/ release inputs, generated contract, and audit records
270
+ schemas/v1alpha1/ exported JSON Schemas
271
+ tools/ generators and unpackaged release verification tools
272
+ plugin/ tooling for the Hermes plugin in the sibling checkout
273
+ tests/ unit, contract, integration, preflight, and fixtures
274
+ plugin/ the Hermes plugin's own suite (`make test-plugin`)
275
+ ```
276
+
277
+ Dependencies point inward: commands depend on services, services depend on
278
+ protocol models, and protocol models depend on nothing in the package.
279
+
280
+ ## Testing
281
+
282
+ ```bash
283
+ make test
284
+ make test-unit
285
+ make test-contract
286
+ make test-integration
287
+ make verifiers-preflight
288
+ make test-plugin
289
+ ```
290
+
291
+ Integration and preflight tests are excluded from the default pytest selection
292
+ because they are slower and, for preflight, require the pinned Verifiers build.
293
+ No test reads or writes a real user home; suites work inside a temporary
294
+ Techtree home.
295
+
296
+ `make test-plugin` runs the Hermes plugin's own battery, which lives here
297
+ rather than in the plugin checkout: it carries fixtures written to look exactly
298
+ like the attacks the plugin's guards refuse, and the plugin checkout is what an
299
+ install-time scanner reads before a host will install it. The suite reads the
300
+ plugin out of the `techtree-plugin` checkout beside this one, and says so if it
301
+ is not there. `make typecheck-plugin` type-checks it.
302
+
303
+ ## Security boundaries
304
+
305
+ - Skills are untrusted input. The CLI scans and archives them; it does not
306
+ execute submitted Skill files.
307
+ - Completed evidence is append-only. The product never rewrites a finished
308
+ run’s stored bytes.
309
+ - Receipts and reports use Ed25519 signatures, and proof verification reads the
310
+ stored bundle rather than a Techtree service.
311
+ - Provider credentials are not stored in Techtree settings, logs, arguments,
312
+ drafts, runs, receipts, reports, or proof bundles.
313
+ - Detached workers receive a deliberately scrubbed environment. Do not loosen
314
+ the allow-list in `src/techtree/runs/launcher.py`.
315
+ - Displayed commands are argument vectors for a person or host to review. The
316
+ CLI does not execute a model-authored shell string.
317
+ - Local state is created under private Techtree directories. The website's
318
+ release surface is read-only; its one write address takes a signed
319
+ publication or withdrawal and nothing else.
320
+
321
+ ## Generated files
322
+
323
+ Some committed files are generated and must never be hand-edited: the JSON
324
+ Schemas under `schemas/`, protocol goldens under `tests/golden/`, the embedded
325
+ catalog under `src/techtree/resources/catalog/`, the managed engine bundle
326
+ under `src/techtree/resources/engines/`, and generated release-contract copies.
327
+
328
+ ```bash
329
+ make regenerate
330
+ make generated-check
331
+ ```
332
+
333
+ `make generated-check` regenerates into a temporary tree and does not write to
334
+ the working tree.
335
+
336
+ ## Protocol and release documentation
337
+
338
+ - `docs/protocol-v1alpha1.md` — normative protocol definition
339
+ - `docs/architecture.md` — system architecture
340
+ - `docs/cli-json-contract.md` — machine-mode CLI contract
341
+ - `docs/run-state-machine.md` — internal lifecycle and public projection
342
+ - `docs/agent-handoff.md` — current three-repository handoff
343
+ - `docs/v0.1-remaining-tickets.md` — remaining release work and contracts
344
+ - `docs/decisions/` — binding decisions
@@ -0,0 +1,174 @@
1
+ techtree/__init__.py,sha256=dAAknsyf6O7zTggmdZzPOCfY4zum36qBmFKS-0TJ7gc,1247
2
+ techtree/__main__.py,sha256=3ztj_jACAcwa522hzIhMzXbgBR2_4MMLMAKbiH4-qxQ,264
3
+ techtree/canonical.py,sha256=aUD3ibMgytLX_j2MrB25QKAaaCq0pxPpwFmCxX46CgQ,8759
4
+ techtree/constants.py,sha256=bk8kBHdj3_zCBBrp-ZJ9qhth0HB2GyXX4OY_v-OoF6Y,6626
5
+ techtree/crypto.py,sha256=D9srgvpIT6ZHMdcDBw3_31tRCyZyjZQ_ncirMiwVWQo,4241
6
+ techtree/errors.py,sha256=elOOrr2ouEeHXzhsOVOtbXEUs32QMgeNIb7NNe2wuNc,9079
7
+ techtree/fs.py,sha256=uhnhe8aCyDumFdmjhyH7po0HIQoY2ZnIDU50-k8KU6s,8211
8
+ techtree/harness.py,sha256=goPWwZW77fi_KDRTnR0IgExPavcI_liLAZL9ej_OZPI,4220
9
+ techtree/ids.py,sha256=jMUXR4V9mPXgll5HnoGip_QrUCiSJPXgxsWvrFf_tNg,2470
10
+ techtree/paths.py,sha256=1RKsHRSLRaFuwlUtHqU8hYQIWjwVLG31E2ArlwWHX28,3940
11
+ techtree/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
+ techtree/settings.py,sha256=_9E0-NYnNhEptX229IAeRKOp3eFVNP09zd3U2VkjVKE,5079
13
+ techtree/version.py,sha256=2LvJNOjEji0BvHEwgv3ok1sbhm8Fu4j8gi03lrPdjgQ,1156
14
+ techtree/catalog/__init__.py,sha256=wdSZ37YuqUUzqhFCZpU8UylN-VlrqzG-778Pp0UZxEQ,1008
15
+ techtree/catalog/repository.py,sha256=NlBsN-JV4PzTj_EZsnFxKeerdSFbaHkI3OU0GO9Mzxs,16008
16
+ techtree/catalog/service.py,sha256=L_o-Hdou0tTiFtTUQ9xX_RWGmrWTTVugFmRqyFaK1kQ,17591
17
+ techtree/cli/__init__.py,sha256=A0k0cron7ApRQli4IZNSmiJXRbW9Y7tC-U-6E_eVz7k,39
18
+ techtree/cli/app.py,sha256=k-NvEu1HnnzV4_urx9ejrEu54ro4iNPDf5xLU1G8Ldw,13985
19
+ techtree/cli/confirm.py,sha256=mh9prDJ2ThKGkg6mnoqxEqFAF8vQzmMdAds5PSnKReM,2204
20
+ techtree/cli/context.py,sha256=w1MxZT4xU2kgwvrI4llu8HBDaXU_H0MFhOKV4KwQLTo,2902
21
+ techtree/cli/invoke.py,sha256=8gSW2had29qxJwbMNP96c1kkdZxIikRL0iym_3gOghc,7135
22
+ techtree/cli/output.py,sha256=5Uiu2u2spKcGbjFytmgd0Tz8e0VlTWudoiAz5AuTleY,10043
23
+ techtree/cli/commands/__init__.py,sha256=CuYTl1hsALQq2sSqovv8ou5NjfmOBSiUxYNSD8MiduY,76
24
+ techtree/cli/commands/climb.py,sha256=02HsgonKovd8cU6KYFbj5QCpAV_2GHiyLxmndXI0-_w,46714
25
+ techtree/cli/commands/doctor.py,sha256=YBNaGqlguX2_gNjgVmyQBky5FWCwZhISnih0dgbu0zI,5358
26
+ techtree/cli/commands/engine.py,sha256=Rxo3a64MvkXELVRgeTooj92gHrzj8r1h-avJf39w9VU,7559
27
+ techtree/cli/commands/proof.py,sha256=IspgIBnpx_A6GLbDp8uOI-FOq6nTleBGq3S_37YeXFQ,20230
28
+ techtree/cli/commands/publish.py,sha256=syHZ_9EpbrPzo4y-ymvTQrGRrGatfu9cloEqStXEx1Q,17582
29
+ techtree/cli/commands/release.py,sha256=QGxBeX0GZRWmFwgdZGlx93V3QXBkMgIouqp1Zp_rNdU,10441
30
+ techtree/cli/commands/run.py,sha256=FfWiP9FSgVRAkC-e7evxmdJE7SdhnKC_CNdqtjiWyt0,39217
31
+ techtree/cli/commands/setup.py,sha256=dEVXvSPK37LVvgX5TDwYtYdj-8rEwHHjjf19frsDTG8,6836
32
+ techtree/cli/commands/skill.py,sha256=PfXvSniedEX_sdroNN5a9FDXP6oZFdsdASq-TY4-wnU,8886
33
+ techtree/cli/commands/uplift.py,sha256=W8XSsyR6u5Q0oWreCldlaJyi2cbm8RNy7Y4jlnWKwGY,25423
34
+ techtree/cli/commands/withdraw.py,sha256=P_L0X6_ol6CWhUoh1nTf1vyyD00bX9rGubkoohjWrfk,7885
35
+ techtree/doctor/__init__.py,sha256=ANMirRJTHkluqHcnrBstPLhNAzCvr6YK96ersAKSm5Q,81
36
+ techtree/doctor/checks.py,sha256=XTZRRbblyQH0xQbf8tGdD7WSK7py3jdAHzVL9f2PQ2M,23505
37
+ techtree/doctor/execution_checks.py,sha256=s-4oKr97ijqVGZHPqPkBE2eBOSE_3gmZ_g6IRtVNqus,16342
38
+ techtree/doctor/service.py,sha256=3xQRbaGu5JRV-UtqyyqWZmHxB5EkbNy6o0DFRYUelok,12265
39
+ techtree/drafts/__init__.py,sha256=YYgsjZZQak965IyN32b3PLiimLQMC4hJOEoAIn-2ITA,1389
40
+ techtree/drafts/source.py,sha256=PWaLMqnUx5YDdPkNbTWG3d1lJzyQiVf5FW0ICpI1frw,6045
41
+ techtree/drafts/store.py,sha256=UQdBat-xBUEnzMrnbrzaNJlA8LJdZdB03a44fGxLH5U,38727
42
+ techtree/engines/__init__.py,sha256=JwBGKo1t4fCypvLMazCoGiRnt37_-uY4Lm9zj1q7zgw,73
43
+ techtree/engines/bundle.py,sha256=DCsROQKWywFRxQJ3BVJ9_pUh9PXr-O3AMOPYaC9N-0Y,9394
44
+ techtree/engines/installer.py,sha256=fYl80_eYT10yDgu746zypmxitR6OYAc-yaP2reM8Ghs,26259
45
+ techtree/engines/registry.py,sha256=mbI6litfjYGAZEy_DUsXMmOzXFxemjdSDJBEpv-QrGA,9008
46
+ techtree/engines/runner.py,sha256=UqyYwQVaUF5nySvh19apzKg5ClTS38sVfqaspaA1dho,6076
47
+ techtree/identity/__init__.py,sha256=wDjmhZRe2tSPvsJBIiJqaMevdNKHxJg3oh4I-h0tpR0,1814
48
+ techtree/identity/models.py,sha256=KmShqLRGPqIF2_OYVscH5UPk1iTxQ1g6wuCHjEJJ8nE,4092
49
+ techtree/identity/service.py,sha256=0bO19rudyHpxAbE7X4NhF2hlfQL9UUPQK2-KpgGi4zA,7611
50
+ techtree/identity/store.py,sha256=jxH-uKhBreAuV5eI0Tr0-B1YnL4UZc6lHLFP6D8AEQU,10235
51
+ techtree/manifests/__init__.py,sha256=Ucisa2VgsSZe2_DD1hLSRODswsS4fri5YvG7O5Ye43s,1436
52
+ techtree/manifests/builder.py,sha256=U6LkpFIPsNYKDDesf9d6lR6E4VonUPo1L7yw3F8zmZg,17058
53
+ techtree/manifests/compare.py,sha256=V-i3CGTS-Mr_aFwp6QDHnJDzANJTJbZTMq1eNV6PFvo,14293
54
+ techtree/models/__init__.py,sha256=YE6DScusS5SysLmonTIY6rZsyqMFsk0oHkqq2IS6CSw,6486
55
+ techtree/models/base.py,sha256=lUIw8AlJZktkX77yjo-c7t10uOTkYYq35NmPzYyBPH4,6202
56
+ techtree/models/campaign.py,sha256=xUNaZ0QX0m0_x6sM0W1SMOQl2KMF-NHh_2dFDadjOkQ,16966
57
+ techtree/models/catalog.py,sha256=8e04FOZo2JN88AXLyJoNMWMKtPUPDewdQJuZW6gqhjw,8329
58
+ techtree/models/cli.py,sha256=tl75LsgKDs8FcdmMOAorvxspun2JYc7nNeH20R96K9k,4937
59
+ techtree/models/climb.py,sha256=MsoM8QgSuDDfmKpOBbp1jLf8wRcGywsESvW2zIWcSC0,9137
60
+ techtree/models/data_policy.py,sha256=DQCtP1WTEjKsTNPyGInpU-1LsIJZ4wnBZz1zaZjh0cU,4583
61
+ techtree/models/engine.py,sha256=v3RAzUb-uAbwyZCkG1u-SAGR2PIUWxvB2Jq4bQOlgjs,5369
62
+ techtree/models/episode_receipt.py,sha256=yXJC9Fb72ms-duNP2W_XblffrulQwuVIr_16WsSxY8M,4291
63
+ techtree/models/evaluation_backend.py,sha256=OsFV_ZBeTDF9kdgmSPBrlBN9LfErwOngtoEArgBC6Rk,4246
64
+ techtree/models/experiment.py,sha256=dvQVSr-d9DiqEHKXMskb5HwKHhC9SY6g9NpOtFHF4c4,5397
65
+ techtree/models/run.py,sha256=oQtijzVqJSN2ocovFJkqMMfviRD3mkqcTN7ovGmmdKs,7885
66
+ techtree/models/skill.py,sha256=0HomLyuNbEi9SeyevXwCYtaPgIqvVWBHjvC99H6hs80,5920
67
+ techtree/models/uplift_report.py,sha256=VWWUWHMeymC9Ilmd5kT2-uLeBcHIzbbSb4DakY4FMUw,5100
68
+ techtree/models/validation.py,sha256=ZeJyJqa5BqN1ARAlrVlcxdpB_PFiCUsRGP5wJRGVUp4,11115
69
+ techtree/presentation/__init__.py,sha256=yC881EXVJLuBkBQqC1uJD2KufMhdunYCFs6MWEm-iLo,1233
70
+ techtree/presentation/build.py,sha256=tfK_n12qpxM1rtIGUwoOptE1Nd40AqXl-XZdDO-inm4,50380
71
+ techtree/presentation/compact.py,sha256=u_z1vjkcpidIh0uMKxNgVRiM_hx4MfJVRVay-foV8P8,9602
72
+ techtree/presentation/evidence.py,sha256=xA3Gj34Zpcm9cURxwLVChsK4AkmnEh6tWhQhVqjkeuM,6246
73
+ techtree/presentation/models.py,sha256=RuX3kvwFRJWYr-0XME4vWZfj_Ln6Coh4RWovUahgMP8,14184
74
+ techtree/presentation/rich.py,sha256=9ASumHkNOHMvyzOWpBY3YhQsOnB9UtHFjwjXAbMwNt8,11864
75
+ techtree/presentation/sanitize.py,sha256=lu-KEkXcQUMeXZBSYIA-Y-tri6nBA1E0Dx1fXJWeGBo,6507
76
+ techtree/publication/__init__.py,sha256=dEfnb9UozV6GdBVJYlmxcAikz0IHJAt5XvgxoU_xm70,1817
77
+ techtree/publication/address.py,sha256=lXUp4pbFGgxK-tghbFeGOC9VPqC-APcMOzg62WOBp9w,7169
78
+ techtree/publication/coordinates.py,sha256=K_ZCHR_S_vdWZ1yatbNSNNl21-aEQyGBnEmtZewrTrU,1154
79
+ techtree/publication/journal.py,sha256=TX-uydq1lAn-X9C5fsTimnsVORGenM0fnBycxuwn93s,8905
80
+ techtree/publication/keccak.py,sha256=wLNFq4yeJqWeQpLo0tQI0snVlGq2VOrhOai8ADOFJMM,5844
81
+ techtree/publication/models.py,sha256=L3vkjAxoMvdgtScVnYpZa3TDGQfJiDV0YkjxXHs9nWU,9704
82
+ techtree/publication/offer.py,sha256=y60VN1MjYaXfoEZANwdWnzzSQxmQQuEJ5lLOsUMbqj8,1372
83
+ techtree/publication/service.py,sha256=uGY1_A9EoBtTGoD24WDPs6rqLoo07Q8SLOpCsiPhl0c,26341
84
+ techtree/publication/transport.py,sha256=ahlnx1nQT4CfKmhqSvyNhAIHYzRflosHoXoMpZczNi4,12510
85
+ techtree/publication/verify.py,sha256=C5JYWnSm7uwIoBRmueQcoYkMQ9WGdsM8JlEt8CQAn8o,9383
86
+ techtree/publication/withdraw.py,sha256=wmNw9zOZMQk4dm7_t60Dq04ZNe8BAEBK9tK61XdLQEk,6188
87
+ techtree/receipts/__init__.py,sha256=Vbyum8eNxDgdOvctcrSedb0EdqFsWhhwX0dEhtSwTMQ,2432
88
+ techtree/receipts/bundle.py,sha256=hJD38M-tn_wtkmuTmkkyEjjqSD_Nk4qgLGqukMQJthw,21992
89
+ techtree/receipts/compare.py,sha256=uxUe0k_KJh-oibRi3UipIXjpaVt9dRKqWYEtJ4UVprg,41101
90
+ techtree/receipts/episode.py,sha256=j-z1tKBnKLecOOp3eDq3lKpPMTY6ZvlBH1A9R_abGvA,26525
91
+ techtree/receipts/execution.py,sha256=By_uabummUJYONdX9Lk-0IRL7KgpGRqgwmpV6pJSNXM,24719
92
+ techtree/receipts/observed.py,sha256=5G_XW6umbB-jhsPTRgGU7Dh4uyVLJPkObKgTvgY_vAQ,19881
93
+ techtree/receipts/set.py,sha256=hlivQ0dWO9nMwXFElw_hoBpU5VL0HtvTYxDuTsfP_T8,12522
94
+ techtree/receipts/uplift.py,sha256=HfmKvtjhsmbRUmjD6LFrHoR-rHiVsGYBYOQjUwhscCs,26179
95
+ techtree/receipts/verify.py,sha256=DIOkc7srN0VkBKYzxtdKoTJKC338Rcj0qQXj02jMGp8,38406
96
+ techtree/release/__init__.py,sha256=PR9YYD-i3WB8t5yfY6MJP5jgli7n1pvOuttM91HZdaM,418
97
+ techtree/release/bootstrap.py,sha256=PdXw3x1FpgcMBAYq63TaVlbhmbJvRYAheio5qEKjmmo,20178
98
+ techtree/release/checks.py,sha256=GW4XQj3r0XFj9l4Y9jHD5mUDYpSrb2u3CztQDbjPdaU,13388
99
+ techtree/release/document.py,sha256=MOqeNmxX01J36VKGICLj7T7VR30GUVH_jKlusFbGN0E,4623
100
+ techtree/release/generate.py,sha256=QNZgeJhDnG5ZZEgmYkoP_it8JG4kmPN-_0yV8Z2ZEZs,9438
101
+ techtree/release/models.py,sha256=mvjxcFnt3SeuZ09C68UG5kA7OcVjqsG10XJ7t39uiEk,12859
102
+ techtree/release/provenance.py,sha256=G-k0FleEGJxKsP8_oIQJVxMiNRexnO9olzX-hsbfqK0,4003
103
+ techtree/resources/catalog/catalog.json,sha256=EKf8xd4ZUcFFCZR8BRKk7rJHpwPN8BzD8mhYCXmn0Sw,1141
104
+ techtree/resources/catalog/campaigns/hello-world-climb.json,sha256=6_Apq7JmynTC3vUOsjAwURurDpKca_SmhpH5ta_VVLE,5086
105
+ techtree/resources/catalog/climbs/hello-world-climb.json,sha256=o6Xpxfm0DU8I-tVIUjd-IB_Q1t1Kz6TFZaDt-sMkojY,1016
106
+ techtree/resources/catalog/data-policies/hello-world-climb.json,sha256=bFMqQ9WVKGoIJgSBiQu7_6FtG03YlGXRzIOVCZ2evPk,681
107
+ techtree/resources/catalog/taskset-validations/hello-world-climb.json,sha256=SUS9ccqhopXgMyWxinr3U9DY_PeHGJyJJEIJFxzaEwI,1294
108
+ techtree/resources/catalog/validation-evidence/hello-world-climb.json,sha256=mRvl5CrL1Ixr2ar44fWlokeMCg5L8ErU8r6EtwKt7kM,6889
109
+ techtree/resources/engines/default/engine.json,sha256=bhRL-lkbYUadpwSYG5jVGKRet4UgqnYyUEt46qRnjp0,500
110
+ techtree/resources/engines/default/pyproject.toml,sha256=4-QjeuS1XzM_85NZ4lJ9tBr-Yh7Gzq6ASRSsJ11Pj3I,819
111
+ techtree/resources/engines/default/uv.lock,sha256=gSC6QigGfeWVyW4FLQ6jMcocH0SlTpF9jNFCy3Ei69s,225604
112
+ techtree/resources/engines/default/packages/procedure-transfer-v1/pyproject.toml,sha256=HHcvBp7mvKWOpaAGEJd9m_o2pzjfOvGO2GDkH47P0lA,318
113
+ techtree/resources/engines/default/packages/procedure-transfer-v1/procedure_transfer_v1/__init__.py,sha256=kN7FO_Ev8dn8UUhwiTxjRYkkmyNtWi60VJLTs2rq0WA,201
114
+ techtree/resources/engines/default/packages/procedure-transfer-v1/procedure_transfer_v1/algorithm.py,sha256=C05uIDVN6vhN6aH9QP_Wwr3rS7UAOBzLYQ2tBxijJus,3804
115
+ techtree/resources/engines/default/packages/procedure-transfer-v1/procedure_transfer_v1/dataset.py,sha256=AcYXY4ElAj08rDymbvffXr90BD_1DxnW__0FH0hQlmI,4841
116
+ techtree/resources/engines/default/packages/procedure-transfer-v1/procedure_transfer_v1/env.py,sha256=lWlI8qv-cosxEc3RTqbZvhxlME0oHF4koX10Ki6gp_M,2064
117
+ techtree/resources/engines/default/packages/procedure-transfer-v1/procedure_transfer_v1/taskset.py,sha256=YTgz1Z_TUYWQLPERvEuOngh1Mt44xqid4vmmgHOLp-o,5243
118
+ techtree/resources/engines/default/tools/inspect_taskset.py,sha256=vTQwDyXWFgJJ5OYjH8nw8dHAl_SoFv5k3Rh3t5kQNhY,4475
119
+ techtree/resources/engines/default/tools/normalize_eval_output.py,sha256=2vEGW6kU3fqZXq_06Ga6BYfAnkjxjORCQbyOm1bV17A,18453
120
+ techtree/resources/engines/default/tools/normalize_validation.py,sha256=cR54ACFAb-yFq893oiuo3saXXMlI05XsjUgIpFSchNM,8256
121
+ techtree/resources/harness/hermes-agent-0.19.0.json,sha256=5kiax5n2g8siWSnJcIr5fNO9DTBQdAXNEQkHR0ZpGnU,2437
122
+ techtree/resources/release/build-provenance.json,sha256=T1yn7kvwka76WfEaohBSPQW8sce0162CWT4AkIsVLdE,118
123
+ techtree/resources/release/release-core.json,sha256=yStgLoCXpkmMSfUlh6SG9G8s_Qp63-XLCCxemFJ-QKE,1215
124
+ techtree/runs/__init__.py,sha256=TlQ5gjKRL3JO8YYaZvEv3dHZk7jZDbG2glD_0kN2BX0,1132
125
+ techtree/runs/artifacts.py,sha256=ZBU_g_9ON4P0OkA7B8gK-RToTV7Uf8_icruNIUCsY8Y,29899
126
+ techtree/runs/child_registry.py,sha256=TOgvC8EPvgZ2IPbiRaJV_dM3K_g29eVHju8n9mEH96Q,8281
127
+ techtree/runs/events.py,sha256=UVKK0xrRIn_ZQZcLPUhjbRvxao4B8784Wp7drnSaFfA,17985
128
+ techtree/runs/executor.py,sha256=l-8Fmw1LMUPyPj-tz1xhhs7I33sFn8U41r0cvwTftKQ,5019
129
+ techtree/runs/fake.py,sha256=c4kIS6bOxvzG0owyeqrfDcMk19d9n-rCNRIq5iGgML8,28033
130
+ techtree/runs/launcher.py,sha256=GfOIrwFPsKfXzo6-Z_oM-DsmCsrOrpEWMoI4JMc9ULg,9707
131
+ techtree/runs/machine.py,sha256=kqnVi_EXTOo0nZ9bElh1zQxt9DdAf9QrAncIGuiuMbk,17623
132
+ techtree/runs/real.py,sha256=DpUpRJ3QNq-lAFrVZ_emmJPZga-oJ08XjCgg2RS-8Os,32271
133
+ techtree/runs/service.py,sha256=y7GOFIQow4uj6FL7Qpx1XV_3UAr6Yxc14Th2LWslUIg,24132
134
+ techtree/runs/store.py,sha256=qp984Cs7nWChBnXwMnzyTrdwcGSJWKc4OwBNUH6EtDg,21993
135
+ techtree/runs/validation.py,sha256=_3ydf_L78obWIpIbS7kcqnlUyQT_L6ULiiq3-h3kqaA,9599
136
+ techtree/runs/variants.py,sha256=Gw55DbaeUZ5H6Di8-7rA34vXwGEZiWJ1J5Wt2EZu5Qs,26149
137
+ techtree/skills/__init__.py,sha256=qdN3lydQ64Z_hfiFWXZgY1JihmP5AukshCNqqz7KEBQ,488
138
+ techtree/skills/archive.py,sha256=540QzCObg1BTTKdKv8XrdwV_sJzYMWY-HGadJas1vm0,10046
139
+ techtree/skills/policy.py,sha256=tOPu49zPf_8UOHs-6fYudVU5a_bjkmSmzq5C4LXDR7g,2238
140
+ techtree/skills/scanner.py,sha256=Sq2zoEWw9Fx8ykIxPyGHFAphgfBgy9fIZ9tsQFrh6sI,13438
141
+ techtree/skills/service.py,sha256=DKmC3P8npl1DMbuvvXL18rM6OVyv-K1CXRH7nA9eVOU,30829
142
+ techtree/skills/starter.py,sha256=miv-u-_XlskEPuS21Z5myznAm08jZzskl78yfvwm8LQ,17002
143
+ techtree/tasksets/__init__.py,sha256=T9aDszSjLoKOtdg-uNIDoKmQ5cJvc9Xvzg5uUPacKVY,75
144
+ techtree/tasksets/membership.py,sha256=bPGQcBV3SOLYr66j-fsI_IeDjOUBYc5gp11VO6nEQX8,10316
145
+ techtree/tasksets/provider.py,sha256=2lwrUj3xgKMKj9bnSxgXKpM2d_OBH-QX86QTvgv1gGE,8412
146
+ techtree/tasksets/resolver.py,sha256=emHwjbjFeTnNDZhThbGPHSi7BViIoB_QsKLegiPF0FE,12669
147
+ techtree/tasksets/service.py,sha256=HYjVSNpJIlCJqxlPFfIhmNAEYQsZhhrxGiPDnGtaFaA,17965
148
+ techtree/tasksets/verifiers_cli.py,sha256=_wZYRbJ9XZYBIEoSgiKRvG5zsEzXl5IzF-7kz1R8SlA,21554
149
+ techtree/uplift/__init__.py,sha256=dPknJrCZjvYtg3n0-IqKhQfHk7RYuscUTlWBUmXSUuU,844
150
+ techtree/uplift/context.py,sha256=FwbilYaFseqLKLTX4Aw-6hk9LTzqhd4nJkNxz0_HPYY,22162
151
+ techtree/uplift/derive.py,sha256=-71sTAH-ad4dMDOW2Ba2cwKzLfZ8wddSaBBLSghiaaY,8397
152
+ techtree/uplift/public_tasks.py,sha256=gtSdJtQ8fL2VjYZCqT1McPihLbn3duQqeFygE_buBSU,6474
153
+ techtree/uplift/service.py,sha256=dC1MxhNhtymXELyKdimRSv8LyhL7Pwj_AAN7fzBE8oc,29589
154
+ techtree/uplift/source.py,sha256=ZAuCBddX3IcJxnN-AscoqbNyT55VosSN-GGDWVKRpVs,6056
155
+ techtree/verifiers/__init__.py,sha256=nkzudaJRb7u6SfUz1jl9HjLB4KPzpmImaDsQc5jR_5w,1272
156
+ techtree/verifiers/budget.py,sha256=LQgmW83kkrwy9wdxk-qJJJu15VIfBtHa6Qm7YRQvHM0,9261
157
+ techtree/verifiers/child.py,sha256=25_jQKD83KiRm1GqDD4EVt5w5lKYmmvNXHmyaPsok_o,25103
158
+ techtree/verifiers/compiler.py,sha256=1cS8qwaZAeNoXz-paXWzb5Sb4VpG1GFNEJ1rUDyvCGI,16791
159
+ techtree/verifiers/config.py,sha256=4mQ520LZZ_fSHV487ewdxHtDWCimjn0QKkub7wDLXtQ,15078
160
+ techtree/verifiers/credentials.py,sha256=CGYT9-wGuTOCsAfl6JOkYEwVN5w_NM120GEj9pdOWrE,12463
161
+ techtree/verifiers/image.py,sha256=AiKWRu0XUScRIh03j2t5FMI9BqmE2q_KsF30rtaUOg4,5077
162
+ techtree/verifiers/models.py,sha256=DIBTFssxLvZNe7DRNEgyvVVDd0VNaiLs6gZSM2mSmII,20271
163
+ techtree/verifiers/outputs.py,sha256=IErfziVoZJyWeULlhFf__T-BXS1YVY2D-2_-_IFRtcA,14384
164
+ techtree/verifiers/progress.py,sha256=2ITxW7VUvQv99herIexuYq4sncFcitpeqFgGDp_V6-Q,6929
165
+ techtree/verifiers/supervisor.py,sha256=qmyDGB-hniihwDyBzF_l5jjuJ5aERvdu5euP-wRsQ0Y,13719
166
+ techtree/verifiers/verify.py,sha256=XIoquZpGdqZGHgOfGyehQrj5ObpoF9difFA6UUtcVKo,30669
167
+ techtree/worker/__init__.py,sha256=Kp3YbxrRYlsAz3lYIrBFROyCW9GtgZuGFmN6U9lsmBM,812
168
+ techtree/worker/execute.py,sha256=aETk7Wm5kNE_BdMnBSFP7noOPrK7mSbmdLkep_tifmE,18539
169
+ techtree/worker/main.py,sha256=o-assLf19M1YmXlFnglVbwkjmruuanku2tWrE3Lurjw,1801
170
+ techtree-0.1.0.dist-info/METADATA,sha256=kwAZOjNmhirx3WkNJDlf52vo2qJrJBSnh3gwdbeYOJw,16536
171
+ techtree-0.1.0.dist-info/WHEEL,sha256=zOwg4jB6zX2kU910N-cMawjivD6tO8NEWvE12je1bVk,87
172
+ techtree-0.1.0.dist-info/entry_points.txt,sha256=IfcuuTVg-T4pO3FJnBMWq252cFv6JluXeMD_hfBc6N4,95
173
+ techtree-0.1.0.dist-info/licenses/LICENSE,sha256=--yhONQpHE1-laUyaT0ZDkDkYhfNZVs2O9fY3liJAPU,1069
174
+ techtree-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.32.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ techtree = techtree.cli.app:main
3
+ techtree-worker = techtree.worker.main:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Sean Brennan
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.