ltcai 11.7.0 → 12.0.0
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.
- package/README.md +100 -76
- package/docs/BENCHMARKS.md +9 -2
- package/docs/CHANGELOG.md +249 -0
- package/docs/CI_AND_RELEASE_GATES.md +126 -41
- package/docs/COMMUNITY_AND_PLUGINS.md +1 -1
- package/docs/DEVELOPMENT.md +271 -103
- package/docs/ENTERPRISE.md +1 -1
- package/docs/LEGACY_COMPATIBILITY.md +10 -6
- package/docs/MULTI_AGENT_RUNTIME.md +4 -4
- package/docs/ONBOARDING.md +16 -4
- package/docs/OPERATIONS.md +14 -1
- package/docs/PERMISSION_MODE.md +14 -9
- package/docs/REALTIME_COLLABORATION.md +1 -1
- package/docs/ROADMAP.md +113 -0
- package/docs/TRUST_MODEL.md +28 -7
- package/docs/USABILITY_AUDIT.md +5 -0
- package/docs/WHY_LATTICE.md +13 -5
- package/docs/WORKFLOW_DESIGNER.md +2 -2
- package/docs/kg-schema.md +57 -7
- package/docs/mcp-tools.md +93 -82
- package/docs/security-model.md +6 -3
- package/lattice_brain/__init__.py +1 -1
- package/lattice_brain/graph/_kg_common/__init__.py +1 -54
- package/lattice_brain/graph/_kg_common/extraction.py +459 -105
- package/lattice_brain/graph/_kg_common/normalize.py +305 -0
- package/lattice_brain/graph/_kg_common/patterns.py +275 -0
- package/lattice_brain/graph/_kg_common/relations.py +12 -3
- package/lattice_brain/graph/_kg_common/sections.py +107 -0
- package/lattice_brain/graph/_kg_common/text.py +14 -450
- package/lattice_brain/graph/_kg_constants.py +7 -0
- package/lattice_brain/ingestion/__init__.py +6 -3
- package/lattice_brain/multimodal/__init__.py +9 -3
- package/latticeai/__init__.py +1 -1
- package/latticeai/api/agent_worker_seam.py +44 -1
- package/latticeai/api/models.py +18 -110
- package/latticeai/api/search.py +7 -30
- package/latticeai/api/worker_compute.py +127 -106
- package/latticeai/api/worker_seams.py +17 -2
- package/latticeai/core/embedding_providers/__init__.py +16 -0
- package/latticeai/core/embedding_providers/autodetect.py +302 -0
- package/latticeai/core/embedding_providers/base.py +25 -0
- package/latticeai/core/embedding_providers/profiles.py +44 -0
- package/latticeai/core/embedding_providers/text.py +74 -8
- package/latticeai/core/http_origin.py +3 -3
- package/latticeai/core/messages.py +0 -5
- package/latticeai/core/policy.py +1 -6
- package/latticeai/core/quiet.py +1 -20
- package/latticeai/core/security.py +29 -83
- package/latticeai/core/sessions.py +95 -4
- package/latticeai/core/users.py +0 -38
- package/latticeai/core/vector_index/__init__.py +61 -0
- package/latticeai/core/vector_index/hnsw.py +383 -0
- package/latticeai/core/vector_index/sidecar.py +329 -0
- package/latticeai/models/router/catalog.py +2 -2
- package/latticeai/models/router/generation.py +176 -30
- package/latticeai/models/router/loading.py +150 -9
- package/latticeai/runtime/access_runtime.py +7 -4
- package/latticeai/runtime/brain_runtime.py +43 -9
- package/latticeai/runtime/build_phases/features.py +8 -31
- package/latticeai/runtime/build_phases/foundation.py +7 -16
- package/latticeai/runtime/build_phases/web.py +3 -3
- package/latticeai/runtime/build_phases/worker_profile.py +29 -27
- package/latticeai/runtime/runtime_context.py +0 -2
- package/latticeai/services/architecture_readiness.py +18 -19
- package/latticeai/services/process_audit.py +1 -22
- package/latticeai/services/product_readiness.py +39 -12
- package/latticeai/services/search_service.py +7 -0
- package/latticeai/services/voice_capture.py +8 -28
- package/latticeai/tools/__init__.py +12 -47
- package/latticeai/tools/commands.py +9 -15
- package/latticeai/tools/documents.py +12 -0
- package/latticeai/tools/knowledge.py +0 -6
- package/latticeai/tools/markup.py +152 -0
- package/package.json +4 -5
- package/requirements.txt +0 -1
- package/scripts/check_current_release_docs.mjs +1 -1
- package/scripts/check_openapi_drift.mjs +3 -2
- package/scripts/check_server_i18n.mjs +5 -4
- package/scripts/compose_openapi.py +4 -1
- package/scripts/export_openapi.py +5 -4
- package/scripts/gen_worker_allowlist_fixture.py +2 -2
- package/scripts/openapi_route_families.json +19 -74
- package/scripts/publish_release.mjs +157 -0
- package/scripts/release_screen_claims.json +144 -28
- package/src-tauri/Cargo.lock +45 -10
- package/src-tauri/Cargo.toml +1 -1
- package/src-tauri/tauri.conf.json +1 -1
- package/static/app/asset-manifest.json +47 -41
- package/static/app/assets/Act-Cf1L2709.js +2 -0
- package/static/app/assets/AdminConsole-DPAbLTYV.js +1 -0
- package/static/app/assets/Brain-DqamGrj-.js +2 -0
- package/static/app/assets/BrainHome-MHe2_RYs.js +2 -0
- package/static/app/assets/BrainSignals-CQPPfyyH.js +1 -0
- package/static/app/assets/Capture-DGdIH_Zc.js +1 -0
- package/static/app/assets/Chronicle-C-UlCJoJ.js +1 -0
- package/static/app/assets/CommandPalette-WNT4EqUX.js +1 -0
- package/static/app/assets/DigitalBrainExplorer-CEBH5Cwc.js +321 -0
- package/static/app/assets/Library-C6xd1dlf.js +1 -0
- package/static/app/assets/LivingBrain-BEk-0ohw.js +1 -0
- package/static/app/assets/ProductFlow-CZLm5iXh.js +1 -0
- package/static/app/assets/QueryClientProvider-B3OjqSyJ.js +1 -0
- package/static/app/assets/{ReviewCard-HXRle3qq.js → ReviewCard-CEHG6evf.js} +2 -2
- package/static/app/assets/RunsListPanel-CLtEJSRW.js +1 -0
- package/static/app/assets/System-CAxwBUXw.js +1 -0
- package/static/app/assets/WorkflowGraph-Dj10RuGE.js +1 -0
- package/static/app/assets/WorkflowsPanel-Kyeh_LIT.js +2 -0
- package/static/app/assets/actHelpers-CtSmK9Dw.js +1 -0
- package/static/app/assets/arrow-left-CRl5EO4D.js +1 -0
- package/static/app/assets/{bot-Cn8bWRuq.js → bot-DhUGRel2.js} +1 -1
- package/static/app/assets/brain-CLkhHsHF.js +1 -0
- package/static/app/assets/button-CmaEqG1T.js +1 -0
- package/static/app/assets/circle-check-CFgejkOS.js +1 -0
- package/static/app/assets/{circle-pause-CmzC_apg.js → circle-pause-l96izbxj.js} +1 -1
- package/static/app/assets/{circle-play-D8mW2aQ7.js → circle-play-CrZa25_q.js} +1 -1
- package/static/app/assets/{cpu-DZcdd0PZ.js → cpu-BaXudqwl.js} +1 -1
- package/static/app/assets/{download-bv1KEPGQ.js → download-hCVFPiyc.js} +1 -1
- package/static/app/assets/{folder-open-d-Pip5gr.js → folder-open-CHL82Yp7.js} +1 -1
- package/static/app/assets/{hard-drive-D20iavUb.js → hard-drive-DDzET7lk.js} +1 -1
- package/static/app/assets/index-CB93CZWW.css +2 -0
- package/static/app/assets/index-D2H-wSl6.js +13 -0
- package/static/app/assets/input-Df1CAY_I.js +1 -0
- package/static/app/assets/jsx-runtime-bzQ4Vb5N.js +1 -0
- package/static/app/assets/{link-2-BPJOFlAy.js → link-2-xNnTIX1_.js} +1 -1
- package/static/app/assets/{permissionCopy-ChdJd493.js → permissionCopy-D3aWHco-.js} +1 -1
- package/static/app/assets/primitives-BioD2slS.js +1 -0
- package/static/app/assets/search-BzBw8YcW.js +1 -0
- package/static/app/assets/{share-2-YNX_NtMU.js → share-2-FkzGf8Df.js} +1 -1
- package/static/app/assets/{shield-alert-DuQ3zrVL.js → shield-alert-B3dwzik4.js} +1 -1
- package/static/app/assets/sourceMeta-DQSY_tah.js +1 -0
- package/static/app/assets/textarea-P8o6pvOP.js +1 -0
- package/static/app/assets/useFocusTrap-hswOIkXE.js +1 -0
- package/static/app/assets/useMutation-OJLrYSRA.js +1 -0
- package/static/app/assets/workspace-BCuk3Ku9.js +1 -0
- package/static/app/index.html +4 -4
- package/static/sw.js +1 -1
- package/lattice_brain/ingestion/pipeline.py +0 -108
- package/latticeai/api/local_files.py +0 -44
- package/latticeai/api/tools.py +0 -126
- package/latticeai/api/voice_capture.py +0 -32
- package/latticeai/core/agent_permission.py +0 -85
- package/scripts/agent_eval.py +0 -34
- package/scripts/brain_quality_eval.py +0 -37
- package/scripts/check_legacy_debt.mjs +0 -91
- package/scripts/check_python.py +0 -100
- package/scripts/chunking_parity_corpus.py +0 -449
- package/scripts/generate_agent_parity_fixtures.py +0 -771
- package/scripts/generate_chunking_parity_fixtures.py +0 -259
- package/static/app/assets/Act-BPcVAbOL.js +0 -1
- package/static/app/assets/AdminConsole-Bw1ATQL0.js +0 -1
- package/static/app/assets/Brain-CT92Kos0.js +0 -321
- package/static/app/assets/BrainHome-CFBkt1K_.js +0 -2
- package/static/app/assets/BrainSignals-ReLWF2H8.js +0 -1
- package/static/app/assets/Capture-BsTokYkk.js +0 -1
- package/static/app/assets/Chronicle-B6f0T9id.js +0 -1
- package/static/app/assets/CommandPalette-CuvjTv1u.js +0 -1
- package/static/app/assets/Library-BGJbG9Hd.js +0 -1
- package/static/app/assets/LivingBrain-DGYK_Jsa.js +0 -1
- package/static/app/assets/ProductFlow-DXBC6brE.js +0 -1
- package/static/app/assets/System-CMHSO9qM.js +0 -1
- package/static/app/assets/arrow-left-BfmkskWx.js +0 -1
- package/static/app/assets/brain-CQJberbE.js +0 -1
- package/static/app/assets/button-Ct9f2_oT.js +0 -1
- package/static/app/assets/circle-check-DruOxB-4.js +0 -1
- package/static/app/assets/index-D9x-kSNy.css +0 -2
- package/static/app/assets/index-Do83hDzJ.js +0 -10
- package/static/app/assets/input-BLXVNmj1.js +0 -1
- package/static/app/assets/primitives-Cv5tbZBY.js +0 -1
- package/static/app/assets/search-CT9aho2j.js +0 -1
- package/static/app/assets/textarea-DqwLnli4.js +0 -1
- package/static/app/assets/useFocusTrap-ZVI98jaW.js +0 -1
- package/static/app/assets/useMutation-CVC4qv_D.js +0 -1
- package/static/app/assets/useQuery-C7BeG4HU.js +0 -1
- package/static/app/assets/utils-CiFtIdZq.js +0 -4
- package/static/app/assets/workspace-DQz9vIId.js +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# CI & Release Gates
|
|
2
2
|
|
|
3
|
-
> Status: reference 2026-
|
|
3
|
+
> Status: reference 2026-08-16
|
|
4
4
|
|
|
5
5
|
Reference for the GitHub Actions workflows that guard `main` and releases, the
|
|
6
6
|
supply-chain hardening applied to them, and the recommended branch-protection
|
|
@@ -11,13 +11,79 @@ configuration. Companion to [SECURITY_AUDIT.md](SECURITY_AUDIT.md) and
|
|
|
11
11
|
|
|
12
12
|
| Workflow | File | Triggers | Purpose |
|
|
13
13
|
|----------|------|----------|---------|
|
|
14
|
-
| CI | `.github/workflows/ci.yml` | push/PR to `main` | Lint, typecheck, unit + integration tests,
|
|
15
|
-
| Release | `.github/workflows/release.yml` | tags `v*` / `[0-9]*` | Build & validate
|
|
16
|
-
| Visual Smoke | `.github/workflows/visual.yml` | push
|
|
17
|
-
|
|
|
18
|
-
|
|
|
14
|
+
| CI | `.github/workflows/ci.yml` | push/PR to `main` | Lint, typecheck, unit + coverage + integration tests, product-readiness, build + wheel smoke, Rust workspace |
|
|
15
|
+
| Release | `.github/workflows/release.yml` | tags `v*` / `[0-9]*` | Build & validate artifacts (no publish; does not re-run CI lint/tests) |
|
|
16
|
+
| Visual Smoke | `.github/workflows/visual.yml` | push to `main`, nightly cron, dispatch | Playwright visual smoke (not on PRs) |
|
|
17
|
+
| Sidecar E2E | `.github/workflows/e2e-sidecar.yml` | nightly cron, dispatch | Live sidecar Playwright first-value loop |
|
|
18
|
+
| Dependency Audit | `.github/workflows/dependency-audit.yml` | weekly cron, dispatch | pip-audit + npm audit + CycloneDX SBOMs |
|
|
19
|
+
| Postgres Integration | `.github/workflows/postgres-integration.yml` | weekly cron, dispatch | Live SQLite→Postgres/pgvector migration test |
|
|
19
20
|
|
|
20
|
-
|
|
21
|
+
There is no `agent-smoke.yml`. Hosted runners have no MLX models; a fail-open
|
|
22
|
+
weekly smoke cannot report anything actionable.
|
|
23
|
+
|
|
24
|
+
Every workflow sets `concurrency.group` to `<workflow-file-stem>-${{ github.ref }}`
|
|
25
|
+
and cancels in-progress runs except on `main` (`cancel-in-progress: false` on
|
|
26
|
+
`release.yml`, which runs on tags). Job timeouts: test 40, integration 25,
|
|
27
|
+
build 20, rust 40, visual 15, sidecar 20, audit 15, release build 40,
|
|
28
|
+
postgres 20.
|
|
29
|
+
|
|
30
|
+
## CI matrix (`ci.yml`)
|
|
31
|
+
|
|
32
|
+
Four legs. Job names are `Test (Python <ver> on <os>)`:
|
|
33
|
+
|
|
34
|
+
| Leg | OpenAPI generate + upload | Full lint + typecheck + docs | Extension tests | Vitest | `pytest tests/unit/` | Coverage pytest (`tests/` + `--cov`) | Product readiness |
|
|
35
|
+
|-----|---------------------------|------------------------------|-----------------|--------|----------------------|--------------------------------------|-------------------|
|
|
36
|
+
| 3.11 + ubuntu-latest | yes | yes (`npm run lint`, `typecheck`, `docs:check-current`, `docs:check-links`) | yes (`test:browser-extension` && `test:vscode-extension`) | yes | yes | no | yes |
|
|
37
|
+
| 3.12 + ubuntu-latest | no | Python only (`lint:python`) | no | yes | yes | no | no |
|
|
38
|
+
| 3.14 + ubuntu-latest | no | Python only | no | yes | **no** (coverage invocation is the only pytest) | yes, line floor ≥90 | no |
|
|
39
|
+
| 3.11 + macos-latest | no | Python only | no | yes | yes | no | no |
|
|
40
|
+
|
|
41
|
+
Downstream jobs (after `test`): `Integration smoke test` (25 min), then
|
|
42
|
+
`Build package` (20 min). `Rust workspace` is independent (40 min).
|
|
43
|
+
|
|
44
|
+
Removed from CI **and deleted from the tree** in 11.8.0 — a script that is not
|
|
45
|
+
a gate is a script that looks like one:
|
|
46
|
+
|
|
47
|
+
- `scripts/check_python.py` — ruff parses every file on every test leg
|
|
48
|
+
- `scripts/brain_quality_eval.py`
|
|
49
|
+
- `scripts/agent_eval.py`
|
|
50
|
+
- `scripts/bench_agent_smoke.py`
|
|
51
|
+
|
|
52
|
+
## Local lint chain (`npm run lint`)
|
|
53
|
+
|
|
54
|
+
Ten members, in order:
|
|
55
|
+
|
|
56
|
+
1. `lint:python` (ruff + mypy)
|
|
57
|
+
2. `lint:visual`
|
|
58
|
+
3. `lint:frontend`
|
|
59
|
+
4. `frontend:openapi:check`
|
|
60
|
+
5. `scripts/check_i18n_literals.mjs`
|
|
61
|
+
6. `check:i18n-namespaces`
|
|
62
|
+
7. `check:bundle`
|
|
63
|
+
8. `check:server-i18n`
|
|
64
|
+
9. `scripts/check_release_evidence_bound.mjs`
|
|
65
|
+
10. `check:max-file-lines`
|
|
66
|
+
|
|
67
|
+
Not in the lint chain (CI calls the extension tests directly on the 3.11+ubuntu
|
|
68
|
+
leg; the Python legacy-shim test is authoritative):
|
|
69
|
+
|
|
70
|
+
- `test:browser-extension` / `test:vscode-extension` (script entries remain)
|
|
71
|
+
- `check:legacy-debt` (script entry and `scripts/check_legacy_debt.mjs` both
|
|
72
|
+
removed — the mjs mirror had drifted from the Python test)
|
|
73
|
+
- `check:python` (script entry and `scripts/check_python.py` both removed)
|
|
74
|
+
|
|
75
|
+
`npm run typecheck` is frontend-only (`typecheck:frontend`). The VS Code
|
|
76
|
+
extension is built by `test:vscode-extension` in CI and by `build_vsix.mjs`
|
|
77
|
+
at release.
|
|
78
|
+
|
|
79
|
+
## Coverage floor
|
|
80
|
+
|
|
81
|
+
Python: `[tool.coverage.report] fail_under = 90` (line coverage). Branch
|
|
82
|
+
measurement is off (`branch` is not set under `[tool.coverage.run]`). The
|
|
83
|
+
coverage step runs only on 3.14 + ubuntu-latest.
|
|
84
|
+
|
|
85
|
+
Frontend: `vitest.config.ts` still pins 100% thresholds on all four metrics;
|
|
86
|
+
that is unchanged and still runs on every CI test leg.
|
|
21
87
|
|
|
22
88
|
## Supply-chain hardening: pinned actions
|
|
23
89
|
|
|
@@ -36,30 +102,22 @@ from the authoritative upstream refs via `git ls-remote --tags` on 2026-07-21.
|
|
|
36
102
|
| actions/upload-artifact | v4.6.2 | `ea165f8d65b6e75b540449e92b4886f43607fa02` |
|
|
37
103
|
|
|
38
104
|
Pinning coverage: **100% of current `uses:` entries** across `ci.yml`,
|
|
39
|
-
`release.yml`, `visual.yml`, `dependency-audit.yml`, and
|
|
40
|
-
`postgres-integration.yml`.
|
|
41
|
-
|
|
105
|
+
`release.yml`, `visual.yml`, `e2e-sidecar.yml`, `dependency-audit.yml`, and
|
|
106
|
+
`postgres-integration.yml`. First-party `actions/*` plus pinned
|
|
107
|
+
`Swatinem/rust-cache` and `dtolnay/rust-toolchain` on the Rust/integration
|
|
108
|
+
legs. If a third-party action is added later, resolve and pin its SHA the same
|
|
109
|
+
way before merge.
|
|
42
110
|
|
|
43
|
-
## Dependency-audit gate posture
|
|
111
|
+
## Dependency-audit gate posture
|
|
44
112
|
|
|
45
|
-
The audit workflow is
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
`continue-on-error` keyed on the event name, so a newly-disclosed CVE in a
|
|
50
|
-
transitive dependency never reddens an unrelated PR. Findings still appear in
|
|
51
|
-
the job summary and uploaded report artifacts.
|
|
52
|
-
- `schedule` (weekly) / `workflow_dispatch`: the same steps run **strict** —
|
|
53
|
-
`pip-audit --strict` fails on any known vuln; `npm audit --audit-level=high`
|
|
54
|
-
fails on high/critical. This is the loud channel for triage.
|
|
113
|
+
The audit workflow is **schedule + dispatch only** (not on push/PR). Both
|
|
114
|
+
`pip-audit --strict` and `npm audit --audit-level=high` fail the job on
|
|
115
|
+
findings. This is the loud channel for triage; a newly-disclosed CVE cannot
|
|
116
|
+
redden an unrelated change.
|
|
55
117
|
|
|
56
118
|
CycloneDX SBOMs (`sbom-python.json`, `sbom-npm.json`) are produced every run and
|
|
57
119
|
uploaded as artifacts. Regenerate locally with `scripts/generate_sbom.py`.
|
|
58
120
|
|
|
59
|
-
**To promote to a required blocking PR check:** remove the `continue-on-error`
|
|
60
|
-
expressions in `dependency-audit.yml` and add `python-audit` / `npm-audit` to
|
|
61
|
-
the required-checks list below.
|
|
62
|
-
|
|
63
121
|
## Postgres integration gate
|
|
64
122
|
|
|
65
123
|
`postgres-integration.yml` runs the migration-integrity suite
|
|
@@ -70,31 +128,58 @@ the workflow sets that variable, and the test itself starts and tears down a
|
|
|
70
128
|
GitHub-hosted `ubuntu-latest`). It is deliberately kept off the PR path (slow,
|
|
71
129
|
image pull, needs Docker) and runs weekly + on demand.
|
|
72
130
|
|
|
131
|
+
## Visual smoke and sidecar E2E
|
|
132
|
+
|
|
133
|
+
This repository typically commits straight to `main`.
|
|
134
|
+
|
|
135
|
+
- `visual.yml` runs on push to `main`, the nightly cron, and dispatch. It does
|
|
136
|
+
**not** run on pull requests.
|
|
137
|
+
- `e2e-sidecar.yml` is nightly + dispatch only (no push, no PR).
|
|
138
|
+
|
|
73
139
|
## Recommended branch protection for `main`
|
|
74
140
|
|
|
75
|
-
Required status checks (blocking):
|
|
141
|
+
Required status checks (blocking). Names match the job `name:` fields:
|
|
142
|
+
|
|
143
|
+
- `Test (Python 3.11 on ubuntu-latest)`
|
|
144
|
+
- `Test (Python 3.12 on ubuntu-latest)`
|
|
145
|
+
- `Test (Python 3.14 on ubuntu-latest)`
|
|
146
|
+
- `Test (Python 3.11 on macos-latest)`
|
|
147
|
+
- `Integration smoke test`
|
|
148
|
+
- `Build package`
|
|
149
|
+
- `Rust workspace`
|
|
76
150
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
- `CI / Integration smoke test`
|
|
80
|
-
- `CI / Build package`
|
|
81
|
-
- `Visual Smoke / Playwright visual smoke`
|
|
151
|
+
`Playwright visual smoke` is **not** a PR-blocking check: `visual.yml` no
|
|
152
|
+
longer has a `pull_request` trigger. It still runs on every push to `main`.
|
|
82
153
|
|
|
83
|
-
Advisory / non-blocking
|
|
154
|
+
Advisory / non-blocking (schedule + dispatch only):
|
|
84
155
|
|
|
85
|
-
- `
|
|
86
|
-
- `
|
|
156
|
+
- `Python dependency audit (pip-audit)`
|
|
157
|
+
- `npm dependency audit`
|
|
87
158
|
|
|
88
|
-
Additional recommended settings
|
|
89
|
-
be up to date, require linear history, and dismiss
|
|
90
|
-
commits.
|
|
159
|
+
Additional recommended settings if pull requests are used: require PRs before
|
|
160
|
+
merge, require branches to be up to date, require linear history, and dismiss
|
|
161
|
+
stale approvals on new commits.
|
|
91
162
|
|
|
92
163
|
## Release gate (publication safety)
|
|
93
164
|
|
|
94
|
-
`release.yml` builds and validates artifacts only — it never publishes.
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
165
|
+
`release.yml` builds and validates artifacts only — it never publishes. A tag
|
|
166
|
+
is only pushed on a commit that already passed CI, so the workflow does **not**
|
|
167
|
+
re-run `npm run lint`, `npm run typecheck`, `docs:check-links`, frontend tests,
|
|
168
|
+
or `pytest tests/unit/`.
|
|
169
|
+
|
|
170
|
+
It still runs:
|
|
171
|
+
|
|
172
|
+
- checkout / setup / installs
|
|
173
|
+
- `npm run docs:check-current` (release-specific current-version docs gate)
|
|
174
|
+
- `npm run build:assets`
|
|
175
|
+
- `python scripts/product_readiness.py` (safety net)
|
|
176
|
+
- `python -m build`, `wheel_smoke.py`, `twine check`
|
|
177
|
+
- `npm pack`, vsce package
|
|
178
|
+
- `validate_release_artifacts.py <v> --require-vsix --require-tgz`
|
|
179
|
+
|
|
180
|
+
Package publication (PyPI / npm / VS Code Marketplace / Open VSX) is a manual
|
|
181
|
+
step (`npm run publish:*`) using **exact version filenames**, never a `dist/*`
|
|
182
|
+
glob, so pushing a tag can never publish by accident. See
|
|
98
183
|
[../RELEASE.md](../RELEASE.md) for the full procedure.
|
|
99
184
|
|
|
100
185
|
## Limitations (honest)
|