pi-career 0.1.0 → 0.2.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.
@@ -1,8 +1,10 @@
1
1
  # Product flow roadmap
2
2
 
3
- ## Current phase: deterministic tools and slash-command MVP
3
+ The cross-repository migration plan and measured findings are recorded in [`career-run-roadmap.md`](career-run-roadmap.md). Career Core Phase 8 and the first managed `career_run` implementation are complete; package-owned saving and PDF extraction expansion remain later phases.
4
4
 
5
- This package preserves the three stable native tools:
5
+ ## Current phase: managed agent tool and deterministic slash commands
6
+
7
+ The normal active model surface is one compact `career_run` tool. The exact raw compatibility tools remain registered but inactive until `/career-tools raw` explicitly enables them:
6
8
 
7
9
  - `career_core_discover`
8
10
  - `career_core_resume`
@@ -10,38 +12,52 @@ This package preserves the three stable native tools:
10
12
 
11
13
  It also registers:
12
14
 
13
- - `/career-setup` for library and privacy onboarding—not external CLI installation
14
- - `/career-library` for explicitly configured Markdown/text resume roots
15
+ - `/career-setup` for library/privacy onboarding and a suggestion-only preferred variation directory—not external CLI installation
16
+ - `/career-library` for explicitly configured searchable PDF, Markdown, and text resume roots, with actionable extraction notices
17
+ - `/career-application` for session-scoped company/role identity and vacancy/result isolation
15
18
  - `/career-vacancy` for bounded vacancy input after session-persistence consent
16
19
  - `/career-match` for deterministic multi-resume matching and conservative ranking
17
20
  - `/career-analyze` for deterministic single-resume readiness detail
21
+ - `/career-workbench` for a bounded, guided, visibly reviewable rebuild handoff to the user's normal Pi editor
22
+ - `/career-tools` to switch between the managed-only and advanced raw model-tool surfaces
18
23
 
19
- On supported targets all eight routes invoke the package-owned deterministic Career Core runtime. Slash commands call the shared process helper directly and do not use a provider/model or an LLM-facing tool.
24
+ `career_run`, the raw compatibility tools, `/career-vacancy`, `/career-match`, and `/career-analyze` invoke the compatible Career Core route selected by the external resolver. Managed compatibility is validated before private input, and the reviewed exact package may be acquired only after local routes fail unless `PI_OFFLINE=1`. `career_run` validates Phase 8 operation/schema contracts internally, resolves current originals/vacancy through ephemeral handles, keeps complete results in bounded process memory, and exposes compact detail hydration without nested `input_json`. Setup/library scanning remains local. `/career-application` manages consented session state only. `/career-workbench` does not invoke Core or a provider/model itself: it prepares an ordinary editor message containing one original resume and, only for tailoring, the current vacancy. Guided modes cover complete score explanation, reviewed improvement suggestions, a question-led factual interview before reviewed replacements, direct reviewed exact replacements, and vacancy-specific variant review. The user must review and submit that message separately through Pi.
20
25
 
21
26
  Binding boundaries:
22
27
 
23
- - no provider/model calls in deterministic commands
24
- - agent-directory-relative non-sensitive config only
25
- - no resume or vacancy text in global config
28
+ - no package-initiated provider/model calls or automatic submission; the workbench stops at a reviewable editor prompt, and only the user's later ordinary Pi submission may contact the selected provider; exact-package acquisition before private stdin is the sole network-capable adapter-runtime behavior
29
+ - agent-directory-relative non-sensitive config only; it may contain canonical library roots and one bounded absolute preferred variation-directory suggestion
30
+ - no resume or vacancy text in global config; a variation-directory preference is destination guidance, not write approval
26
31
  - session entries only after explicit persistence consent; entries persist to JSONL even when excluded from model context
32
+ - one company/role per Pi session; application IDs scope vacancy/result state and `/new` prevents prior company prompts from remaining in the next application conversation
27
33
  - original resumes only for deterministic analyze/match
28
34
  - assisted variants remain labeled and excluded from authoritative reranking
29
35
  - stable path/id tie-breaking; any close-cluster label is a UI heuristic, not a Core result
30
36
  - cancellation aborts the active child and stops remaining batch work
31
- - no full-result export unless a separate bounded local-file workflow is designed and tested
37
+ - complete slash-command Core results remain transiently inspectable through a read-only pager; managed full results/exact review inputs remain only in a 16-entry/64-MiB ephemeral registry, and no full JSON is added to session state or written to a file
38
+ - searchable PDF text extraction is local and isolated with fixed byte/page/time/memory/result ceilings; OCR and document rewriting remain out of scope
39
+ - workbench prompts keep originals immutable, omit absolute source paths, treat document text as untrusted data, rerun complete deterministic baselines after submission, and require Career Core review of external suggestions, replacements, and variant changes
40
+ - workbench prompts may include a privacy-reduced preferred variation-directory display path from setup; the selected agent recommends it first only after a separate user request and receives no automatic write authority
41
+ - review proposals use verbatim source targets and in-range evidence, prefer single-line targets, make one review attempt, and surface discard codes instead of model-led repair/retry loops
42
+ - raw tool JSON remains authoritative; managed projections refer to complete authoritative in-memory results by handle, while prose hydrates only requested evidence and retained items
43
+ - PDF workbench output is suggestion-only because extracted text cannot expose or preserve visual layout; Markdown/text prompts require existing structure and unchanged wording to remain intact
44
+ - no full-result file export unless a separate bounded local-file workflow is designed and tested
45
+
46
+ The approved workflow specification fixes command behavior, persistence format, non-TUI behavior, bounded UI, and cancellation ownership. Print/JSON modes fail closed except for the pure `/career-vacancy clear` state action. Company/role isolation and future opt-in artifact persistence follow the separate [`application-workspaces.md`](application-workspaces.md) contract.
47
+
48
+ ## Assisted handoff and later materialization
32
49
 
33
- The approved workflow specification fixes command behavior, persistence format, non-TUI behavior, bounded UI, and cancellation ownership. Print/JSON modes fail closed except for the pure `/career-vacancy clear` state action.
50
+ The current workbench prepares private context in Pi's editor only. It does not call a model, hide the source payload, or write a document. Submitting is the user's separate provider action. The prompt directs the selected Pi agent to start with `career_run context`, use internal exact Phase 8 contract discovery, rerun and preserve complete deterministic baselines behind ephemeral handles, and pass external suggestions, replacements, or variant changes through the corresponding Career Core review before presenting them. The question-led rewrite mode reviews first, asks one bounded batch of user-verifiable factual questions, and waits for a later turn before drafting or reviewing exact replacements.
34
51
 
35
- ## Later phase: assisted workflows
52
+ For a non-PDF vacancy-specific variant, the first assisted turn must stop after review and ask the user to explicitly select Core-assigned canonical change IDs. Only a later turn may invoke deterministic materialization with exactly those selected IDs. The result remains assisted/non-authoritative and cannot enter authoritative analysis or matching. PDF workbenches stop after reviewed targeted changes for manual application and never materialize extracted text as a styled resume.
36
53
 
37
- Model-assisted tailoring or suggestion review is intentionally deferred. A future phase may use the currently selected Pi model only after separate provider consent, validate one bounded schema-driven proposal, pass it through Career Core review/materialization, and save a new immutable assisted file. It must not add provider fallback, automatic repair/retry, overwrite originals, auto-apply changes, or feed assisted output back into authoritative analysis/matching.
54
+ Automatic variant saving remains deferred. Setup now records or derives only a preferred destination suggestion: an explicit override wins, otherwise `variants/` under the selected original's configured root is recommended. It creates no directory or file. A future phase may save a newly materialized immutable assisted file only after separate local-file approval. It must not add provider fallback, automatic repair/retry, overwrite originals, auto-apply changes, or feed assisted output back into authoritative analysis/matching.
38
55
 
39
56
  ## Non-goals in this phase
40
57
 
41
- - provider/model-assisted commands or full-screen UI
42
- - PDF/DOCX/OCR/URL ingestion
43
- - model/provider integration
58
+ - package-initiated provider/model clients, credentials, automatic prompt submission, or full-screen UI
59
+ - DOCX/OCR/URL ingestion; image-only PDFs require external OCR or export
44
60
  - source-document or full-Core-result persistence outside the approved config/custom-entry workflow
45
61
  - source document mutation
46
- - publication, release downloads, signing, or notarization
47
- - expanded runtime platform claims beyond `darwin-arm64` and `linux-x64-gnu`
62
+ - career-document publication/export, release-asset downloads, signing, or notarization
63
+ - package-owned native binaries or platform claims beyond the exact reviewed `@revazi/career@0.1.1` catalog
package/docs/releasing.md CHANGED
@@ -1,79 +1,90 @@
1
1
  # Release process
2
2
 
3
- This document records the bounded `v0.1.0` release process and evidence requirements.
3
+ This document defines the bounded trusted-publishing release process for `pi-career@0.2.0` and records the historical `v0.1.0` outcome.
4
4
 
5
- ## Approved channel boundary
5
+ ## Release boundary
6
6
 
7
- After every gate below is closed, the authorized channels are:
7
+ The coordinated `v0.2.0` release may create exactly:
8
8
 
9
- 1. one public `pi-career@0.1.0` npm package;
10
- 2. one annotated, unsigned `v0.1.0` Git tag pointing to the exact published commit; and
11
- 3. one GitHub Release containing notes derived from the finalized `CHANGELOG.md` entry.
9
+ 1. one public `pi-career@0.2.0` npm package on `https://registry.npmjs.org/`;
10
+ 2. one annotated, unsigned `v0.2.0` Git tag pointing to the exact published commit; and
11
+ 3. one GitHub Release for that tag with notes derived from the finalized [`CHANGELOG.md`](../CHANGELOG.md) entry.
12
12
 
13
- The npm package contains the strict allowlisted artifact tested by `npm run check:package`, including both unsigned native binaries. The project will not publish to crates.io, attach the npm tarball or native binary as a custom GitHub Release asset, add lifecycle/publication scripts, or claim signing/notarization. GitHub automatically generated source archives contain the complete tracked tree and are not substitutes for the tested npm artifact.
13
+ The npm package must be the native-free allowlisted artifact verified by `npm run check:package`. It contains the Pi extension, generated PDF worker, Agent Skill, and documentation. It must contain no `runtime/`, native executable, `node_modules`, Pi peer package contents, production dependency tree, lifecycle download/build hook, or publication script.
14
14
 
15
- The exact npm version and reviewed full commit SHA are the canonical installation and audit coordinates. The GitHub Release notes must state that SHA and the npm package's registry integrity. A tag is a discovery label, not a substitute for immutable commit review, and README Git installation instructions must continue to use a full SHA.
15
+ Career Core distribution remains external. The candidate pins exact [`@revazi/career@0.1.1`](https://www.npmjs.com/package/@revazi/career/v/0.1.1); its reviewed launcher owns native target/libc, package metadata, provenance, Unix mode or Windows file invariant, size, format, architecture, and SHA-256 verification. Pi-career must not copy those algorithms or artifacts.
16
16
 
17
- There is no automated publication workflow. Release execution is manual; sole maintainer Revaz Zakalashvili explicitly authorized the coordinated `v0.1.0` npm publication, tag, and GitHub Release after the candidate gates.
17
+ The reviewed external release is bound to Career Core commit/tag `0318b3b0993ee23093c8f023757fa7e4d8b3b8e0`/`v0.1.1` and successful protected publication run [`31346152236`](https://github.com/revazi/career-core/actions/runs/31346152236). The launcher registry integrity is `sha512-K2WojK0wbuMt4WWT87jrLUiRWLwlDeYR0BcSTqlaTGc0SNw4z7VWkSe7utFwH2MFhHaIE1iHWfpsj+nNlHklvQ==`; registry metadata reports SLSA v1 provenance for the launcher and all eight lockstep native packages.
18
18
 
19
- ## Blocking gates
19
+ The sole permitted automated publication path is the tag-triggered `.github/workflows/release.yml` workflow using npm Trusted Publishing through GitHub OIDC and the protected `npm` environment. It must use no `NPM_TOKEN`, `NODE_AUTH_TOKEN`, OTP, or other long-lived publication credential. Preparation, CI success, a version bump, workflow availability, or this document does **not** authorize tag creation/push, npm publication, or a GitHub Release; release execution remains a separate explicit maintainer action. Do not publish to crates.io, attach an npm tarball/native binary as a custom GitHub Release asset, add signing/notarization claims, or add lifecycle/publication scripts.
20
20
 
21
- Every item in this section blocks the npm publication, tag, and GitHub Release. A skipped, unknown, or merely planned result is not a pass.
21
+ The exact npm version and full published commit SHA are the canonical installation and audit coordinates. The GitHub Release notes must state that SHA and the npm registry integrity. A tag is a discovery label, not a substitute for immutable commit review.
22
22
 
23
- ### 1. Freeze and review the exact candidate
24
-
25
- - Start from synchronized public `main` and identify one full candidate SHA.
26
- - Ensure the candidate contains no private career content, credentials, sessions, provider output, generated local paths, or unreviewed runtime bytes.
27
- - Review the complete diff and confirm `package.json` remains `0.1.0`, explicitly public only at `https://registry.npmjs.org/`, peer-only at runtime, and free of lifecycle/publication scripts.
28
- - Confirm `src/`, `dist/index.js`, runtime manifest/provenance, package contents, supported targets, and the exact three native tools remain aligned.
29
- - Do not move the candidate after its local and hosted evidence is recorded. Any content change creates a new candidate and requires the gate again.
30
-
31
- ### 2. Human native-license review
23
+ ## Historical `v0.1.0` outcome
32
24
 
33
- [`native-dependency-inventory.md`](native-dependency-inventory.md) records the exact 30-package normal/build Cargo graph, selected MIT texts for all 28 crates.io packages, the two Career Core workspace packages, Rust 1.97.1 Standard Library evidence, Unicode-3.0 requirement, target dynamic imports, and the Swift/UniFFI exclusion. `npm run check:native-licenses` enforces every packaged license/notice hash, inventory coordinate, target, provenance compiler version, and file boundary. This is evidence, not legal advice, an SPDX/CycloneDX SBOM, or an automated approval.
25
+ Release execution completed on 2026-08-06:
34
26
 
35
- Before publication, a human reviewer must:
27
+ - npm: [`pi-career@0.1.0`](https://www.npmjs.com/package/pi-career/v/0.1.0)
28
+ - commit: `967da62503bc8a97c070946f6506ea3471baeb34`
29
+ - annotated unsigned tag: [`v0.1.0`](https://github.com/revazi/pi-career/releases/tag/v0.1.0)
30
+ - npm integrity: `sha512-mmbDdWDyWz77f2uLzZECJT9E6w1ZRCJjYFrUnZd3ldoS6ehEa5DrCENIfavHR5xMOFi0of6AVQ35ZTxwpeDeAQ==`
31
+ - npm shasum: `4212cea50c08c98771df267361cee28070a15765`
32
+ - custom GitHub Release assets: none
36
33
 
37
- - verify the inventory against Career Core commit `a3cdb4c6d7f966397e93ea4664071975bca7228c`, Cargo.lock SHA-256 `18d188cfea79128d4024dabe2e21f57e5d2098d32ffac8c4ef01243f49abb609`, and both per-target provenance records;
38
- - confirm the documented MIT selections, exact grouped upstream texts/copyright notices, Rust Standard Library evidence, and Unicode License V3 payload satisfy the package-owned obligations for both native binaries;
39
- - confirm the host-supplied dynamic-library boundary and that excluded Fuchsia/Swift/UniFFI dependencies are not part of either distributed target; and
40
- - record an explicit approve/block decision without presenting the inventory as legal advice.
34
+ That release bundled native Career Core artifacts. Its dependency/license/provenance evidence remains historical in [`native-dependency-inventory.md`](native-dependency-inventory.md) and [`licenses/`](licenses/). None of those native files may re-enter the `v0.2.0` package.
41
35
 
42
- Independent review is preferred. When the project has only one maintainer, that sole maintainer may complete and record the review, but release notes must disclose that it was maintainer self-review rather than independent legal review. No npm publication, tag, or release may proceed while the human decision is absent or blocked. Any dependency, compiler, target, binary, provenance, or notice change invalidates the evidence and requires a fresh inventory and review.
36
+ ## `v0.2.0` release gates
43
37
 
44
- For `v0.1.0`, sole maintainer Revaz Zakalashvili reviewed the evidence above and recorded **APPROVED** for both packaged targets. This is a maintainer release decision, not independent review or legal advice.
38
+ A skipped, unknown, stale, or merely planned result is not a pass.
45
39
 
46
- ### 3. Upstream artifact-expiry decision
40
+ ### 1. Freeze and review the exact candidate
47
41
 
48
- The imported binaries and provenance remain tracked and hash-verified in this repository, but the original Career Core Actions artifacts were ephemeral:
42
+ - Start from synchronized public `main` and identify one full candidate SHA.
43
+ - Require a clean Git tree and no divergence from `origin/main`.
44
+ - Confirm `package.json`, the root package-lock entries, the Skill metadata, package assertions, changelog, README, and release documentation all identify pi-career `0.2.0` where appropriate.
45
+ - Keep Career Core and `@revazi/career` compatibility coordinates at exact `0.1.1`; do not confuse the adapter release version with the external runtime version.
46
+ - Confirm `package.json` is explicitly public only at `https://registry.npmjs.org/`, has exactly four wildcard Pi peers, declares no production/optional/bundled dependency tree, and has no lifecycle/publication script.
47
+ - Ensure the candidate contains no real resume, vacancy, credentials, Pi session, provider output, generated local path, npm token, or unreviewed executable.
48
+ - Review the complete diff from `v0.1.0`, including authoritative `src/`, generated `dist/index.js`/`dist/pdf-worker.js`, `career_run`, all three exact raw tools, slash commands, external resolver, Skill, and package documentation.
49
+ - Do not move the candidate after local/hosted evidence is recorded. Any content change creates a new candidate and requires the gates again.
49
50
 
50
- | Artifact ID | Target | GitHub-reported expiry |
51
- |---:|---|---|
52
- | `8910079991` | `darwin-arm64` | `2026-08-07T21:43:37Z` |
53
- | `8910084163` | `linux-x64-gnu` | `2026-08-07T21:43:47Z` |
51
+ ### 2. Review the external runtime boundary
54
52
 
55
- Before npm publication, a human must recheck artifact availability and explicitly decide whether the tracked binaries, per-target provenance, manifest, archive identities/hashes, and public Core commit are sufficient durable provenance after expiry. If they are not sufficient, release stays blocked pending a separately approved preservation plan. The release process does not download, copy, upload, recreate, or relabel either artifact.
53
+ - Confirm the only acquisition coordinate remains exact `@revazi/career@0.1.1` from the canonical npm registry.
54
+ - Confirm runtime order remains: absolute `CAREER_CLI_PATH`, PATH `career`, package-local exact launcher, then bounded exact-package acquisition unless `PI_OFFLINE=1`.
55
+ - Confirm every caller-controlled route must pass the exact managed Core 0.1.1 operation catalog and required self-contained schema bundles before private stdin opens.
56
+ - Confirm package-local/acquired routes delegate native target/libc/provenance/mode or Windows file invariant/size/format/architecture/SHA-256 verification to the reviewed launcher.
57
+ - Confirm all nine exact npm packages remain version-lockstep, have canonical registry integrity and SLSA v1 provenance, and match the ordered v2 launcher catalog from reviewed Core commit `0318b3b0993ee23093c8f023757fa7e4d8b3b8e0`.
58
+ - Run the exact-package integration test on the six hosted macOS/GNU Linux/musl Linux release targets. Updating the external package coordinate, native target list, launcher schema, or managed Core contract requires separate compatibility, provenance, audit, and package review before this gate can pass.
56
59
 
57
- For `v0.1.0`, sole maintainer Revaz Zakalashvili rechecked both artifacts on 2026-08-06 and recorded **SUFFICIENT**: the tracked binaries, per-target provenance, manifest, archive identities/hashes, public Core commit, and package verification are accepted as the durable evidence after upstream expiry.
60
+ ### 3. Require clean audits and strict package proof
58
61
 
59
- ### 4. Clean production and full audits
62
+ `npm run audit:production` and `npm run audit:full` must both report zero vulnerabilities at explicit `--audit-level=low`. No audit acceptance baseline is allowed.
60
63
 
61
- `npm run audit:production` must pass with zero package-owned production vulnerabilities and `npm run audit:full` must pass with zero vulnerabilities across the complete development/host-Pi tree, both at explicit `--audit-level=low`. The production audit omits development, optional, and peer trees because the tarball owns no runtime dependency tree; strict package checks separately prove there is no `node_modules` or Pi package content and that exactly four wildcard peers remain external.
64
+ `npm run check:publish` must prove:
62
65
 
63
- Both audits invoke `process.execPath` plus the absolute npm CLI derived from the real Node installation, verify any inherited `npm_execpath`, remove omit/include/audit-level/`NODE_ENV` overrides, strictly parse bounded JSON, and reject duplicate decoded keys. `npm run check:publish` is the authoritative readiness gate but performs no publication. It is a direct Node orchestrator with no nested npm command and requires both clean audits plus extracted package/load/install proof. Pack uses the trusted absolute npm CLI; listing and extraction use verified root-owned absolute `/usr/bin/tar`, never PATH-selected tools.
66
+ - both strict audits are clean;
67
+ - trusted npm is derived from the real Node installation and conflicting `npm_execpath` is rejected;
68
+ - npm environment overrides and duplicate decoded JSON keys cannot weaken checks;
69
+ - package listing/extraction uses verified absolute `/usr/bin/tar`;
70
+ - the tarball matches the exact allowlist and size bounds;
71
+ - no native runtime, `node_modules`, Pi peer contents, production dependency tree, or lifecycle/publication script is present;
72
+ - extracted package loading, stable offline failure, and isolated Pi install/list/remove behavior pass.
64
73
 
65
- The former temporary development/host-Pi acceptance was explicitly retired after upgrading the Pi development baseline to `0.84.0`; no accepted-audit file or validator remains. Do not use `npm audit fix --force`, downgrade the Pi baseline, override or patch the published Pi shrinkwrap, hand-edit lock entries, or add a replacement acceptance. A future finding blocks publication until remediated.
74
+ Do not use `npm audit fix --force`, downgrade the Pi baseline, hand-edit third-party lock entries, or add an acceptance file. A future vulnerability blocks release until remediated.
66
75
 
67
- ### 5. Complete verification on the frozen SHA
76
+ ### 4. Run complete verification on the frozen SHA
68
77
 
69
78
  Run with Node.js 22.19 or newer:
70
79
 
71
80
  ```bash
72
81
  npm ci
73
82
  npm run build
74
- git diff --exit-code -- dist/index.js
83
+ git diff --exit-code -- dist/index.js dist/pdf-worker.js
84
+ npm run bench:tokens
75
85
  npm run check
76
- npm run test:bundled-runtime
86
+ npm run test:runtime-resolution
87
+ npm run test:career-package
77
88
  npm run audit:production
78
89
  npm run audit:full
79
90
  npm run check:publish
@@ -86,37 +97,73 @@ git diff --check
86
97
 
87
98
  Requirements:
88
99
 
89
- - `npm run build` may reproduce tracked `dist/index.js`; it must not alter runtime artifacts. The immediate dist diff must pass.
90
- - All project/runtime/package/offline checks and both zero-vulnerability audits must pass, the runtime npm tree must remain empty, and `npm run check:publish` must pass.
91
- - Compatibility must execute against an explicitly reviewed fixture checkout; a skip is not release evidence.
92
- - No audit acceptance or not-clean full-audit claim is permitted.
93
- - The exact final SHA must then pass both required hosted native jobs: `darwin-arm64` on macOS arm64 and `linux-x64-gnu` on Linux x64 glibc.
100
+ - The immediate dist diff after `npm run build` must pass; a later reproducibility test alone does not prove the candidate committed the generated output.
101
+ - Token measurements must exactly reproduce the committed baseline and remain within budgets.
102
+ - Exact-package acquisition must execute managed discovery plus representative synthetic resume/job operations.
103
+ - Compatibility must run against an explicitly reviewed fixture checkout. A skip is not release evidence.
104
+ - The production npm tree must remain empty apart from unmet external peers expected in the Pi host.
105
+ - No command may create a repository tarball, native runtime, payload/result file, acceptance baseline, or publication side effect.
106
+
107
+ ### 5. Require hosted checks on the same SHA
108
+
109
+ Main branch protection must require the strict, up-to-date `Adapter checks` context. That ordinary pull-request job proves the build, deterministic adapter tests, native-free package, offline loading/install, and diff checks without acquiring or executing the external Career package.
110
+
111
+ The costly six-target matrix is not an automatic pull-request check. After freezing the final SHA on public `main`, manually dispatch `.github/workflows/external-career.yml` on that exact ref and require all six native GitHub checks:
112
+
113
+ ```bash
114
+ gh workflow run external-career.yml --ref main
115
+ ```
116
+
117
+ - `External Career package (darwin-arm64)`;
118
+ - `External Career package (darwin-x64)`;
119
+ - `External Career package (linux-x64-gnu)`;
120
+ - `External Career package (linux-arm64-gnu)`;
121
+ - `External Career package (linux-x64-musl)`;
122
+ - `External Career package (linux-arm64-musl)`.
123
+
124
+ Record the dispatched run's `headSha` and reject it unless it equals the frozen release SHA. The macOS arm64 and Linux x64 GNU jobs execute the complete release ladder, including immediate dist reproducibility, clean audits, native-free package proof, offline smokes, and diff checks. Every target job executes a native Node build, exact launcher acquisition, managed contracts, representative synthetic resume/job operations, runtime resolver checks, and offline package load. Dispatch this matrix for external package coordinate, launcher/platform catalog, runtime resolver, managed Core contract, and release reviews—not for unrelated ordinary pull requests.
125
+
126
+ ### 6. Finalize release-facing text
94
127
 
95
- ### 6. Finalize notes only after all other gates pass
128
+ Before release authorization:
96
129
 
97
- After every preceding gate passes, a separately committed finalization change must:
130
+ - convert `CHANGELOG.md` candidate notes to the dated `0.2.0` entry;
131
+ - ensure README installation uses exact `npm:pi-career@0.2.0` and clearly distinguishes historical v0.1.0;
132
+ - state that pi-career packages no native runtime and identify exact external `@revazi/career@0.1.1` plus all eight supported targets;
133
+ - state that both production and complete development/host-Pi audits are clean at the explicit low threshold;
134
+ - keep all full commit SHA and npm integrity placeholders out of tracked files until those values exist; record them in the GitHub Release after publication.
98
135
 
99
- - convert the candidate notes to a dated `0.1.0` entry;
100
- - preserve unsigned/not-notarized runtime caveats and the two supported targets;
101
- - state that `pi-career@0.1.0` is the public npm package and that there is no crate publication or custom release asset; and
102
- - state that both the package-owned production audit and complete development/host-Pi audit are clean at the explicit low threshold.
136
+ The finalization commit cannot contain its own SHA. Only the separately authorized final clean commit may be published and receive `v0.2.0`.
103
137
 
104
- A commit cannot contain its own Git SHA. After the finalization commit exists, record its full SHA in the GitHub Release notes and verify npm's `gitHead` against it. Only that separately authorized final commit may receive the annotated tag, npm publication, and GitHub Release.
138
+ ## Manual pre-publication checks
105
139
 
106
- ## Manual release execution
140
+ Run these only on the frozen clean candidate:
107
141
 
108
- After all blocking gates pass on the final clean commit and the maintainer has explicitly authorized execution:
142
+ 1. Confirm npm package `pi-career` has exactly the GitHub Actions trusted publisher `revazi/pi-career`, workflow `release.yml`, environment `npm`.
143
+ 2. Confirm the GitHub `npm` environment exists and applies the reviewed deployment protections. No npm token or OTP may be stored in GitHub, npm configuration, repository files, Pi messages, logs, or release notes.
144
+ 3. Confirm `npm view pi-career@0.2.0 version --json` reports no existing version. npm versions are immutable.
145
+ 4. Run trusted `npm pack --dry-run --json --ignore-scripts` or rely on the stricter recorded `check:publish` artifact proof.
146
+ 5. Record the candidate full SHA, package filename/size, clean audit results, hosted run URLs, and reviewed fixture SHA outside private content.
147
+ 6. Obtain explicit release authorization. Do not infer authorization from readiness work.
109
148
 
110
- 1. Confirm `npm whoami` identifies the intended npm account and the registry is exactly `https://registry.npmjs.org/`. Never place an npm token or one-time password in repository files, Pi messages, logs, or release notes.
111
- 2. Reconfirm that `npm view pi-career@0.1.0 version --json` returns not found. A registry name check does not reserve the name.
112
- 3. Create and push the unsigned annotated `v0.1.0` tag for the exact final commit.
113
- 4. From Node 22.19.0/npm 10.9.3, publish once with lifecycle scripts disabled:
149
+ ## Authorized release execution
114
150
 
115
- ```bash
116
- npm publish --access public --tag latest --ignore-scripts
117
- ```
151
+ Only after every gate passes and the maintainer explicitly authorizes release execution:
118
152
 
119
- 5. Verify `npm view pi-career@0.1.0 --json` reports the expected version, repository, four peers, tarball integrity, and `gitHead`; then perform an isolated `pi install npm:pi-career@0.1.0`, package load, bundled-runtime smoke, and removal on a supported target.
120
- 6. Create the GitHub Release from `v0.1.0`. State the full commit SHA, npm registry integrity, supported targets, unsigned/not-notarized binaries, no crate/custom assets, zero-vulnerability package-owned production and complete development/host-Pi audits at the explicit low threshold, and that native-license evidence received sole-maintainer self-review rather than independent legal review.
153
+ 1. Reconfirm the clean SHA, branch protection checks, trusted-publisher/environment configuration, canonical registry, and absence of `pi-career@0.2.0`.
154
+ 2. Create one annotated unsigned `v0.2.0` tag on the exact candidate and push only that tag. The tag is the immutable input that triggers `.github/workflows/release.yml`; the workflow must never create or move it.
155
+ 3. The workflow must verify the tag/version/changelog/SHA, install exact trusted-publishing-compatible npm tooling, run the complete package publication gate, and publish with lifecycle scripts disabled, public/latest coordinates, and npm provenance through OIDC.
156
+ 4. If publication returns an ambiguous response, query the registry before any rerun. Never move the tag, attempt to overwrite the version, or blindly republish.
157
+ 5. Before creating the GitHub Release, the workflow must verify registry metadata: version, repository, four wildcard peers, no dependency tree/lifecycle scripts, tarball integrity, shasum, provenance, and `gitHead` equal to the tagged candidate SHA.
158
+ 6. The workflow must create the GitHub Release from the existing `v0.2.0` tag with:
159
+ - full commit SHA;
160
+ - npm integrity and shasum;
161
+ - exact external `@revazi/career@0.1.1` coordinate;
162
+ - all eight reviewed macOS, GNU Linux, musl Linux, and MSVC Windows targets;
163
+ - native-free pi-career package statement;
164
+ - clean production/full audit statement;
165
+ - no crate publication, signing/notarization claim, or custom release asset.
166
+ 7. In an isolated Pi agent directory, install exact `npm:pi-career@0.2.0`, list/load it, exercise exact-package runtime acquisition with synthetic operations on a supported target, test offline failure, and remove it.
167
+ 8. Recheck the npm dist-tag, Git tag target, GitHub Release target, provenance, and main CI after all channels settle.
121
168
 
122
- Do not sign, attach assets, change repository settings, publish another registry tag/version, or retry after an ambiguous registry response without first querying the registry. npm versions are immutable; a failed post-publication check is an incident, not permission to overwrite `0.1.0`.
169
+ Do not sign, attach assets, change repository visibility, add an alternate publication workflow or token-based path, publish another registry tag/version, or retry an ambiguous operation without first querying authoritative state. A failed post-publication check is an incident, not permission to replace `0.2.0`.
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 Revaz Zakalashvili
3
+ Copyright (c) 2023-PRESENT Johann Schopplich
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "pi-career",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "private": false,
5
- "description": "Self-contained Pi tools, slash commands, and Agent Skill for deterministic Career Core workflows",
5
+ "description": "Pi tools, slash commands, and Agent Skill for deterministic Career Core workflows",
6
6
  "license": "MIT OR Apache-2.0",
7
7
  "author": {
8
8
  "name": "Revaz Zakalashvili",
@@ -26,7 +26,6 @@
26
26
  "files": [
27
27
  "dist",
28
28
  "docs",
29
- "runtime",
30
29
  "skills",
31
30
  "CHANGELOG.md",
32
31
  "SECURITY.md",
@@ -43,13 +42,12 @@
43
42
  "test:runtime": "node --import tsx --test tests/runtime/runtime.test.mjs",
44
43
  "test:workflow": "node --import tsx --test tests/workflow/*.test.mjs",
45
44
  "test:audit": "node --test tests/audit/*.test.mjs",
46
- "test:bundled-runtime": "node scripts/test-bundled-runtime.mjs",
45
+ "test:runtime-resolution": "node --import tsx --test tests/runtime/runtime.test.mjs",
46
+ "test:career-package": "node scripts/test-career-package.mjs",
47
47
  "test:pi-smoke": "node scripts/test-pi-package-load.mjs",
48
48
  "test:install": "node scripts/test-isolated-install.mjs",
49
- "test:compat": "node scripts/test-bundled-runtime-compat.mjs",
49
+ "test:compat": "node scripts/test-career-package-compat.mjs",
50
50
  "check:dist": "node scripts/check-dist.mjs",
51
- "check:runtime-artifacts": "node scripts/check-runtime-artifacts.mjs",
52
- "check:native-licenses": "node scripts/check-native-license-inventory.mjs",
53
51
  "check:package": "node scripts/check-package.mjs",
54
52
  "check:publish": "node scripts/check-publish.mjs",
55
53
  "check:links": "node scripts/check-links.mjs",
@@ -57,8 +55,9 @@
57
55
  "check:runtime": "node scripts/check-runtime-boundary.mjs",
58
56
  "audit:production": "node scripts/audit-production.mjs",
59
57
  "audit:full": "node scripts/audit-full.mjs",
58
+ "bench:tokens": "node --import tsx scripts/token-benchmark.mjs",
60
59
  "check:syntax": "node --check scripts/*.mjs scripts/lib/*.mjs tests/audit/*.mjs tests/process/*.mjs tests/runtime/*.mjs tests/workflow/*.mjs",
61
- "check": "npm run typecheck && npm run check:dist && npm run check:runtime-artifacts && npm run check:native-licenses && npm test && npm run check:runtime && npm run check:links && npm run check:secrets && npm run check:syntax"
60
+ "check": "npm run typecheck && npm run check:dist && npm test && npm run check:runtime && npm run check:links && npm run check:secrets && npm run check:syntax"
62
61
  },
63
62
  "peerDependencies": {
64
63
  "@earendil-works/pi-ai": "*",
@@ -72,9 +71,11 @@
72
71
  "@earendil-works/pi-tui": "0.84.0",
73
72
  "@types/node": "24.12.4",
74
73
  "esbuild": "0.28.1",
74
+ "js-tiktoken": "1.0.21",
75
75
  "tsx": "4.23.5",
76
76
  "typebox": "1.3.7",
77
- "typescript": "5.9.3"
77
+ "typescript": "5.9.3",
78
+ "unpdf": "1.8.0"
78
79
  },
79
80
  "publishConfig": {
80
81
  "access": "public",