tangle-cli 0.0.1a3__tar.gz → 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.
Files changed (75) hide show
  1. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/PKG-INFO +8 -4
  2. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/README.md +6 -2
  3. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/pyproject.toml +3 -2
  4. tangle_cli-0.1.0/skills/tangent/OSS-CONVENTIONS.md +471 -0
  5. tangle_cli-0.1.0/skills/tangent/PORT-README.md +79 -0
  6. tangle_cli-0.1.0/skills/tangent/SKILL.md +124 -0
  7. tangle_cli-0.1.0/skills/tangent/agents/auth-wizard.md +150 -0
  8. tangle_cli-0.1.0/skills/tangent/agents/builder.md +252 -0
  9. tangle_cli-0.1.0/skills/tangent/agents/debugger.md +142 -0
  10. tangle_cli-0.1.0/skills/tangent/agents/reporter.md +103 -0
  11. tangle_cli-0.1.0/skills/tangent/agents/researcher.md +197 -0
  12. tangle_cli-0.1.0/skills/tangent/agents/reviewer.md +106 -0
  13. tangle_cli-0.1.0/skills/tangent/agents/scenario-builder.md +451 -0
  14. tangle_cli-0.1.0/skills/tangent/references/data-sources.md +334 -0
  15. tangle_cli-0.1.0/skills/tangent/references/event-log.md +110 -0
  16. tangle_cli-0.1.0/skills/tangent/references/example-scenarios/01-mslr-ranking.md +165 -0
  17. tangle_cli-0.1.0/skills/tangent/references/example-scenarios/02-text-classification.md +147 -0
  18. tangle_cli-0.1.0/skills/tangent/references/example-scenarios/INDEX.md +48 -0
  19. tangle_cli-0.1.0/skills/tangent/references/iterating-on-runs.md +56 -0
  20. tangle_cli-0.1.0/skills/tangent/references/knowledge-corpus.md +128 -0
  21. tangle_cli-0.1.0/skills/tangent/references/secrets.md +347 -0
  22. tangle_cli-0.1.0/skills/tangent/references/setup.md +157 -0
  23. tangle_cli-0.1.0/skills/tangent/references/step-0-initialize.md +107 -0
  24. tangle_cli-0.1.0/skills/tangent/references/step-1-analyze.md +91 -0
  25. tangle_cli-0.1.0/skills/tangent/references/step-2-hypothesize.md +42 -0
  26. tangle_cli-0.1.0/skills/tangent/references/step-3-submit.md +174 -0
  27. tangle_cli-0.1.0/skills/tangent/references/step-4-monitor.md +123 -0
  28. tangle_cli-0.1.0/skills/tangent/references/step-5-evaluate.md +53 -0
  29. tangle_cli-0.1.0/skills/tangent/references/step-6-synthesize.md +56 -0
  30. tangle_cli-0.1.0/skills/tangent/references/step-7-decide.md +79 -0
  31. tangle_cli-0.1.0/skills/tangent/references/tangle-tools.md +410 -0
  32. tangle_cli-0.1.0/skills/tangent/references/uploading-artifacts.md +229 -0
  33. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/__init__.py +0 -0
  34. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/api_cli.py +0 -0
  35. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/api_schema.py +0 -0
  36. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/api_transport.py +0 -0
  37. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/args_container.py +0 -0
  38. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/artifacts.py +0 -0
  39. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/artifacts_cli.py +0 -0
  40. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/cli.py +0 -0
  41. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/cli_helpers.py +0 -0
  42. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/cli_options.py +0 -0
  43. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/client.py +0 -0
  44. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/component_from_func.py +0 -0
  45. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/component_generator.py +0 -0
  46. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/component_inspector.py +0 -0
  47. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/component_publisher.py +0 -0
  48. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/components_cli.py +0 -0
  49. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/dynamic_discovery_client.py +0 -0
  50. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/generated_model_extensions.py +0 -0
  51. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/handler.py +0 -0
  52. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/hydration_trust.py +0 -0
  53. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/logger.py +0 -0
  54. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/models.py +0 -0
  55. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/module_bundler.py +0 -0
  56. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/openapi/__init__.py +0 -0
  57. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/openapi/codegen.py +0 -0
  58. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/openapi/parser.py +0 -0
  59. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/pipeline_dehydrator.py +0 -0
  60. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/pipeline_hydrator.py +0 -0
  61. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/pipeline_run_annotations.py +0 -0
  62. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/pipeline_run_details.py +0 -0
  63. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/pipeline_run_manager.py +0 -0
  64. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/pipeline_run_search.py +0 -0
  65. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/pipeline_runner.py +0 -0
  66. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/pipeline_runs_cli.py +0 -0
  67. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/pipelines.py +0 -0
  68. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/pipelines_cli.py +0 -0
  69. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/published_components_cli.py +0 -0
  70. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/py.typed +0 -0
  71. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/quickstart.py +0 -0
  72. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/secrets.py +0 -0
  73. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/secrets_cli.py +0 -0
  74. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/utils.py +0 -0
  75. {tangle_cli-0.0.1a3 → tangle_cli-0.1.0}/packages/tangle-cli/src/tangle_cli/version_manager.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: tangle-cli
3
- Version: 0.0.1a3
3
+ Version: 0.1.0
4
4
  Summary: CLI for Tangle, the open-source ML pipeline orchestration platform
5
5
  Author: Alexey Volkov, Tangle authors
6
6
  Author-email: Alexey Volkov <alexey.volkov@ark-kun.com>
@@ -13,7 +13,7 @@ Requires-Dist: platformdirs>=4.10.0
13
13
  Requires-Dist: pydantic>=2.0
14
14
  Requires-Dist: pyyaml>=6.0
15
15
  Requires-Dist: requests>=2.32.0
16
- Requires-Dist: tangle-api==0.0.1a3
16
+ Requires-Dist: tangle-api==0.1.0
17
17
  Requires-Dist: tomli>=2.0 ; python_full_version < '3.11'
18
18
  Requires-Python: >=3.10
19
19
  Project-URL: Homepage, https://tangleml.com
@@ -126,7 +126,11 @@ uv run tangle api --help
126
126
  uv run tangle sdk pipelines validate pipeline.yaml
127
127
  ```
128
128
 
129
- Custom API/codegen users can still run codegen from the fully capable install; generating bindings does not require removing the official `tangle-api` package. For project-local generated APIs, generate into a local source tree such as `src/tangle_api/generated` (and `src/tangle_api/schema/openapi.json` when you want `tangle api --schema-source official`) and run from that project so local `src/tangle_api` shadows site-packages. For packaged custom APIs, publish/provide a distribution named `tangle-api` with a version compatible with this `tangle-cli` release (for example `0.0.1a3+yourorg` for a `tangle-cli` dependency on `tangle-api==0.0.1a3`) via a private index, `--find-links`, or uv sources. As an expert escape hatch, `--no-deps` installs only `tangle-cli` and skips all dependencies, so that environment must manually provide every required runtime dependency plus its generated/custom `tangle_api`; this is acceptable for controlled codegen/custom scenarios but not normal UX.
129
+ Custom API/codegen users can still run codegen from the fully capable install; generating bindings does not require removing the official `tangle-api` package. For project-local generated APIs, generate into a local source tree such as `src/tangle_api/generated` (and `src/tangle_api/schema/openapi.json` when you want `tangle api --schema-source official`) and run from that project so local `src/tangle_api` shadows site-packages. For packaged custom APIs, publish/provide a distribution named `tangle-api` with a version compatible with this `tangle-cli` release (for example `0.1.0+yourorg` for a `tangle-cli` dependency on `tangle-api==0.1.0`) via a private index, `--find-links`, or uv sources. As an expert escape hatch, `--no-deps` installs only `tangle-cli` and skips all dependencies, so that environment must manually provide every required runtime dependency plus its generated/custom `tangle_api`; this is acceptable for controlled codegen/custom scenarios but not normal UX.
130
+
131
+ ## Agent skills
132
+
133
+ This repo includes the Tangent agent-skill bundle under `skills/tangent/`. The bundle was ported from `tangle-cli-lab` and now treats this repository as the canonical source. It drives the public `tangle` / `tangle-cli` command surface, assumes the default `tangle-cli` install includes `tangle-api`, and keeps relative references (`agents/*.md`, `references/*.md`) self-contained for Pi-style skill loaders. The source distribution includes `skills/**` so downstream source-based consumers can inspect or vendor the skill docs with the release.
130
134
 
131
135
  ## Quick command examples
132
136
 
@@ -371,7 +375,7 @@ uv run python -m tangle_cli.openapi.codegen \
371
375
  --out src/tangle_api/generated
372
376
  ```
373
377
 
374
- That project-local `tangle_api` package can be an editable/package source tree. If you ship the custom API bindings as a wheel or source distribution, use the distribution name `tangle-api` and a compatible version for the `tangle-cli` release you are using. A PEP 440 local version such as `0.0.1a3+yourorg` can satisfy a public `==0.0.1a3` dependency while distinguishing your private build. Provide that package through your private index, `--find-links`, or uv source configuration so the resolver chooses it instead of the public official package.
378
+ That project-local `tangle_api` package can be an editable/package source tree. If you ship the custom API bindings as a wheel or source distribution, use the distribution name `tangle-api` and a compatible version for the `tangle-cli` release you are using. A PEP 440 local version such as `0.1.0+yourorg` can satisfy a public `==0.1.0` dependency while distinguishing your private build. Provide that package through your private index, `--find-links`, or uv source configuration so the resolver chooses it instead of the public official package.
375
379
 
376
380
  Generate from a backend checkout explicitly:
377
381
 
@@ -101,7 +101,11 @@ uv run tangle api --help
101
101
  uv run tangle sdk pipelines validate pipeline.yaml
102
102
  ```
103
103
 
104
- Custom API/codegen users can still run codegen from the fully capable install; generating bindings does not require removing the official `tangle-api` package. For project-local generated APIs, generate into a local source tree such as `src/tangle_api/generated` (and `src/tangle_api/schema/openapi.json` when you want `tangle api --schema-source official`) and run from that project so local `src/tangle_api` shadows site-packages. For packaged custom APIs, publish/provide a distribution named `tangle-api` with a version compatible with this `tangle-cli` release (for example `0.0.1a3+yourorg` for a `tangle-cli` dependency on `tangle-api==0.0.1a3`) via a private index, `--find-links`, or uv sources. As an expert escape hatch, `--no-deps` installs only `tangle-cli` and skips all dependencies, so that environment must manually provide every required runtime dependency plus its generated/custom `tangle_api`; this is acceptable for controlled codegen/custom scenarios but not normal UX.
104
+ Custom API/codegen users can still run codegen from the fully capable install; generating bindings does not require removing the official `tangle-api` package. For project-local generated APIs, generate into a local source tree such as `src/tangle_api/generated` (and `src/tangle_api/schema/openapi.json` when you want `tangle api --schema-source official`) and run from that project so local `src/tangle_api` shadows site-packages. For packaged custom APIs, publish/provide a distribution named `tangle-api` with a version compatible with this `tangle-cli` release (for example `0.1.0+yourorg` for a `tangle-cli` dependency on `tangle-api==0.1.0`) via a private index, `--find-links`, or uv sources. As an expert escape hatch, `--no-deps` installs only `tangle-cli` and skips all dependencies, so that environment must manually provide every required runtime dependency plus its generated/custom `tangle_api`; this is acceptable for controlled codegen/custom scenarios but not normal UX.
105
+
106
+ ## Agent skills
107
+
108
+ This repo includes the Tangent agent-skill bundle under `skills/tangent/`. The bundle was ported from `tangle-cli-lab` and now treats this repository as the canonical source. It drives the public `tangle` / `tangle-cli` command surface, assumes the default `tangle-cli` install includes `tangle-api`, and keeps relative references (`agents/*.md`, `references/*.md`) self-contained for Pi-style skill loaders. The source distribution includes `skills/**` so downstream source-based consumers can inspect or vendor the skill docs with the release.
105
109
 
106
110
  ## Quick command examples
107
111
 
@@ -346,7 +350,7 @@ uv run python -m tangle_cli.openapi.codegen \
346
350
  --out src/tangle_api/generated
347
351
  ```
348
352
 
349
- That project-local `tangle_api` package can be an editable/package source tree. If you ship the custom API bindings as a wheel or source distribution, use the distribution name `tangle-api` and a compatible version for the `tangle-cli` release you are using. A PEP 440 local version such as `0.0.1a3+yourorg` can satisfy a public `==0.0.1a3` dependency while distinguishing your private build. Provide that package through your private index, `--find-links`, or uv source configuration so the resolver chooses it instead of the public official package.
353
+ That project-local `tangle_api` package can be an editable/package source tree. If you ship the custom API bindings as a wheel or source distribution, use the distribution name `tangle-api` and a compatible version for the `tangle-cli` release you are using. A PEP 440 local version such as `0.1.0+yourorg` can satisfy a public `==0.1.0` dependency while distinguishing your private build. Provide that package through your private index, `--find-links`, or uv source configuration so the resolver chooses it instead of the public official package.
350
354
 
351
355
  Generate from a backend checkout explicitly:
352
356
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "tangle-cli"
3
- version = "0.0.1a3"
3
+ version = "0.1.0"
4
4
  description = "CLI for Tangle, the open-source ML pipeline orchestration platform"
5
5
  readme = "README.md"
6
6
  authors = [
@@ -18,7 +18,7 @@ dependencies = [
18
18
  "pydantic>=2.0",
19
19
  "pyyaml>=6.0",
20
20
  "requests>=2.32.0",
21
- "tangle-api==0.0.1a3",
21
+ "tangle-api==0.1.0",
22
22
  "tomli>=2.0; python_version < '3.11'",
23
23
  ]
24
24
 
@@ -42,6 +42,7 @@ build-backend = "uv_build"
42
42
 
43
43
  [tool.uv.build-backend]
44
44
  module-root = "packages/tangle-cli/src"
45
+ source-include = ["skills/**"]
45
46
 
46
47
  [tool.uv.sources]
47
48
  cloud-pipelines-backend = { git = "https://github.com/TangleML/tangle", rev = "stable_cli" }
@@ -0,0 +1,471 @@
1
+ # OSS Conventions — Tangent Agent-Skills on `tangle-cli`
2
+
3
+ > **This file is the single source of truth.** Every ported skill file (SKILL.md,
4
+ > `agents/*.md`, `references/*.md`) references this document for the CLI surface,
5
+ > invocation rule, auth, artifacts, learnings corpus, logs, annotations, and the
6
+ > resolved D1–D14 defaults. When a ported file needs a command, a flag, an env var,
7
+ > an auth recipe, or a corpus/artifact/log recipe, it cites *this* document rather
8
+ > than re-deriving it. If something here conflicts with an older internal habit
9
+ > (an internal dev-env shim, a cloud-bucket URI, an internal backend host), this document wins and the
10
+ > internal habit is a release blocker (see §9, Security mandate).
11
+
12
+ Target CLI: **`github.com/TangleML/tangle-cli`** — binary `tangle`, package
13
+ `tangle-cli`, Apache-2.0. The CLI splits the surface into two families:
14
+ `tangle api …` (auto-generated OpenAPI wrappers) and `tangle sdk …` (hand-written
15
+ SDK / local / compound commands). The ported skills drive the **OSS core** (`sdk`
16
+ and `api`) and **never** any internal wrapper/hook layer.
17
+
18
+ ---
19
+
20
+ ## 1. Invocation rule
21
+
22
+ **Published-package usage is the default; checkout usage is for local `tangle-cli` development/validation.**
23
+
24
+ For a persistent user-level CLI install, prefer uv tools:
25
+
26
+ ```bash
27
+ uv tool install tangle-cli
28
+ tangle quickstart
29
+ tangle --help
30
+ tangle sdk --help
31
+ tangle api --help
32
+ ```
33
+
34
+ For one-off execution without a persistent install, use `uvx`:
35
+
36
+ ```bash
37
+ uvx --from tangle-cli tangle --help
38
+ uvx --from tangle-cli tangle quickstart
39
+ ```
40
+
41
+ Generic Python environments may also use `pip install tangle-cli`; use
42
+ `uv pip install tangle-cli` only inside an explicitly managed virtualenv.
43
+
44
+ When intentionally validating a local checkout of the `tangle-cli` repo, prefix
45
+ examples with `uv run` (for example, `uv run tangle quickstart`). Skill examples
46
+ otherwise use the installed-tool form (`tangle …` / `tangle-cli …`).
47
+
48
+ - **Never** prefix a command with an internal env-shim exec wrapper. That internal
49
+ dev-env tooling must not appear in any ported file.
50
+ - `tangle-cli` is a public PyPI package. The default install includes the
51
+ matching `tangle-api` package and supports static API-backed commands plus the
52
+ handwritten `TangleApiClient` wrapper (see §3). The old `[native]` extra is
53
+ only a compatibility/no-op alias.
54
+ - In the `tangle-cli` workspace, `uv` installs the workspace `tangle-api` package
55
+ automatically for dev/tests.
56
+ - Help is standard cyclopts `--help`. **There is no `--help-extended` / `--help-full`.**
57
+ - Skills live **in-repo** (checked into the `tangle-cli` repo). There is **no internal
58
+ bundle-refresh step**; relative cross-references (`agents/*.md`, `references/*.md`)
59
+ resolve directly on disk.
60
+
61
+ ---
62
+
63
+ ## 2. CLI mapping table (internal `<deploy-cli> …` → OSS `tangle …`)
64
+
65
+ This table is the canonical rename. The left column is the internal command a
66
+ porting agent will encounter in the source skill; the right column is the exact
67
+ OSS replacement. **Verbs/flags below were verified against the `tangle-cli` source**
68
+ (`cli.py`, `pipeline_runs_cli.py`, `pipelines_cli.py`, `components_cli.py`,
69
+ `published_components_cli.py`, `artifacts_cli.py`, `secrets_cli.py`).
70
+
71
+ ### Invocation / help / client
72
+
73
+ | Internal | OSS |
74
+ |---|---|
75
+ | `<env-shim> -- <deploy-cli> …` | `tangle …` / `tangle-cli …` (or `uv run tangle …` only when validating a local checkout) |
76
+ | `<deploy-cli> quickstart` | `tangle quickstart` (real; static onboarding text) |
77
+ | `--help-extended` / `--help-full` | `--help` |
78
+ | `from <deploy_pkg> import TangleApiClient` | `from tangle_cli.client import TangleApiClient` (see §3) |
79
+
80
+ ### `pipeline-runs` (note: **plural** group `pipeline-runs`)
81
+
82
+ | Internal | OSS |
83
+ |---|---|
84
+ | `<deploy-cli> pipeline-run submit p.yaml -f c.yaml --hydrate --no-wait` | `tangle sdk pipeline-runs submit p.yaml [--arg K=V \| --args-json JSON] [--annotation K=V]` — **hydrate is the default; there is NO `--no-wait` (submit never waits); there is NO `-f config.yaml` (use `--arg`/`--args-json`, or `--config` for CLI-option defaults)** |
85
+ | `… submit … (submit-as-is, no version resolution)` | `tangle sdk pipeline-runs submit p.yaml --no-hydrate` |
86
+ | `… submit … --dry-run` (preview payload) | `tangle sdk pipeline-runs submit p.yaml --dry-run` (prints the submit body, creates no run) |
87
+ | `<deploy-cli> pipeline-run details RUN_ID --state` | `tangle sdk pipeline-runs details RUN_ID --include-execution-state` |
88
+ | `… details … --implementations` | `… details … --include-implementations` |
89
+ | `… details … --include-annotations` | `… details … --include-annotations` (unchanged) |
90
+ | `… details … --execution-id EXEC_ID` | `tangle sdk pipeline-runs details RUN_ID --execution-id EXEC_ID` |
91
+ | (light status) | `tangle sdk pipeline-runs status RUN_ID` (run + derived status summary) |
92
+ | (graph execution state) | `tangle sdk pipeline-runs graph-state EXECUTION_ID` |
93
+ | `<deploy-cli> pipeline-run logs EXECUTION_ID` | `tangle sdk pipeline-runs logs EXECUTION_ID` (backend-native container logs — see §7) |
94
+ | `<deploy-cli> pipeline-run search --name N` | `tangle sdk pipeline-runs search --name N` (also `--created-by`, `--annotation K=V`, `--start-date`, `--end-date`, `--limit N`, `--query JSON`, positional `QUERY`) |
95
+ | `<deploy-cli> pipeline-run cancel RUN_ID` | `tangle sdk pipeline-runs cancel RUN_ID` |
96
+ | `<deploy-cli> pipeline-run await … --max-wait` | `tangle sdk pipeline-runs wait RUN_ID --max-wait N --poll-interval N [--exit-on-first-failure]` (defaults: max-wait 600s, poll-interval 10s) |
97
+ | `<deploy-cli> pipeline-run export RUN_ID out.yaml --dehydrate` | `tangle sdk pipeline-runs export RUN_ID --output out.yaml` (**drop `--dehydrate`; use `--output` — there is no `-o` alias for `export`; omit `--output` to print to stdout**) |
98
+ | `<deploy-cli> pipeline-run annotations set RUN_ID K V` | `tangle sdk pipeline-runs annotations set RUN_ID K V` (also `annotations list RUN_ID`, `annotations delete RUN_ID K`) |
99
+
100
+ ### `pipelines` (local pipeline ops — **these live under `pipelines`, NOT `pipeline-runs`**)
101
+
102
+ | Internal | OSS |
103
+ |---|---|
104
+ | `<deploy-cli> pipeline-run validate p.yaml` | `tangle sdk pipelines validate p.yaml` |
105
+ | `<deploy-cli> pipeline auto-layout p.yaml` | `tangle sdk pipelines layout p.yaml [--recursive] [-o out.yaml]` |
106
+ | `<deploy-cli> pipeline hydrate t.yaml out.yaml` | `tangle sdk pipelines hydrate t.yaml -o out.yaml [--var K=V]` |
107
+ | `<deploy-cli> pipeline view … --hydrate` | `tangle sdk pipelines diagram p.yaml` (Mermaid) / `tangle sdk pipelines layout p.yaml` — **no GUI viewer** |
108
+ | `<deploy-cli> …-dehydrate-…` / any `dehydrate` verb/flag | **No OSS `dehydrate` command or `--dehydrate` flag.** Drop it (see §10, D1). `pipeline_dehydrator.py` exists only as unwired library code. |
109
+
110
+ ### `components` (local authoring) vs `published-components` (registry)
111
+
112
+ | Internal | OSS |
113
+ |---|---|
114
+ | `<deploy-cli> component generate from-python s.py` | `tangle sdk components generate from-python s.py [--function NAME] [--image REG/IMG:TAG] [--output OUT] [--name NAME] [--mode inline\|bundle] [--dependencies-from REQ] [--strip-code] [--resolve-root DIR]` |
115
+ | `<deploy-cli> component generate from-docker …` / `--quick` / `--engine` | **No image build/push in the CLI.** Build/push the image yourself, then `generate from-python --image <registry/img:tag>`. `set-container-image` is a `NotImplementedError` stub. (See §10, D7.) |
116
+ | `<deploy-cli> component generate from-dbt …` | **Not in the CLI surface.** Drop; treat as out of scope. |
117
+ | `<deploy-cli> component bump-version c.yaml` | `tangle sdk components bump-version c.yaml [--set-version V] [--update-timestamp]` (**bump-version is under `components`**) |
118
+ | `<deploy-cli> component publish c.yaml` | `tangle sdk published-components publish c.yaml [--image …] [--name …] [--description …] [--annotations JSON] [--dry-run] [--published-by …]` (**publish is under `published-components`**) |
119
+ | `<deploy-cli> publish-all …` | **No `publish-all`.** Pass a `--config` YAML/JSON list (or `_defaults` + `configs`) to the same `published-components publish`; it aggregates and exits nonzero on any error. |
120
+ | `<deploy-cli> component inspect --name N --full-spec` | `tangle sdk published-components inspect --name N --full-spec` (or `inspect --digest DIGEST`; exactly one of NAME or `--digest`) |
121
+ | `<deploy-cli> component search-v2 …` / `search … --semantic`/`--fuzzy`/`--regex`/`--schema` | `tangle sdk published-components search NAME [--digest D] [--published-by U] [--include-deprecated]` — **keyword/name/digest only; NO v2/semantic/fuzzy/regex/schema variants** (see §10, D11). May return empty on a fresh OSS install (feature off by default). |
122
+ | `<deploy-cli> component deprecate DIGEST` | `tangle sdk published-components deprecate DIGEST [--superseded-by DIGEST]` |
123
+ | `<deploy-cli> docs standard_components` | `tangle sdk published-components library` (curated standard library) |
124
+
125
+ ### `secrets`, `artifacts`, `docs`
126
+
127
+ | Internal | OSS |
128
+ |---|---|
129
+ | `<deploy-cli> secrets {list,create,update,delete}` | `tangle sdk secrets {list,create,update,delete}` — create/update take `--value`/`-v`, **prefer `--from-env`/`-e ENVVAR`** (avoids shell-history exposure), `--description`/`-d`, `--expires-at`; delete prompts unless `--force` |
130
+ | `<deploy-cli> artifacts get RUN_ID -q …` | `tangle sdk artifacts get RUN_ID -q '<JSON>'` (**metadata-only**, see §5). `-q`/`--query` is a JSON string with optional keys `tasks`, `components`, `executions`, `artifact_ids` |
131
+ | `<deploy-cli> artifacts download RUN_ID -q … -o ./dir` | **No download-to-disk command.** Use the signed-URL fetch recipe in §5 / §10 D2. |
132
+ | `<deploy-cli> docs {pipeline,component,debugging_runs,standard_components}` | **No `docs` command.** Point to `tangle sdk <group> --help`, `tangle sdk published-components library`, and the public OSS docs at `github.com/TangleML/website/tree/master/docs` (see §10, D10). |
133
+
134
+ ### `auth` / SA setup / scheduler / run-as
135
+
136
+ | Internal | OSS |
137
+ |---|---|
138
+ | `<deploy-cli> auth …` / `<sa-setup>` / Workload-Identity / Terraform | **No `auth` command group and no SA-setup command in the CLI.** Auth is plain env/flags (§4). The replacement auth-wizard is a thin token/header credential helper (§10, D5). |
139
+ | `<schedule-pipeline>` / scheduler | **No scheduler in OSS.** Reduce "do not schedule" guidance to a generic conceptual caution; do not name a `schedule` command (§10, D9). |
140
+ | `--run-as IDENTITY` | `--run-as` exists on `submit` but the **OSS default hooks do not support it** (downstream extension seam only). Drop run-as examples (§10, D9). |
141
+
142
+ **Invocation rule for the whole table:** every left-column command, however it was
143
+ written internally, becomes the bare right-column form (for example,
144
+ `tangle sdk pipeline-runs submit …`). Only prefix with `uv run` when intentionally
145
+ validating a local checkout. Auth flags from §4 attach to any API-backed command.
146
+
147
+ ---
148
+
149
+ ## 3. Programmatic client
150
+
151
+ The stable public wrapper for Python tooling is:
152
+
153
+ ```python
154
+ from tangle_cli.client import TangleApiClient
155
+
156
+ # Defaults to the local dev backend; pass base_url + auth for a remote backend.
157
+ client = TangleApiClient(
158
+ "http://localhost:8000",
159
+ token=None, # Bearer token shorthand
160
+ auth_header=None, # full Authorization value, e.g. "Bearer …" / "Basic …"
161
+ header=None, # one "Name: value" string or a list of them
162
+ headers=None, # mapping form, if you prefer a dict
163
+ )
164
+ run = client.pipeline_runs_get("run-id")
165
+ existing = client.find_existing_components(
166
+ ["component-name"],
167
+ published_by_substring="alice@example.com",
168
+ )
169
+ ```
170
+
171
+ - Constructor signature: `TangleApiClient(base_url, *, token=, auth_header=, header=, headers=, …)`.
172
+ A bare `TangleApiClient()` only works against the default localhost backend.
173
+ - `TangleApiClient` lives in `tangle_cli.client` and inherits generated endpoint
174
+ methods from `tangle_api.generated.operations.GeneratedTangleApiOperations`.
175
+ **Importing it requires generated bindings**. The default `tangle-cli` install
176
+ includes `tangle-api`; custom API projects may provide a local or packaged
177
+ compatible `tangle_api.generated` package before `from tangle_cli.client import …`.
178
+ The top-level `import tangle_cli` intentionally does not eagerly import generated bindings.
179
+ - **Prefer the CLI over Python snippets for status/polling.** Any internal snippet
180
+ that calls unverified methods like `get_pipeline_run`, `get_execution_graph_state`,
181
+ `set_verbose`, `.status_totals`, or `.root_execution_id` must be replaced. The
182
+ verified surface is `client.pipeline_runs_get(run_id)` and the
183
+ `find_existing_components(...)` semantic helper; for status/graph state the
184
+ **preferred** approach is the purpose-built CLI:
185
+ - `tangle sdk pipeline-runs status RUN_ID` (run + derived status summary)
186
+ - `tangle sdk pipeline-runs graph-state EXECUTION_ID` (graph execution state)
187
+
188
+ Skills should call those CLI commands rather than hand-rolling a light-poll loop
189
+ in Python (see §10, D14).
190
+
191
+ ---
192
+
193
+ ## 4. Auth & environment
194
+
195
+ OSS auth is **explicit and layered**: explicit CLI option > `--config` file value >
196
+ environment default. **There is no `auth` command group.** These flags/env vars
197
+ replace the internal identity/session systems, cloud SA impersonation, the
198
+ internal backend's auth verification, and the internal package index **entirely**.
199
+
200
+ | CLI option | Env var(s) | Purpose |
201
+ |---|---|---|
202
+ | `--base-url` | `TANGLE_API_URL` | API origin. Defaults to the local dev API URL when omitted. |
203
+ | `--token` | `TANGLE_API_TOKEN` | Bearer-token shorthand. |
204
+ | `--auth-header` | `TANGLE_API_AUTH_HEADER`, `TANGLE_AUTH_HEADER` | Full `Authorization` value such as `Bearer …` or `Basic …`. |
205
+ | `-H` / `--header` | `TANGLE_API_HEADERS` | Extra headers. Repeatable as CLI flags; env accepts a JSON object **or** newline-separated `Name: value` entries. |
206
+ | `--config` | — | YAML/JSON defaults (single object, a list, or `_defaults` + `configs`). |
207
+ | — | `TANGLE_VERBOSE=1` | Redacted HTTP request/response diagnostics (separate from progress logs). |
208
+
209
+ - **Env-var rename:** internal `TANGLE_AUTH` (username:password) → OSS
210
+ `TANGLE_API_TOKEN` (Bearer) **or** `TANGLE_API_AUTH_HEADER` (full header for
211
+ Basic/other schemes). The deploy-time source-attribution env var → dropped (see §8).
212
+ - **Run links:** replace internal run-URL links (`https://<internal-backend-host>/runs/<id>`) with
213
+ `<base-url>/runs/<id>` **or** "inspect via `tangle sdk pipeline-runs details RUN_ID`".
214
+ - **No internal package index.** Resolve dependencies against public PyPI
215
+ (`uv tool install tangle-cli` for a persistent CLI, or
216
+ `uvx --from tangle-cli tangle …` for one-off execution). Generic Python
217
+ environments may also use `pip install tangle-cli`; local checkout validation
218
+ uses `uv sync` / `uv run` inside the repo.
219
+ - Example for a protected backend:
220
+
221
+ ```bash
222
+ tangle sdk pipeline-runs submit pipeline.yaml \
223
+ --base-url https://api.example \
224
+ --auth-header 'Bearer …' \
225
+ -H 'X-Gateway-Auth: …' \
226
+ --log-type console
227
+ ```
228
+
229
+ - **Auth-wizard replacement (D5):** a thin wizard that (1) asks for `--base-url`,
230
+ (2) picks one credential mechanism (`--token` vs `--auth-header` vs `-H`),
231
+ (3) shows the flag / env / `--config` setup, (4) verifies with a cheap call
232
+ (`tangle sdk pipeline-runs search --limit 1`), and (5) interprets 401/403/429.
233
+ No GCP/Workload-Identity/Terraform modes.
234
+
235
+ ---
236
+
237
+ ## 5. Artifacts
238
+
239
+ `tangle sdk artifacts get RUN_ID -q '<JSON>'` is **metadata-only**. It returns
240
+ records of the form `{id, uri, size, hash}` (and a `count`); the `uri` is
241
+ **backend-agnostic**. There is **no `artifacts download` / `-o` to disk** in the CLI.
242
+
243
+ - **URI scheme is HuggingFace, not an internal cloud-bucket scheme.** Under the OSS `tangle` backend the
244
+ storage provider is `huggingface_repo_storage.py`, so artifact URIs look like:
245
+
246
+ ```
247
+ hf://{model|dataset|space}s/<user>/<repo>@<branch>/<path>
248
+ ```
249
+
250
+ e.g. `hf://datasets/acme/eval-artifacts@main/run-123/metrics.json`. **Any skill
251
+ text that parses, echoes, or hard-codes a specific storage scheme (e.g. a
252
+ cloud-bucket URI) must be made scheme-agnostic** — read the `uri` field; do not assume a scheme.
253
+
254
+ - **To fetch bytes** (the standard recipe — cite this from reporter/debugger/
255
+ researcher/reviewer/scenario-builder/step-5):
256
+
257
+ 1. Get metadata and read the `uri`:
258
+ ```bash
259
+ tangle sdk artifacts get RUN_ID -q '{"artifact_ids":["<artifact-id>"]}'
260
+ ```
261
+ 2. Ask the backend for a signed URL:
262
+ ```bash
263
+ tangle api artifacts signed-artifact-url --id <artifact-id>
264
+ ```
265
+ 3. Fetch with a generic client — `curl -L "<signed-url>" -o ./out`, or for
266
+ `hf://` URIs `huggingface_hub` (`hf_hub_download` / `snapshot_download`).
267
+
268
+ Keep this recipe in one place (here); other files point at it rather than
269
+ repeating it.
270
+
271
+ - **Metadata-only is sufficient for many checks.** Reviewers can verify
272
+ existence/size/hash from `artifacts get` alone. Only mandate byte-fetching where
273
+ per-example or metric-content analysis genuinely requires it (reporter), and there
274
+ point at the signed-URL recipe above (see §10, D2).
275
+
276
+ ---
277
+
278
+ ## 6. Learnings corpus
279
+
280
+ Replaces the internal cloud-storage learnings bucket. Two tiers:
281
+
282
+ - **Default — local directory.** A configurable `LEARNINGS_DIR`, default
283
+ `$SCENARIO_DIR/learnings/`, overridable via env. Records are **run_id-keyed**
284
+ JSON. Replace the internal cloud-storage upload command with a plain copy/write:
285
+
286
+ ```bash
287
+ mkdir -p "$LEARNINGS_DIR/<scenario>"
288
+ cp learning.json "$LEARNINGS_DIR/<scenario>/learning-<run_id>.json"
289
+ ```
290
+
291
+ Keep the run_id-keying scheme (`active_run_id` for research, `best_run_id` for
292
+ the learning) and keep the resilience event — but reword "upload" → "record"
293
+ (the event `learning_upload_failed` becomes `learning_record_failed`; see §8/§10
294
+ D3). Genericize the word "bucket" → "corpus directory".
295
+
296
+ - **Shared tier — HuggingFace dataset repo.** For a team-shared corpus (the shared
297
+ bucket's real purpose), the OSS-native equivalent matches the backend's own
298
+ storage provider:
299
+
300
+ ```
301
+ hf://datasets/<org>/<corpus>@main/<scenario>/<run_id>.json
302
+ ```
303
+
304
+ pushed with `huggingface_hub` (`HfApi().upload_file(...)`). Document local-dir as
305
+ the default and the HF dataset as the optional shared tier. **Never** reintroduce
306
+ an internal cloud-storage bucket.
307
+
308
+ ---
309
+
310
+ ## 7. Logs
311
+
312
+ Drop the **internal observability stack** (its hosts, datasets, `--source`
313
+ selectors, and auth env vars) entirely. The OSS log surface is split by what stores the data:
314
+
315
+ - **Container logs (application stdout/stderr)** — backend-native, the **only** CLI-native
316
+ log surface:
317
+
318
+ ```bash
319
+ tangle sdk pipeline-runs logs EXECUTION_ID
320
+ ```
321
+
322
+ (Note: this is keyed by **EXECUTION_ID**, not run id.)
323
+
324
+ - **Kubernetes/system events (OOM, eviction, scheduling, "pod not found")** — the
325
+ Tangle backend does **not** store these; they are **launcher-specific**. Frame as
326
+ "consult your launcher's runtime," with concrete per-launcher hints:
327
+
328
+ | Launcher | System-event source |
329
+ |---|---|
330
+ | `kubernetes`, `google_kubernetes` | `kubectl get events`, `kubectl describe pod <pod>` |
331
+ | `local_docker` | `docker logs <container>`, `docker inspect <container>` |
332
+ | `skypilot` | the cluster console / `sky logs` |
333
+ | `huggingface` | the Space's logs in the HF UI |
334
+
335
+ - This is a genuine **degradation** vs the internal observability path for *infra-failure*
336
+ diagnosis (no unified system-event search). The debugger skill must note the
337
+ weaker INFRA-failure signal and lean on container logs + launcher-native events.
338
+
339
+ ---
340
+
341
+ ## 8. Annotations
342
+
343
+ - **Drop the internal dashboard-compatibility annotation marker** and the entire
344
+ source-attribution mechanism (the deploy-source env var / `--source` flag).
345
+ These were pure downstream attribution for the internal dashboards and are safe to
346
+ remove for OSS.
347
+ - **Keep the generic annotation mechanism.** Portable annotations stay:
348
+ `--annotation session=… --annotation round=… --annotation type=… --annotation label=…`
349
+ (and `annotations set RUN_ID K V` after the fact).
350
+ - **Optional provenance only.** If a skill wants to mark its runs, use a single
351
+ optional `--annotation source=tangle-cli`. Do **not** make it mandatory and do
352
+ **not** reintroduce the internal dashboard marker.
353
+
354
+ ---
355
+
356
+ ## 9. Security mandate (strip-list — release blocker)
357
+
358
+ Per the team's security mandate, internal references in an OSS repo are
359
+ **attack vectors** (supply-chain + reconnaissance), not cosmetic. Treat **any**
360
+ residual internal reference in a ported file as a **release blocker**.
361
+
362
+ No internal identifier may appear in **any** ported file — prose, code,
363
+ examples, comments, links, YAML, or annotations. The forbidden **categories**
364
+ (named here generically, so this public file does not itself carry the literal
365
+ strings it forbids):
366
+
367
+ - Internal backend / gateway / observability **hostnames**, and any internal
368
+ corporate domain.
369
+ - Cloud-storage **bucket URIs and bucket names** tied to internal infra, and the
370
+ helper code or CLIs that read or upload them.
371
+ - Internal **observability**, **data-warehouse**, **experimentation**, and
372
+ **session / identity** systems — their hosts, datasets, source selectors, and
373
+ auth/session env vars.
374
+ - Internal or vendor **compute** project IDs and ML-platform endpoints.
375
+ - Internal **package-index** URLs.
376
+ - Internal **dev-environment** tooling and monorepo source / zone paths.
377
+ - Employee usernames / emails as data (PII), and service-account names.
378
+ - Internal component digests presented as resolvable.
379
+ - Internal dashboard-attribution annotations and source-attribution env vars.
380
+
381
+ **Pre-release sweep.** The authoritative literal deny-list and the `grep`
382
+ patterns that enforce it **must live in private validation tooling, not in this
383
+ public tree** — shipping the literal internal strings, even inside a deny-list,
384
+ would itself violate the mandate. Before declaring any file done, run that
385
+ private sweep over the ported tree; then verify two non-sensitive structural
386
+ invariants directly here: every relative `../references/*.md` / `agents/*.md`
387
+ link still resolves, and no dropped subagent (the uploader) is still spawned.
388
+
389
+ ---
390
+
391
+ ## 10. Resolved D1–D14 defaults
392
+
393
+ These are **final** (from plan §4, several pre-resolved by team Slack in §0c).
394
+ Apply them identically across all files.
395
+
396
+ - **D1 — Dehydrate.** Reframe the iteration loop around plain `export` (root spec
397
+ as-is) + hand-edit + `submit` (hydrate is the default). **Drop all `--dehydrate`
398
+ flags and the `grep -q ' spec:'` "dehydrate first" guards.** Do **not** add a new
399
+ dehydrate command. Accept hydrate-as-no-op on already-inline exports.
400
+
401
+ - **D2 — Artifact bytes.** Document the `artifacts get` → `tangle api artifacts
402
+ signed-artifact-url` → fetch recipe **once** (here, §5). Keep reporter's per-example
403
+ analysis requirement but point it at that recipe. Reviewer relies on
404
+ **metadata-only** verification.
405
+
406
+ - **D3 — Learnings corpus.** Canonical local path `LEARNINGS_DIR`, default
407
+ `$SCENARIO_DIR/learnings/` (env-overridable). Keep the corpus concept and the
408
+ resilience event, renamed `learning_record_failed`. Shared tier = HF dataset repo
409
+ (§6).
410
+
411
+ - **D4 — Data-source components.** **Drop the dedicated data-source recipes**
412
+ (`Promote/Load/Find data source`, `Download from cloud storage`). Reframe artifact reuse as
413
+ "record `run_id` / artifact `uri` locally and re-reference." Gate
414
+ `data-sources.md` as a **conditional** pattern doc ("if your backend provides
415
+ these components"), never a prerequisite.
416
+
417
+ - **D5 — Auth wizard.** **Replace** the GCP/Workload-Identity/Terraform wizard with a
418
+ minimal token/header wizard (see §4: ask base-url → pick `--token`/`--auth-header`/`-H`
419
+ → show flag/env/`--config` setup → verify with `tangle sdk pipeline-runs search
420
+ --limit 1` → interpret 401/403/429). Drop Modes 1/2 wholesale.
421
+
422
+ - **D6 — Uploader agent.** **Drop the agent** (no OSS upload command; it relied on
423
+ the user's cloud-CLI auth + a hard-coded cloud-storage-download component). Preserve only the
424
+ portable kernels (file-vs-directory trailing-slash semantics, unique-filename
425
+ guidance, `componentRef` wiring shape) inside `uploading-artifacts.md`. Fix every
426
+ cross-reference that spawned the uploader to self-contained generic text.
427
+
428
+ - **D7 — Containerized component build.** **Drop**
429
+ `containerized-component-iteration.md`. Document `generate from-python --image
430
+ <registry/img:tag>` (image built/pushed by the user with their own docker/podman)
431
+ as the only component-generation path in `builder.md`. `set-container-image` is a
432
+ stub; do not use it.
433
+
434
+ - **D8 — Secrets.** **Drop GCP Secret Manager "Pattern B"** and the SA-impersonation
435
+ account-scoping section. **Keep Pattern A** (`dynamicData.secret`). Reduce
436
+ account-scoping to one generic paragraph: "secrets belong to the authenticating
437
+ identity; re-run with a different `--token` to create under another identity."
438
+ Prefer `secrets create --from-env ENVVAR` over `--value` in examples.
439
+
440
+ - **D9 — Scheduler / run-as.** No scheduler command to name — reduce "do not
441
+ schedule promote" to a generic conceptual caution. **Drop `--run-as` examples**
442
+ (OSS default hooks reject it; it is a downstream extension seam only).
443
+
444
+ - **D10 — `docs` command.** **Drop `docs` invocations.** Point to
445
+ `tangle sdk <group> --help`, `tangle sdk published-components library`, in-repo
446
+ schema docs, and the public OSS docs at
447
+ `github.com/TangleML/website/tree/master/docs` (confirmed canonical OSS docs home).
448
+
449
+ - **D11 — Component search.** Collapse to `tangle sdk published-components search
450
+ NAME` (keyword/name/digest only); **drop semantic/fuzzy/regex/schema variants.**
451
+ The PublishedComponents / remote-component-library feature is **off by default in
452
+ OSS**, so researcher/builder must treat component discovery as **optional** and
453
+ **tolerate empty results** on a fresh install — never a hard prerequisite of a
454
+ workflow step.
455
+
456
+ - **D12 — Run arguments.** Standardize on `--arg K=V` and `--args-json '<JSON>'`
457
+ (or `--args-json @file.json` where a file is wanted). **Rewrite every
458
+ `-f *.config.yaml` submit example** accordingly. `--config` carries CLI-option
459
+ defaults (base-url/auth/log-type), **not** pipeline run args.
460
+
461
+ - **D13 — Example-scenarios bundle.** **Drop all 16 files** (`INDEX.md` + `01`–`15`)
462
+ — internal-domain case studies with near-zero portable CLI content and many
463
+ strip-list violations. **Author 1–2 fresh synthetic examples** on a public dataset
464
+ (e.g. MSLR/LETOR for ranking; a public image-text set for matching) plus a new
465
+ `INDEX.md`. Any synthetic scenario must name only public datasets/models and
466
+ treat scheduling/run-as/data-source promotion as extension-only.
467
+
468
+ - **D14 — Step-4 light-poll client API.** **Replace the Python snippet** with the
469
+ CLI: `tangle sdk pipeline-runs status RUN_ID` and `tangle sdk pipeline-runs
470
+ graph-state EXECUTION_ID`. Do not ship a snippet that calls unverified client
471
+ methods.
@@ -0,0 +1,79 @@
1
+ # Tangent Agent-Skills — Open-Source Port
2
+
3
+ This directory is an **open-source port of the Tangent agent-skill bundle**: a set of
4
+ instructions that let an autonomous coding agent run ML pipeline-tuning experiments end to
5
+ end against the [`tangle-cli`](https://github.com/TangleML/tangle-cli) CLI (binary
6
+ `tangle`, the `tangle sdk` / `tangle api` surfaces).
7
+
8
+ It is a faithful carbon copy of the original bundle with **every infrastructure-specific
9
+ reference removed and re-expressed against the public CLI**. The substitutions are not ad
10
+ hoc — they are governed by a single binding contract, [`OSS-CONVENTIONS.md`](./OSS-CONVENTIONS.md),
11
+ which every file in this tree inherits.
12
+
13
+ ## What this is for
14
+
15
+ The bundle drives an 8-step autonomous loop (initialize → analyze → hypothesize → submit →
16
+ monitor → evaluate → synthesize → decide) plus a roster of specialized subagents. Point a
17
+ capable agent harness at `SKILL.md` as the entry index and it can: read a tuning scenario,
18
+ form a hypothesis, edit a pipeline config, submit a run, monitor it, pull artifacts and logs,
19
+ evaluate the result, and record a durable learning — looping until the scenario's goal is met.
20
+
21
+ ## Layout
22
+
23
+ ```
24
+ SKILL.md ← entry index: roster, the 8-step loop, invocation rules
25
+ OSS-CONVENTIONS.md ← the binding port contract (CLI surface, auth, artifacts,
26
+ logs, learnings, annotations, resolved defaults). Read first.
27
+ PORT-README.md ← this file
28
+ agents/ ← 7 subagents the loop spawns
29
+ builder.md debugger.md reporter.md researcher.md
30
+ reviewer.md scenario-builder.md auth-wizard.md
31
+ references/ ← the loop steps + topic references
32
+ step-0-initialize.md … step-7-decide.md
33
+ tangle-tools.md setup.md secrets.md data-sources.md
34
+ event-log.md knowledge-corpus.md iterating-on-runs.md uploading-artifacts.md
35
+ example-scenarios/ ← worked scenarios on PUBLIC datasets
36
+ INDEX.md 01-*.md 02-*.md
37
+ ```
38
+
39
+ ## How to invoke
40
+
41
+ Normal usage runs the **published `tangle-cli` package**: install persistently with `uv tool install tangle-cli`, then run `tangle …` / `tangle-cli …`, or use `uvx --from tangle-cli tangle …` for one-off commands. Local checkout invocation (`uv run tangle …`) is only for validating changes inside the `tangle-cli` repo. Elsewhere, `tangle` still appears as a bare command noun in prose and in the §2 CLI map (the naming-surface exception). See `OSS-CONVENTIONS.md` §1.
42
+
43
+ ## What changed from the internal bundle
44
+
45
+ The internal original was wired to closed, internal-only infrastructure. Each of those couplings was
46
+ replaced with the project's open, backend-agnostic equivalent:
47
+
48
+ | Internal coupling (removed) | Open-source replacement |
49
+ | ---------------------------------- | -------------------------------------------------------------------- |
50
+ | Internal CLI wrapper + env shim | `tangle …` / `tangle-cli …` from the published package, no environment shim |
51
+ | Cloud-object-storage artifact URIs | Scheme-agnostic artifact `uri` (e.g. `hf://…`); fetch via signed URL |
52
+ | Hosted log-search backend | `tangle sdk pipeline-runs logs` + launcher-native system events |
53
+ | Hard-coded internal API endpoint | `--base-url` / `TANGLE_API_URL` |
54
+ | Internal auth brokers / SSO | `--token` / `--auth-header` / `-H` (+ `TANGLE_API_*` env vars) |
55
+ | Cloud bucket "learnings" corpus | Local `LEARNINGS_DIR`, optional shared HuggingFace-dataset tier |
56
+ | Dashboard run-attribution tags | Dropped (generic user annotations retained) |
57
+
58
+ A few source files were **dropped rather than ported**, by design:
59
+
60
+ - **`agents/uploader.md`** — its portable guidance was folded into
61
+ `references/uploading-artifacts.md`; no surviving file spawns it.
62
+ - **`references/containerized-component-iteration.md`** — built on a container-build path that
63
+ is a not-implemented stub in the OSS CLI.
64
+ - **The 15 numbered case studies under `example-scenarios/`** — these were internal/customer
65
+ scenarios. They are replaced with self-contained synthetic scenarios on **public datasets**.
66
+
67
+ ## Provenance & the security contract
68
+
69
+ This port treats internal references as a **release blocker**, not cosmetic cleanup: a leaked
70
+ internal hostname, project id, bucket URI, or credential path in open-source files is an attack
71
+ surface. `OSS-CONVENTIONS.md` §9 holds the full strip-list; every ported file was audited
72
+ against it. If you extend this bundle, run that audit on your additions before publishing.
73
+
74
+ ## Intended destination
75
+
76
+ This tree is standalone and self-referential (all cross-references are relative). It is meant
77
+ to be dropped into the `tangle-cli` repo as an agent-skill bundle — for example at
78
+ `tangle-cli/skills/tangent/` (or wherever that repo loads agent skills from) — so the
79
+ harness can load `SKILL.md` as the index.