pi-career 0.1.0 → 0.3.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/CHANGELOG.md +51 -0
- package/NOTICE +11 -20
- package/README.md +428 -79
- package/SECURITY.md +26 -18
- package/dist/index.js +3913 -509
- package/dist/pdf-worker.js +115 -0
- package/docs/application-workspaces.md +145 -0
- package/docs/career-run-roadmap.md +266 -0
- package/docs/design.md +48 -42
- package/docs/native-dependency-inventory.md +6 -6
- package/docs/product-flow.md +38 -17
- package/docs/releasing.md +135 -65
- package/{runtime/LICENSE-MIT → docs/unpdf-LICENSE-MIT.txt} +1 -1
- package/docs/variant-save-workflow.md +303 -0
- package/package.json +15 -9
- package/skills/career-core/SKILL.md +57 -90
- package/skills/career-core/references/cli-contract.md +47 -25
- package/runtime/LICENSE-APACHE +0 -201
- package/runtime/THIRD_PARTY_NOTICES.md +0 -22
- package/runtime/darwin-arm64/career +0 -0
- package/runtime/darwin-arm64/provenance.json +0 -101
- package/runtime/linux-x64-gnu/career +0 -0
- package/runtime/linux-x64-gnu/provenance.json +0 -101
- package/runtime/manifest.json +0 -109
|
@@ -2,17 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
## Status and scope
|
|
4
4
|
|
|
5
|
-
This is reproducible dependency evidence for the two native `career` binaries
|
|
5
|
+
This is historical reproducible dependency evidence for the two native `career` binaries packaged by pi-career `v0.1.0` and its pre-external-resolver development candidate. Pi-career `v0.2.0` and later track and package no native binary; native distribution evidence belongs to `@revazi/career`. This document is **not legal advice**, a legal-compliance conclusion, an SPDX/CycloneDX SBOM, or release approval.
|
|
6
6
|
|
|
7
7
|
The inventory is pinned to:
|
|
8
8
|
|
|
9
|
-
- Career Core commit [`
|
|
9
|
+
- Career Core commit [`f6d17835de4817e28ce84e8e5734ff592687dfcc`](https://github.com/revazi/career-core/tree/f6d17835de4817e28ce84e8e5734ff592687dfcc)
|
|
10
10
|
- Cargo.lock SHA-256 `18d188cfea79128d4024dabe2e21f57e5d2098d32ffac8c4ef01243f49abb609`
|
|
11
11
|
- package `career-cli 0.1.0`
|
|
12
12
|
- build edges `normal,build`, excluding development dependencies
|
|
13
13
|
- targets `aarch64-apple-darwin` and `x86_64-unknown-linux-gnu`
|
|
14
14
|
|
|
15
|
-
The per-target provenance records
|
|
15
|
+
The historical per-target provenance records showed the corresponding locked release builds:
|
|
16
16
|
|
|
17
17
|
```text
|
|
18
18
|
cargo build --release --locked -p career-cli --target aarch64-apple-darwin
|
|
@@ -21,7 +21,7 @@ cargo build --release --locked -p career-cli --target x86_64-unknown-linux-gnu
|
|
|
21
21
|
|
|
22
22
|
## Derivation
|
|
23
23
|
|
|
24
|
-
The
|
|
24
|
+
The original dependency graph was derived from a read-only Career Core export using the offline commands below. For Phase 8 commit `f6d1783`, the lockfile remains byte-identical at the pinned SHA-256 and the manifest diff adds ownership/publication metadata but no normal/build dependency; both new per-target provenance records retain the same locked Rust 1.97.1 release-build boundary.
|
|
25
25
|
|
|
26
26
|
```bash
|
|
27
27
|
cargo metadata --locked --offline \
|
|
@@ -47,8 +47,8 @@ For crates.io packages, “Source” identifies the immutable name/version regis
|
|
|
47
47
|
| `anstyle` | `1.0.14` | `MIT OR Apache-2.0` | [crates.io](https://crates.io/crates/anstyle/1.0.14) | `940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000` |
|
|
48
48
|
| `anstyle-parse` | `1.0.0` | `MIT OR Apache-2.0` | [crates.io](https://crates.io/crates/anstyle-parse/1.0.0) | `52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e` |
|
|
49
49
|
| `anstyle-query` | `1.1.5` | `MIT OR Apache-2.0` | [crates.io](https://crates.io/crates/anstyle-query/1.1.5) | `40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc` |
|
|
50
|
-
| `career-cli` | `0.1.0` | `MIT OR Apache-2.0` | [Core workspace](https://github.com/revazi/career-core/tree/
|
|
51
|
-
| `career-core` | `0.1.0` | `MIT OR Apache-2.0` | [Core workspace](https://github.com/revazi/career-core/tree/
|
|
50
|
+
| `career-cli` | `0.1.0` | `MIT OR Apache-2.0` | [Core workspace](https://github.com/revazi/career-core/tree/f6d17835de4817e28ce84e8e5734ff592687dfcc/crates/career-cli) | commit-bound |
|
|
51
|
+
| `career-core` | `0.1.0` | `MIT OR Apache-2.0` | [Core workspace](https://github.com/revazi/career-core/tree/f6d17835de4817e28ce84e8e5734ff592687dfcc) | commit-bound |
|
|
52
52
|
| `clap` | `4.6.4` | `MIT OR Apache-2.0` | [crates.io](https://crates.io/crates/clap/4.6.4) | `d91e0c145792ef73a6ad36d27c75ac09f1832222a3c209689d90f534685ee5b7` |
|
|
53
53
|
| `clap_builder` | `4.6.2` | `MIT OR Apache-2.0` | [crates.io](https://crates.io/crates/clap_builder/4.6.2) | `f09628afdcc538b57f3c6341e9c8e9970f18e4a481690a64974d7023bd33548b` |
|
|
54
54
|
| `clap_derive` | `4.6.4` | `MIT OR Apache-2.0` | [crates.io](https://crates.io/crates/clap_derive/4.6.4) | `d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061` |
|
package/docs/product-flow.md
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
# Product flow roadmap
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
The cross-repository migration plan and measured findings are recorded in [`career-run-roadmap.md`](career-run-roadmap.md). Career Core Phase 8, the first managed `career_run` implementation, and the threat-reviewed package-owned Markdown/text save workflow in [`variant-save-workflow.md`](variant-save-workflow.md) are complete. Synthetic PDF compatibility covers reviewed Chromium-generated tagged/untagged and ReportLab-generated two-page documents, embedded-font and multi-column layouts, and fail-closed text-unavailable cases. The Git-history/tree/hash-bound token-optimization study is complete: its frozen before/after evidence includes Pi Skill discovery and matching-task full-Skill context and records a 15.98% aggregate workflow reduction with no workflow regression. Full application-workspace persistence and further PDF extraction expansion remain later phases.
|
|
4
4
|
|
|
5
|
-
|
|
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,57 @@ This package preserves the three stable native tools:
|
|
|
10
12
|
|
|
11
13
|
It also registers:
|
|
12
14
|
|
|
13
|
-
- `/career-setup` for library and
|
|
14
|
-
- `/career-library` for explicitly configured Markdown
|
|
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-review` for TUI-only, bounded inspection and explicit selection of current non-PDF retained variant changes
|
|
23
|
+
- `/career-save` for user-only TUI/RPC exact preview, confirmation, and no-clobber local saving of one current Markdown/text materialization
|
|
24
|
+
- `/career-tools` to switch between the managed-only and advanced raw model-tool surfaces
|
|
18
25
|
|
|
19
|
-
|
|
26
|
+
`career_run`, the raw compatibility tools, `/career-vacancy`, `/career-match`, and `/career-analyze` invoke the compatible Career Core route selected by the external resolver on supported macOS/Linux systems. Package metadata rejects other systems, and direct local/Git extension initialization registers no command/tool and fails with `unsupported_platform` before route work or private stdin. 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. `/career-review` also invokes neither Core nor a provider: it reads one current in-memory non-PDF variant review, requires warnings/discards acknowledgment and exact per-change inspection before inclusion, then prepares a later editor message containing only the unchanged review handle and selected canonical IDs.
|
|
20
27
|
|
|
21
28
|
Binding boundaries:
|
|
22
29
|
|
|
23
|
-
- no provider/model calls
|
|
24
|
-
- agent-directory-relative non-sensitive config only
|
|
25
|
-
- no resume or vacancy text in global config
|
|
30
|
+
- 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
|
|
31
|
+
- agent-directory-relative non-sensitive config only; it may contain canonical library roots and one bounded absolute preferred variation-directory suggestion
|
|
32
|
+
- no resume or vacancy text in global config; a variation-directory preference is destination guidance, not write approval
|
|
26
33
|
- session entries only after explicit persistence consent; entries persist to JSONL even when excluded from model context
|
|
34
|
+
- 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
35
|
- original resumes only for deterministic analyze/match
|
|
28
36
|
- assisted variants remain labeled and excluded from authoritative reranking
|
|
29
37
|
- stable path/id tie-breaking; any close-cluster label is a UI heuristic, not a Core result
|
|
30
38
|
- cancellation aborts the active child and stops remaining batch work
|
|
31
|
-
-
|
|
39
|
+
- 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
|
|
40
|
+
- searchable PDF text extraction is local and isolated with fixed byte/page/time/memory/result ceilings; OCR and document rewriting remain out of scope
|
|
41
|
+
- 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
|
|
42
|
+
- 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
|
|
43
|
+
- 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
|
|
44
|
+
- `career_run variant-review` terminates its turn; the TUI selector defaults every retained change to excluded, pages exact before/after/evidence locally, then pages selected changes together as compact labeled exact records, permits direct final-stage reopening of each record, and requires a separate prepare-or-back decision
|
|
45
|
+
- review selection is process-memory-only: only the final prepare choice puts the ephemeral review handle and selected canonical IDs in the editor; pi-career appends no selection entry and performs no Core call
|
|
46
|
+
- PDF review changes remain manual guidance; `/career-review` and `career_run materialize` reject PDF review handles because extracted text cannot preserve the styled document
|
|
47
|
+
- 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
|
|
48
|
+
- 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
|
|
49
|
+
- no full-result file export; `/career-save` persists only exact approved assisted document bytes and bounded marker/sidecar metadata
|
|
50
|
+
|
|
51
|
+
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.
|
|
52
|
+
|
|
53
|
+
## Assisted handoff and later materialization
|
|
32
54
|
|
|
33
|
-
The
|
|
55
|
+
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
56
|
|
|
35
|
-
|
|
57
|
+
For a non-PDF vacancy-specific variant, the first assisted turn stops mechanically after review. In TUI, the user can run `/career-review <review-handle>` to page all warnings/discards and exact retained changes. Every change starts excluded and can be included only from its exact detail view. Continuing pages all selected exact records together with compact labels and permits direct read-only reopening of each one; a separate final choice either returns to review or prepares—but never submits—the later user message with exactly the selected Core IDs and unchanged handle. Only after the user reviews and submits that message may deterministic materialization run. The result remains assisted/non-authoritative and cannot enter authoritative analysis or matching. PDF workbenches stop after reviewed targeted changes for manual application; PDF handles are rejected by selection and materialization and never turn extracted text into a styled resume.
|
|
36
58
|
|
|
37
|
-
|
|
59
|
+
Automatic variant saving remains prohibited. Setup records or derives only a preferred destination suggestion and creates no directory or file. After a successful non-PDF materialization, the user may separately run `/career-save <variant-handle>`: it derives an eligible direct-child managed destination, shows the complete exact plan, requires unchanged preview plus separate confirmation, performs no-clobber private writes, and succeeds only after fail-closed rescanning excludes the artifact from originals. It does not add provider fallback, automatic repair/retry, original overwrite, auto-application, or authoritative reranking.
|
|
38
60
|
|
|
39
61
|
## Non-goals in this phase
|
|
40
62
|
|
|
41
|
-
- provider/model
|
|
42
|
-
-
|
|
43
|
-
- model/provider integration
|
|
63
|
+
- package-initiated provider/model clients, credentials, automatic prompt submission, or full-screen UI
|
|
64
|
+
- DOCX/OCR/URL ingestion; image-only PDFs require external OCR or export
|
|
44
65
|
- source-document or full-Core-result persistence outside the approved config/custom-entry workflow
|
|
45
66
|
- source document mutation
|
|
46
|
-
- publication, release downloads, signing, or notarization
|
|
47
|
-
-
|
|
67
|
+
- career-document publication/export, release-asset downloads, signing, or notarization
|
|
68
|
+
- package-owned native binaries or platform claims beyond pi-career's six reviewed macOS/Linux targets; the launcher's additional upstream manifest entries are contract metadata, not support
|
package/docs/releasing.md
CHANGED
|
@@ -1,79 +1,113 @@
|
|
|
1
1
|
# Release process
|
|
2
2
|
|
|
3
|
-
This document
|
|
3
|
+
This document defines the bounded trusted-publishing process for the next explicitly authorized pi-career release and records the historical `v0.1.0` and `v0.2.0` outcomes. In the instructions below, `<version>` is the exact package version without `v`, `<tag>` is `v<version>`, and `<sha>` is the full frozen candidate commit.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Release boundary
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
One coordinated release may create exactly:
|
|
8
8
|
|
|
9
|
-
1. one public `pi-career
|
|
10
|
-
2. one annotated, unsigned
|
|
11
|
-
3. one GitHub Release
|
|
9
|
+
1. one public `pi-career@<version>` npm package on `https://registry.npmjs.org/`;
|
|
10
|
+
2. one annotated, unsigned `<tag>` 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
|
|
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
|
-
|
|
15
|
+
Career Core distribution remains external. The candidate pins exact [`@revazi/career@0.2.0`](https://www.npmjs.com/package/@revazi/career/v/0.2.0); its reviewed launcher owns native target/libc, package metadata, provenance, file invariants, size, format, architecture, and SHA-256 verification. Pi-career supports only its six macOS/Linux targets and must not copy those algorithms or artifacts. Pi-career validates the exact ordered six-package v2 launcher manifest, declared file allowlist, and `career` bin before direct execution.
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
The reviewed external release is bound to Career Core commit/tag `536690632884c17336cc3c108f1bba0f254b862b`/`v0.2.0` and successful protected publication run [`31761238274`](https://github.com/revazi/career-core/actions/runs/31761238274). The launcher registry integrity is `sha512-5aksKh9S2fqPKBwlUY94XgCHjggr2Gep45zEWOMBNEfRtXvC/pYnlkI9CYrVHBFR8/gfGQog4pwV854FMzDxww==`; registry metadata reports SLSA v1 provenance for the user-facing launcher and all six lockstep launcher-owned native packages.
|
|
18
18
|
|
|
19
|
-
|
|
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
|
-
|
|
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
|
-
|
|
23
|
+
## Historical `v0.1.0` outcome
|
|
24
24
|
|
|
25
|
-
|
|
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.
|
|
25
|
+
Release execution completed on 2026-08-06:
|
|
30
26
|
|
|
31
|
-
|
|
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
|
|
32
33
|
|
|
33
|
-
[`native-dependency-inventory.md`](native-dependency-inventory.md)
|
|
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 a future package.
|
|
34
35
|
|
|
35
|
-
|
|
36
|
+
## Historical `v0.2.0` outcome
|
|
36
37
|
|
|
37
|
-
|
|
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.
|
|
38
|
+
Release execution completed on 2026-08-10:
|
|
41
39
|
|
|
42
|
-
|
|
40
|
+
- npm: [`pi-career@0.2.0`](https://www.npmjs.com/package/pi-career/v/0.2.0)
|
|
41
|
+
- published commit: `6db58644a6140202de2f2d661a740acd298c79b5`
|
|
42
|
+
- annotated unsigned tag and GitHub Release: [`v0.2.0`](https://github.com/revazi/pi-career/releases/tag/v0.2.0)
|
|
43
|
+
- npm integrity: `sha512-2V0z42oxsDHdE9a/UTskCzLY3inU0/DX30h2QhXse/Y3rAJpsaaNweqVhvZwZlMUovtyBu7pnGSpSo8CLhVOBg==`
|
|
44
|
+
- npm shasum: `c182b09945eee8cd85d817b7ce4965784731fd49`
|
|
45
|
+
- same-SHA six-target compatibility run: [`31352965430`](https://github.com/revazi/pi-career/actions/runs/31352965430)
|
|
46
|
+
- OIDC publication run: [`31353182855`](https://github.com/revazi/pi-career/actions/runs/31353182855)
|
|
47
|
+
- npm publisher identity: GitHub Actions trusted publisher for `revazi/pi-career`, workflow `release.yml`, environment `npm`
|
|
48
|
+
- SLSA provenance subject and resolved Git dependency: exact `pi-career@0.2.0` tarball and commit above
|
|
49
|
+
- custom GitHub Release assets: none
|
|
43
50
|
|
|
44
|
-
|
|
51
|
+
The first tag-triggered attempt, run [`31352716654`](https://github.com/revazi/pi-career/actions/runs/31352716654), failed before dependency installation or publication because `shell: node {0}` resolved a relative ESM import from GitHub's temporary script directory. Registry absence was reconfirmed; no publish retry occurred. PR [#23](https://github.com/revazi/pi-career/pull/23) moved the hosted-gate query into a checked-in script. After explicit incident authorization, the unpublished tag was replaced once on the corrected candidate.
|
|
45
52
|
|
|
46
|
-
|
|
53
|
+
In run `31353182855`, every gate and the OIDC `npm publish` step succeeded. The run then failed closed before GitHub Release creation because npm's attestation endpoint propagated after the original one-minute bound and the resulting SLSA bundle used the current Sigstore v0.3 media type while npm's publish attestation remained v0.2. The version already existed authoritatively, so it was never rerun or republished. PR [#24](https://github.com/revazi/pi-career/pull/24) extended bounded propagation polling and validates both exact bundle formats. The corrected verifier subsequently proved registry metadata, tarball bytes, trusted-publisher identity, provenance workflow/tag/SHA, and latest dist-tag; exact published Pi install/load/runtime/offline/remove acceptance passed before the GitHub Release and deployment status were finalized.
|
|
47
54
|
|
|
48
|
-
|
|
55
|
+
**Never rerun or republish after an ambiguous publish response.** Query authoritative registry state first. A post-publication recovery may finish verification and release-channel bookkeeping only; it must not create an alternate publication path, overwrite an immutable npm version, or move the published tag.
|
|
49
56
|
|
|
50
|
-
|
|
51
|
-
|---:|---|---|
|
|
52
|
-
| `8910079991` | `darwin-arm64` | `2026-08-07T21:43:37Z` |
|
|
53
|
-
| `8910084163` | `linux-x64-gnu` | `2026-08-07T21:43:47Z` |
|
|
57
|
+
## Release gates
|
|
54
58
|
|
|
55
|
-
|
|
59
|
+
A skipped, unknown, stale, or merely planned result is not a pass.
|
|
56
60
|
|
|
57
|
-
|
|
61
|
+
### 1. Freeze and review the exact candidate
|
|
62
|
+
|
|
63
|
+
- Start from synchronized public `main` and identify one full candidate SHA.
|
|
64
|
+
- Require a clean Git tree and no divergence from `origin/main`.
|
|
65
|
+
- Confirm `package.json`, the root package-lock entries, the Skill metadata, package assertions, changelog, README, and release documentation all identify the candidate version where appropriate.
|
|
66
|
+
- Keep Career Core and `@revazi/career` compatibility coordinates at exact `0.2.0` unless a separate compatibility/provenance review explicitly updates them; do not confuse the adapter release version with the external runtime version.
|
|
67
|
+
- Confirm `package.json` is explicitly public only at `https://registry.npmjs.org/`, has `os` exactly `['darwin', 'linux']`, has exactly four wildcard Pi peers, declares no production/optional/bundled dependency tree, and has no lifecycle/publication script.
|
|
68
|
+
- Ensure the candidate contains no real resume, vacancy, credentials, Pi session, provider output, generated local path, npm token, or unreviewed executable.
|
|
69
|
+
- Review the complete diff from the prior release tag, including authoritative `src/`, generated `dist/index.js`/`dist/pdf-worker.js`, `career_run`, all three exact raw tools, slash commands, external resolver, Skill, release automation, and package documentation.
|
|
70
|
+
- Do not move the candidate after local/hosted evidence is recorded. Any content change creates a new candidate and requires the gates again.
|
|
58
71
|
|
|
59
|
-
###
|
|
72
|
+
### 2. Review the external runtime boundary
|
|
60
73
|
|
|
61
|
-
|
|
74
|
+
- Confirm unsupported local/Git extension initialization registers no command/tool and fails with stable payload-free `unsupported_platform` before explicit/PATH lookup, package validation, acquisition, compatibility probing, or private stdin; retain invocation/resolver guards as defense in depth.
|
|
75
|
+
- Confirm the only acquisition coordinate remains exact `@revazi/career@0.2.0` from the canonical npm registry.
|
|
76
|
+
- Confirm runtime order remains: absolute `CAREER_CLI_PATH`, PATH `career`, package-local exact launcher, then bounded exact-package acquisition unless `PI_OFFLINE=1`.
|
|
77
|
+
- Confirm every caller-controlled route must pass the exact managed Core 0.2.0 operation catalog and required self-contained schema bundles before private stdin opens.
|
|
78
|
+
- Confirm package-local/acquired routes validate the exact ordered six-package v2 launcher manifest and delegate native target/libc/provenance/mode/size/format/architecture/SHA-256 verification to the reviewed launcher on the six supported targets.
|
|
79
|
+
- Confirm the external release's launcher plus six native packages remain version-lockstep, have canonical registry integrity and SLSA v1 provenance, and are bound to reviewed Core commit `536690632884c17336cc3c108f1bba0f254b862b`.
|
|
80
|
+
- Run the exact-package integration test on the six hosted macOS/GNU Linux/musl Linux release targets. Updating the external package coordinate, supported native target list, launcher schema, or managed Core contract requires separate compatibility, provenance, audit, and package review before this gate can pass.
|
|
62
81
|
|
|
63
|
-
|
|
82
|
+
### 3. Require clean audits and strict package proof
|
|
64
83
|
|
|
65
|
-
|
|
84
|
+
`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.
|
|
66
85
|
|
|
67
|
-
|
|
86
|
+
`npm run check:publish` must prove:
|
|
87
|
+
|
|
88
|
+
- both strict audits are clean;
|
|
89
|
+
- trusted npm is derived from the real Node installation and conflicting `npm_execpath` is rejected;
|
|
90
|
+
- npm environment overrides and duplicate decoded JSON keys cannot weaken checks;
|
|
91
|
+
- package listing/extraction uses verified absolute `/usr/bin/tar`;
|
|
92
|
+
- the tarball matches the exact allowlist and size bounds and declares `os: ['darwin', 'linux']`;
|
|
93
|
+
- no native runtime, `node_modules`, Pi peer contents, production dependency tree, or lifecycle/publication script is present;
|
|
94
|
+
- extracted package loading, stable offline failure, and isolated Pi install/list/remove behavior pass.
|
|
95
|
+
|
|
96
|
+
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.
|
|
97
|
+
|
|
98
|
+
### 4. Run complete verification on the frozen SHA
|
|
68
99
|
|
|
69
100
|
Run with Node.js 22.19 or newer:
|
|
70
101
|
|
|
71
102
|
```bash
|
|
72
103
|
npm ci
|
|
73
104
|
npm run build
|
|
74
|
-
git diff --exit-code -- dist/index.js
|
|
105
|
+
git diff --exit-code -- dist/index.js dist/pdf-worker.js
|
|
106
|
+
npm run bench:tokens
|
|
107
|
+
npm run bench:tokens:compare
|
|
75
108
|
npm run check
|
|
76
|
-
npm run test:
|
|
109
|
+
npm run test:runtime-resolution
|
|
110
|
+
npm run test:career-package
|
|
77
111
|
npm run audit:production
|
|
78
112
|
npm run audit:full
|
|
79
113
|
npm run check:publish
|
|
@@ -86,37 +120,73 @@ git diff --check
|
|
|
86
120
|
|
|
87
121
|
Requirements:
|
|
88
122
|
|
|
89
|
-
- `npm run build`
|
|
90
|
-
-
|
|
91
|
-
-
|
|
92
|
-
-
|
|
93
|
-
- The
|
|
123
|
+
- The immediate dist diff after `npm run build` must pass; a later reproducibility test alone does not prove the candidate committed the generated output.
|
|
124
|
+
- Token measurements must satisfy the active before/optimizing/after manifest: immutable Git-history snapshot/manifest bytes and source/Skill tree anchors, exact frozen before/after comparability and deltas, unchanged current shape/invariants/budgets, and no current workflow regression relative to the frozen after snapshot. Later current source need not equal the historical after tree.
|
|
125
|
+
- Exact-package acquisition must execute managed discovery plus representative synthetic resume/job operations.
|
|
126
|
+
- Compatibility must run against an explicitly reviewed fixture checkout. A skip is not release evidence.
|
|
127
|
+
- The production npm tree must remain empty apart from unmet external peers expected in the Pi host.
|
|
128
|
+
- No command may create a repository tarball, native runtime, payload/result file, audit-acceptance baseline, or publication side effect. Reviewed synthetic token snapshots are benchmark evidence, not vulnerability acceptance.
|
|
129
|
+
|
|
130
|
+
### 5. Require hosted checks on the same SHA
|
|
131
|
+
|
|
132
|
+
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.
|
|
133
|
+
|
|
134
|
+
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:
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
gh workflow run external-career.yml --ref main
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
- `External Career package (darwin-arm64)`;
|
|
141
|
+
- `External Career package (darwin-x64)`;
|
|
142
|
+
- `External Career package (linux-x64-gnu)`;
|
|
143
|
+
- `External Career package (linux-arm64-gnu)`;
|
|
144
|
+
- `External Career package (linux-x64-musl)`;
|
|
145
|
+
- `External Career package (linux-arm64-musl)`.
|
|
146
|
+
|
|
147
|
+
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.
|
|
148
|
+
|
|
149
|
+
### 6. Finalize release-facing text
|
|
94
150
|
|
|
95
|
-
|
|
151
|
+
Before release authorization:
|
|
96
152
|
|
|
97
|
-
|
|
153
|
+
- convert `CHANGELOG.md` candidate notes to a dated candidate-version entry;
|
|
154
|
+
- ensure README installation uses the exact candidate `npm:pi-career@<version>` coordinate and clearly distinguishes historical releases;
|
|
155
|
+
- state that pi-career packages no native runtime, supports only the six reviewed macOS/Linux targets, uses exact external `@revazi/career@0.2.0`, and validates its exact ordered six-package v2 manifest;
|
|
156
|
+
- state that both production and complete development/host-Pi audits are clean at the explicit low threshold;
|
|
157
|
+
- 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
158
|
|
|
99
|
-
|
|
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.
|
|
159
|
+
The finalization commit cannot contain its own SHA. Only the separately authorized final clean commit may be published and receive `<tag>`.
|
|
103
160
|
|
|
104
|
-
|
|
161
|
+
## Manual pre-publication checks
|
|
105
162
|
|
|
106
|
-
|
|
163
|
+
Run these only on the frozen clean candidate:
|
|
107
164
|
|
|
108
|
-
|
|
165
|
+
1. Confirm npm package `pi-career` has exactly the GitHub Actions trusted publisher `revazi/pi-career`, workflow `release.yml`, environment `npm`.
|
|
166
|
+
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.
|
|
167
|
+
3. Confirm `npm view pi-career@<version> version --json` reports no existing version. npm versions are immutable.
|
|
168
|
+
4. Run trusted `npm pack --dry-run --json --ignore-scripts` or rely on the stricter recorded `check:publish` artifact proof.
|
|
169
|
+
5. Record the candidate full SHA, package filename/size, clean audit results, hosted run URLs, and reviewed fixture SHA outside private content.
|
|
170
|
+
6. Obtain explicit release authorization. Do not infer authorization from readiness work.
|
|
109
171
|
|
|
110
|
-
|
|
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:
|
|
172
|
+
## Authorized release execution
|
|
114
173
|
|
|
115
|
-
|
|
116
|
-
npm publish --access public --tag latest --ignore-scripts
|
|
117
|
-
```
|
|
174
|
+
Only after every gate passes and the maintainer explicitly authorizes release execution:
|
|
118
175
|
|
|
119
|
-
|
|
120
|
-
|
|
176
|
+
1. Reconfirm the clean SHA, branch protection checks, trusted-publisher/environment configuration, canonical registry, and absence of `pi-career@<version>`.
|
|
177
|
+
2. Create one annotated unsigned `<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.
|
|
178
|
+
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.
|
|
179
|
+
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.
|
|
180
|
+
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.
|
|
181
|
+
6. The workflow must create the GitHub Release from the existing `<tag>` with:
|
|
182
|
+
- full commit SHA;
|
|
183
|
+
- npm integrity and shasum;
|
|
184
|
+
- exact external `@revazi/career@0.2.0` coordinate;
|
|
185
|
+
- all six supported macOS, GNU Linux, and musl Linux targets, plus a clear note that only the launcher is a pi-career installation surface;
|
|
186
|
+
- native-free pi-career package statement;
|
|
187
|
+
- clean production/full audit statement;
|
|
188
|
+
- no crate publication, signing/notarization claim, or custom release asset.
|
|
189
|
+
7. In an isolated Pi agent directory, install exact `npm:pi-career@<version>`, list/load it, exercise exact-package runtime acquisition with synthetic operations on a supported target, test offline failure, and remove it.
|
|
190
|
+
8. Recheck the npm dist-tag, Git tag target, GitHub Release target, provenance, and main CI after all channels settle.
|
|
121
191
|
|
|
122
|
-
Do not sign, attach assets, change repository
|
|
192
|
+
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 the immutable published version.
|