pi-career 0.1.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/docs/design.md ADDED
@@ -0,0 +1,78 @@
1
+ # Self-contained package design and threat model
2
+
3
+ ## Scope and authority
4
+
5
+ `pi-career` is a self-contained Pi package in a publicly readable Git repository on two reviewed native targets. It owns the Pi extension, package-owned native runtime artifacts and resolver, Pi-facing Agent Skill, package/build tests, and installation guidance. Career Core remains authoritative for operations, schemas, algorithms, errors, evidence, warnings, uncertainty, ordering, and assisted/non-authoritative semantics; this repository does not reimplement those contracts in TypeScript.
6
+
7
+ The stable Pi surface is exactly:
8
+
9
+ - `career_core_discover`
10
+ - `career_core_resume`
11
+ - `career_core_job`
12
+
13
+ The TypeScript source is authoritative. A checked-in deterministic `dist/index.js` supports clean local, pinned-Git, and npm Pi loading without development dependencies. Pi-provided imports remain external peers. Reviewed native artifacts are tracked directly in every package channel so installation needs no lifecycle script, Cargo, Rust, system `career` executable, or post-install runtime download. Package metadata permits only reviewed public publication of the unscoped `pi-career` package to the canonical npm registry.
14
+
15
+ The deterministic workflow layer additionally registers `/career-setup`, `/career-library`, `/career-vacancy`, `/career-match`, and `/career-analyze`. These commands call the shared `invokeCareerCli` helper directly; they never route through an LLM-facing tool, provider, model, network, PATH, Cargo, sibling checkout, or downloaded runtime. See [`product-flow.md`](product-flow.md) for the phase boundary.
16
+
17
+ ## Runtime provenance and selection
18
+
19
+ [`../runtime/manifest.json`](../runtime/manifest.json) pins unsigned artifacts from Career Core commit `a3cdb4c6d7f966397e93ea4664071975bca7228c` and native artifact run [30953471793](https://github.com/revazi/career-core/actions/runs/30953471793). It records exact binary/provenance paths, target triples, sizes, modes, SHA-256 values, source archive identities, shared notices, and bounded capabilities/schema/representative-operation digests. Imported per-target provenance remains package-bounded.
20
+
21
+ Resolution order is fixed:
22
+
23
+ 1. A bounded absolute `CAREER_CLI_PATH`, when explicitly set for reviewed development/recovery use.
24
+ 2. The verified package-owned binary for the current supported target.
25
+ 3. Otherwise a stable payload-free failure.
26
+
27
+ There is no PATH, Cargo, sibling-checkout, download, npm platform-package, or install-script fallback.
28
+
29
+ Supported targets are exactly:
30
+
31
+ - `darwin-arm64` (`aarch64-apple-darwin`)
32
+ - `linux-x64-gnu` (`x86_64-unknown-linux-gnu`, only when Node reports glibc)
33
+
34
+ Windows, macOS x64, Linux arm64, Linux musl, and unknown libc/platform combinations fail closed as `unsupported_platform`.
35
+
36
+ Before the first bundled spawn per process, the resolver rejects symlinks/non-files, requires exact `0755` mode and size, reads the bounded binary, and verifies SHA-256. Only successful verification is cached in memory. Selection/integrity errors expose no platform details, paths, hashes, environment values, or raw filesystem failures.
37
+
38
+ ## Process boundary
39
+
40
+ The adapter calls `spawn(executable, argv, { shell: false })`; operations and schema IDs are bounded before spawn. Document JSON is one bounded object string sent only through child stdin with `--input - --format json-compact`.
41
+
42
+ The process adapter creates no payload/result temporary files and adds no network, model, provider, telemetry, repair, retry, or URL-fetching behavior. The workflow layer may read configured `.md`/`.txt` roots, atomically persist non-content global config, and append consented custom session entries, but it does not change the child-process boundary. A successful child must emit exactly one UTF-8 JSON object, no stderr, and a complete result within capture and Pi-context ceilings. Authoritative output is never truncated. Oversized results fail without partial output; pi-career has no full-result export.
43
+
44
+ ## Threat model
45
+
46
+ | Threat | Mitigation |
47
+ |---|---|
48
+ | Shell or argument injection | Fixed allowlisted operation mappings, bounded schema-ID syntax, direct argv-only spawn, `shell: false`, document bytes on stdin only. |
49
+ | Executable substitution | Override is explicit, absolute, and bounded. Default runtime path is package-fixed; no PATH/sibling/Cargo fallback exists. |
50
+ | Bundled artifact corruption or target swap | Exact runtime allowlist, regular-file and executable-mode checks, target binary magic, manifest/provenance/source-run lock, size and SHA-256 verification before first spawn. |
51
+ | Unsupported platform/libc guessed as compatible | Exact platform/arch selection and positive glibc detection; every other combination fails `unsupported_platform`. |
52
+ | Oversized request, stream, diagnostic, or context | UTF-8 byte bounds before spawn, independent stdout/stderr ceilings, fixed timeout, 50,000-byte/2,000-line complete-result limits, fail closed without truncation. |
53
+ | Hung or cancelled child | Abort propagation and fixed timeout send `SIGTERM`, then `SIGKILL` after a bounded grace period; settlement waits for close. |
54
+ | Malformed, ambiguous, or multiple output documents | Fatal UTF-8 decoding and exact-one-object JSON validation. |
55
+ | Private payload disclosure in failures | Raw stderr, process/filesystem errors, input/output, paths, hashes, platform details, and environment values never cross adapter errors or logs. Only strictly shaped, bounded, allowlisted `career.error.v1` values may be nested. |
56
+ | Workflow persistence leaks or races | Global config contains canonical roots/labels only, uses a `0700` directory and atomic `0600` file, and never stores source text or Core output. Session state uses branch-aware custom entries excluded from LLM context; full Core JSON is never stored. |
57
+ | Pi session persistence mistaken for adapter persistence | Persisted workflow sessions require the exact local-persistence decision before private vacancy or card entries. Transient sessions receive a notice. This is not secure erasure and local-session approval is not provider consent. |
58
+ | Adapter changes Core authority | Successful JSON is returned complete and unchanged apart from removing one framing newline. Discovery-first skill guidance preserves evidence, warnings, uncertainty, baseline boundaries, and assisted labels. |
59
+ | Hidden external behavior | Workflow and runtime sources contain no fetch, provider, credential, telemetry, MCP, or model invocation. Commands invoke only the package-owned deterministic process helper. No-model/offline smokes enforce the surface. |
60
+ | Supply-chain or packaging drift | Exact Core source/run provenance, lockfile-pinned development tools, npm derived from the real Node installation instead of `PATH`, inherited `npm_execpath` verification, npm tree/severity environment sanitization, duplicate-key-rejecting bounded JSON, verified absolute system tar, four wildcard external peers, tracked deterministic bundle, runtime/package allowlists and limits, zero low-threshold production and full audits, native CI execution on each claimed target, and extracted isolated install acceptance. |
61
+
62
+ ## Build, package, and CI boundary
63
+
64
+ `npm run build` rebuilds only `dist/index.js`; native artifacts are never built or downloaded implicitly. Runtime refresh requires a separate approved native artifact workflow and manifest review.
65
+
66
+ Package checks allow only reviewed docs, extension/skill files, and the eight runtime files. They invoke npm through `process.execPath` plus its derived absolute CLI and invoke verified root-owned `/usr/bin/tar`, never a PATH-selected npm/tar. They enforce the exact public npm registry/access metadata, compressed/unpacked bounds, modes, hashes, provenance, no packaged `node_modules` or Pi package contents, no package-owned runtime npm dependencies, exactly four wildcard external peers, and no lifecycle or publication scripts. The extracted package must load, execute the current target with `CAREER_CLI_PATH` unset and an empty `PATH`, and pass an isolated Pi install/list/remove smoke.
67
+
68
+ Hosted CI uses native Ubuntu x64 GNU and macOS arm64 runners. Both run the tracked-dist stale gate, process/runtime/audit tests, complete artifact/package checks, real bundled discovery and representative resume/job operations, no-model load, isolated install, strict low-threshold `audit:production`, and the authoritative readiness-only `check:publish`. The latter is a direct Node orchestrator rather than nested npm scripts and requires clean production and full development/host-Pi audits. Both remove omit/include/audit-level/`NODE_ENV` overrides and strictly reject duplicate decoded JSON keys; no audit-acceptance baseline is allowed. Hosted tests require no separate Core checkout or provider credential.
69
+
70
+ ## Installation boundary
71
+
72
+ A normal supported-target user registers a reviewed clean absolute local path, the public Git URL pinned to a full reviewed commit, or `npm:pi-career` pinned to an exact reviewed version. Pi local paths follow changing files; pinned Git refs and npm versions require an explicit new coordinate. Removal only unregisters the package and does not erase Pi sessions, shell history, backups, or separately saved results.
73
+
74
+ `CAREER_CLI_PATH` is not an onboarding requirement. A caller choosing it assumes review/compatibility responsibility for that executable; the same argv/stdin, bounds, cancellation, and error boundary still applies.
75
+
76
+ ## Provenance
77
+
78
+ The initial process adapter, tool mappings, synthetic fake executable, process tests, and skill guidance were adapted from Career Core commit `100774ed8bb3b39c019d64ce105af1e3f209144f`. Bundled runtime artifacts and their metadata were imported from exact Core commit `a3cdb4c6d7f966397e93ea4664071975bca7228c` via the reviewed native artifact run. This repository preserves the applicable `MIT OR Apache-2.0` terms and package-bounded notices in `NOTICE` and `runtime/`.
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 Andrew Gallant
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,19 @@
1
+ Copyright (c) Individual contributors
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.
@@ -0,0 +1,23 @@
1
+ Permission is hereby granted, free of charge, to any
2
+ person obtaining a copy of this software and associated
3
+ documentation files (the "Software"), to deal in the
4
+ Software without restriction, including without
5
+ limitation the rights to use, copy, modify, merge,
6
+ publish, distribute, sublicense, and/or sell copies of
7
+ the Software, and to permit persons to whom the Software
8
+ is furnished to do so, subject to the following
9
+ conditions:
10
+
11
+ The above copyright notice and this permission notice
12
+ shall be included in all copies or substantial portions
13
+ of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
16
+ ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
17
+ TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
18
+ PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
19
+ SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
20
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
22
+ IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23
+ DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,25 @@
1
+ Copyright (c) 2015 The Rust Project Developers
2
+
3
+ Permission is hereby granted, free of charge, to any
4
+ person obtaining a copy of this software and associated
5
+ documentation files (the "Software"), to deal in the
6
+ Software without restriction, including without
7
+ limitation the rights to use, copy, modify, merge,
8
+ publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software
10
+ is furnished to do so, subject to the following
11
+ conditions:
12
+
13
+ The above copyright notice and this permission notice
14
+ shall be included in all copies or substantial portions
15
+ of the Software.
16
+
17
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
18
+ ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
19
+ TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
20
+ PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
21
+ SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
22
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
24
+ IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25
+ DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,25 @@
1
+ Copyright (c) 2014 The Rust Project Developers
2
+
3
+ Permission is hereby granted, free of charge, to any
4
+ person obtaining a copy of this software and associated
5
+ documentation files (the "Software"), to deal in the
6
+ Software without restriction, including without
7
+ limitation the rights to use, copy, modify, merge,
8
+ publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software
10
+ is furnished to do so, subject to the following
11
+ conditions:
12
+
13
+ The above copyright notice and this permission notice
14
+ shall be included in all copies or substantial portions
15
+ of the Software.
16
+
17
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
18
+ ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
19
+ TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
20
+ PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
21
+ SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
22
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
24
+ IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25
+ DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,23 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 Danny Guo
4
+ Copyright (c) 2016 Titus Wormer <tituswormer@gmail.com>
5
+ Copyright (c) 2018 Akash Kurdekar
6
+
7
+ Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ of this software and associated documentation files (the "Software"), to deal
9
+ in the Software without restriction, including without limitation the rights
10
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ copies of the Software, and to permit persons to whom the Software is
12
+ furnished to do so, subject to the following conditions:
13
+
14
+ The above copyright notice and this permission notice shall be included in all
15
+ copies or substantial portions of the Software.
16
+
17
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
+ SOFTWARE.
@@ -0,0 +1,25 @@
1
+ Copyright (c) 2016 Joe Wilm
2
+
3
+ Permission is hereby granted, free of charge, to any
4
+ person obtaining a copy of this software and associated
5
+ documentation files (the "Software"), to deal in the
6
+ Software without restriction, including without
7
+ limitation the rights to use, copy, modify, merge,
8
+ publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software
10
+ is furnished to do so, subject to the following
11
+ conditions:
12
+
13
+ The above copyright notice and this permission notice
14
+ shall be included in all copies or substantial portions
15
+ of the Software.
16
+
17
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
18
+ ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
19
+ TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
20
+ PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
21
+ SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
22
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
24
+ IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25
+ DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,34 @@
1
+ Short version for non-lawyers:
2
+
3
+ The Rust Project is dual-licensed under Apache 2.0 and MIT
4
+ terms.
5
+
6
+ It is Copyright (c) The Rust Project Contributors.
7
+
8
+ Longer version:
9
+
10
+ Copyrights in the Rust project are retained by their contributors. No
11
+ copyright assignment is required to contribute to the Rust project.
12
+
13
+ Some files include explicit copyright notices and/or license notices.
14
+ For full authorship information, see the version control history or
15
+ <https://thanks.rust-lang.org>
16
+
17
+ Except as otherwise noted, Rust is licensed under the Apache License, Version
18
+ 2.0 <LICENSE-APACHE> or <http://www.apache.org/licenses/LICENSE-2.0> or the MIT
19
+ license <LICENSE-MIT> or <http://opensource.org/licenses/MIT>, at your option.
20
+
21
+ We track licenses for third-party materials in two ways:
22
+
23
+ * We use [REUSE](https://reuse.software) to track license information for
24
+ in-tree source files - both those authored by the Rust project and those
25
+ authored by third parties. See `REUSE.toml`, and our cached output of the
26
+ `reuse` tool which is committed to `license-metadata.json`.
27
+ * We use `cargo` to track license information for out-of-tree dependencies.
28
+
29
+ These two sources of information are collected by the tool `generate-copyright`
30
+ into a file called `COPYRIGHT.html`, which is shipped with each binary release
31
+ of Rust. Please refer to that file for detailed information as to the components of
32
+ any given Rust release. We also produce a `COPYRIGHT-library.html` file which only
33
+ covers the subset of source code used in the Rust Standard Library, as opposed
34
+ to the toolchain as a whole.
@@ -0,0 +1,25 @@
1
+ Copyright (c) The Rust Project Contributors
2
+
3
+ Permission is hereby granted, free of charge, to any
4
+ person obtaining a copy of this software and associated
5
+ documentation files (the "Software"), to deal in the
6
+ Software without restriction, including without
7
+ limitation the rights to use, copy, modify, merge,
8
+ publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software
10
+ is furnished to do so, subject to the following
11
+ conditions:
12
+
13
+ The above copyright notice and this permission notice
14
+ shall be included in all copies or substantial portions
15
+ of the Software.
16
+
17
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
18
+ ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
19
+ TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
20
+ PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
21
+ SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
22
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
24
+ IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25
+ DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,16 @@
1
+ # Rust 1.97.1 standard-library notice
2
+
3
+ The bundled `career` executables were built with `rustc 1.97.1 (8bab26f4f 2026-07-14)`, source commit [`8bab26f4f68e0e26f0bb7960be334d5b520ea452`](https://github.com/rust-lang/rust/commit/8bab26f4f68e0e26f0bb7960be334d5b520ea452).
4
+
5
+ The Rust Standard Library is used under its MIT alternative. Preserve [`Rust-1.97.1-COPYRIGHT.txt`](Rust-1.97.1-COPYRIGHT.txt) and [`Rust-1.97.1-LICENSE-MIT.txt`](Rust-1.97.1-LICENSE-MIT.txt) with copies of either native executable.
6
+
7
+ The target-reachable standard-library source includes these upstream notices:
8
+
9
+ - Copyright The Rust Project Developers; `MIT OR Apache-2.0` (MIT selected here).
10
+ - `library/backtrace`: Copyright 2014 Alex Crichton and The Rust Project Developers; `MIT OR Apache-2.0` (MIT selected here).
11
+ - `library/std/src/sync/mpmc`: Copyright 2019 The Crossbeam Project Developers and The Rust Project Developers; `MIT OR Apache-2.0` (MIT selected here).
12
+ - `library/core/src/unicode/unicode_data.rs`: Copyright 1991-2024 Unicode, Inc.; `Unicode-3.0`. Preserve [`Unicode-3.0.txt`](Unicode-3.0.txt).
13
+
14
+ `library/std/src/sys/sync/mutex/fuchsia.rs` is not compiled for either `aarch64-apple-darwin` or `x86_64-unknown-linux-gnu`; its Fuchsia-specific BSD-2-Clause term is therefore outside both distributed target binaries.
15
+
16
+ This notice records package-bounded license evidence, not legal advice or a claim about files supplied by the host operating system.
@@ -0,0 +1,39 @@
1
+ UNICODE LICENSE V3
2
+
3
+ COPYRIGHT AND PERMISSION NOTICE
4
+
5
+ Copyright © 1991-2023 Unicode, Inc.
6
+
7
+ NOTICE TO USER: Carefully read the following legal agreement. BY
8
+ DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR
9
+ SOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE
10
+ TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT
11
+ DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE.
12
+
13
+ Permission is hereby granted, free of charge, to any person obtaining a
14
+ copy of data files and any associated documentation (the "Data Files") or
15
+ software and any associated documentation (the "Software") to deal in the
16
+ Data Files or Software without restriction, including without limitation
17
+ the rights to use, copy, modify, merge, publish, distribute, and/or sell
18
+ copies of the Data Files or Software, and to permit persons to whom the
19
+ Data Files or Software are furnished to do so, provided that either (a)
20
+ this copyright and permission notice appear with all copies of the Data
21
+ Files or Software, or (b) this copyright and permission notice appear in
22
+ associated Documentation.
23
+
24
+ THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
25
+ KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
27
+ THIRD PARTY RIGHTS.
28
+
29
+ IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE
30
+ BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES,
31
+ OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
32
+ WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
33
+ ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA
34
+ FILES OR SOFTWARE.
35
+
36
+ Except as contained in this notice, the name of a copyright holder shall
37
+ not be used in advertising or otherwise to promote the sale, use or other
38
+ dealings in these Data Files or Software without prior written
39
+ authorization of the copyright holder.
@@ -0,0 +1,116 @@
1
+ # Native `career-cli` dependency inventory
2
+
3
+ ## Status and scope
4
+
5
+ This is reproducible dependency evidence for the two native `career` binaries tracked by pi-career. It is **not legal advice**, a legal-compliance conclusion, an SPDX/CycloneDX SBOM, or release approval. A human license review remains mandatory under [`releasing.md`](releasing.md).
6
+
7
+ The inventory is pinned to:
8
+
9
+ - Career Core commit [`a3cdb4c6d7f966397e93ea4664071975bca7228c`](https://github.com/revazi/career-core/tree/a3cdb4c6d7f966397e93ea4664071975bca7228c)
10
+ - Cargo.lock SHA-256 `18d188cfea79128d4024dabe2e21f57e5d2098d32ffac8c4ef01243f49abb609`
11
+ - package `career-cli 0.1.0`
12
+ - build edges `normal,build`, excluding development dependencies
13
+ - targets `aarch64-apple-darwin` and `x86_64-unknown-linux-gnu`
14
+
15
+ The per-target provenance records show the corresponding locked release builds:
16
+
17
+ ```text
18
+ cargo build --release --locked -p career-cli --target aarch64-apple-darwin
19
+ cargo build --release --locked -p career-cli --target x86_64-unknown-linux-gnu
20
+ ```
21
+
22
+ ## Derivation
23
+
24
+ The Career Core checkout was treated as read-only. The exact commit was exported to a temporary directory outside both repositories; the temporary export was removed after these offline commands:
25
+
26
+ ```bash
27
+ cargo metadata --locked --offline \
28
+ --filter-platform <target> --format-version 1
29
+ cargo tree --locked --offline -p career-cli \
30
+ --target <target> --edges normal,build
31
+ ```
32
+
33
+ Starting at the `career-cli` resolve node, only normal and build dependency edges were traversed. Package versions, manifest license expressions, registry sources, and checksums came from Cargo metadata and that commit's `Cargo.lock`.
34
+
35
+ Both targets resolve the same 30-package set. Cargo metadata reports no `kind = "build"` dependency edge in either graph. `clap_derive` and `serde_derive` are included because they are proc-macro packages reached through normal dependency edges and compiled for the build host. The table excludes all development dependencies and the unrelated `career-swift`/UniFFI workspace graph.
36
+
37
+ The Cargo graph does not enumerate the statically linked Rust Standard Library or host-supplied dynamic libraries. Those are inventoried separately below from the exact provenance `rustc` version, Rust 1.97.1 source license metadata, `otool -L runtime/darwin-arm64/career`, and `objdump -p runtime/linux-x64-gnu/career`.
38
+
39
+ ## Exact reachable package set for both targets
40
+
41
+ For crates.io packages, “Source” identifies the immutable name/version registry coordinate and “Lock checksum” is the package checksum recorded in the pinned `Cargo.lock`. Workspace crates are bound by the Core commit instead.
42
+
43
+ | Package | Version | Cargo license expression | Source | Lock checksum |
44
+ |---|---:|---|---|---|
45
+ | `aho-corasick` | `1.1.4` | `Unlicense OR MIT` | [crates.io](https://crates.io/crates/aho-corasick/1.1.4) | `ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301` |
46
+ | `anstream` | `1.0.0` | `MIT OR Apache-2.0` | [crates.io](https://crates.io/crates/anstream/1.0.0) | `824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d` |
47
+ | `anstyle` | `1.0.14` | `MIT OR Apache-2.0` | [crates.io](https://crates.io/crates/anstyle/1.0.14) | `940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000` |
48
+ | `anstyle-parse` | `1.0.0` | `MIT OR Apache-2.0` | [crates.io](https://crates.io/crates/anstyle-parse/1.0.0) | `52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e` |
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/a3cdb4c6d7f966397e93ea4664071975bca7228c/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/a3cdb4c6d7f966397e93ea4664071975bca7228c) | commit-bound |
52
+ | `clap` | `4.6.4` | `MIT OR Apache-2.0` | [crates.io](https://crates.io/crates/clap/4.6.4) | `d91e0c145792ef73a6ad36d27c75ac09f1832222a3c209689d90f534685ee5b7` |
53
+ | `clap_builder` | `4.6.2` | `MIT OR Apache-2.0` | [crates.io](https://crates.io/crates/clap_builder/4.6.2) | `f09628afdcc538b57f3c6341e9c8e9970f18e4a481690a64974d7023bd33548b` |
54
+ | `clap_derive` | `4.6.4` | `MIT OR Apache-2.0` | [crates.io](https://crates.io/crates/clap_derive/4.6.4) | `d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061` |
55
+ | `clap_lex` | `1.1.0` | `MIT OR Apache-2.0` | [crates.io](https://crates.io/crates/clap_lex/1.1.0) | `c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9` |
56
+ | `colorchoice` | `1.0.5` | `MIT OR Apache-2.0` | [crates.io](https://crates.io/crates/colorchoice/1.0.5) | `1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570` |
57
+ | `heck` | `0.5.0` | `MIT OR Apache-2.0` | [crates.io](https://crates.io/crates/heck/0.5.0) | `2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea` |
58
+ | `is_terminal_polyfill` | `1.70.2` | `MIT OR Apache-2.0` | [crates.io](https://crates.io/crates/is_terminal_polyfill/1.70.2) | `a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695` |
59
+ | `itoa` | `1.0.18` | `MIT OR Apache-2.0` | [crates.io](https://crates.io/crates/itoa/1.0.18) | `8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682` |
60
+ | `memchr` | `2.8.3` | `Unlicense OR MIT` | [crates.io](https://crates.io/crates/memchr/2.8.3) | `cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98` |
61
+ | `proc-macro2` | `1.0.107` | `MIT OR Apache-2.0` | [crates.io](https://crates.io/crates/proc-macro2/1.0.107) | `985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9` |
62
+ | `quote` | `1.0.47` | `MIT OR Apache-2.0` | [crates.io](https://crates.io/crates/quote/1.0.47) | `1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001` |
63
+ | `regex` | `1.13.1` | `MIT OR Apache-2.0` | [crates.io](https://crates.io/crates/regex/1.13.1) | `f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d` |
64
+ | `regex-automata` | `0.4.16` | `MIT OR Apache-2.0` | [crates.io](https://crates.io/crates/regex-automata/0.4.16) | `8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad` |
65
+ | `regex-syntax` | `0.8.11` | `MIT OR Apache-2.0` | [crates.io](https://crates.io/crates/regex-syntax/0.8.11) | `d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4` |
66
+ | `serde` | `1.0.229` | `MIT OR Apache-2.0` | [crates.io](https://crates.io/crates/serde/1.0.229) | `4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba` |
67
+ | `serde_core` | `1.0.229` | `MIT OR Apache-2.0` | [crates.io](https://crates.io/crates/serde_core/1.0.229) | `67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48` |
68
+ | `serde_derive` | `1.0.229` | `MIT OR Apache-2.0` | [crates.io](https://crates.io/crates/serde_derive/1.0.229) | `e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348` |
69
+ | `serde_json` | `1.0.151` | `MIT OR Apache-2.0` | [crates.io](https://crates.io/crates/serde_json/1.0.151) | `c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14` |
70
+ | `strsim` | `0.11.1` | `MIT` | [crates.io](https://crates.io/crates/strsim/0.11.1) | `7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f` |
71
+ | `syn` | `3.0.3` | `MIT OR Apache-2.0` | [crates.io](https://crates.io/crates/syn/3.0.3) | `53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3` |
72
+ | `unicode-ident` | `1.0.24` | `(MIT OR Apache-2.0) AND Unicode-3.0` | [crates.io](https://crates.io/crates/unicode-ident/1.0.24) | `e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75` |
73
+ | `utf8parse` | `0.2.2` | `Apache-2.0 OR MIT` | [crates.io](https://crates.io/crates/utf8parse/0.2.2) | `06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821` |
74
+ | `zmij` | `1.0.23` | `MIT` | [crates.io](https://crates.io/crates/zmij/1.0.23) | `29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b` |
75
+
76
+ ## Selected native license payload
77
+
78
+ For this source package, the MIT alternative is selected for every reachable dependency that offers MIT. For `aho-corasick` and `memchr`, MIT is selected instead of the Unlicense. `unicode-ident` additionally requires Unicode-3.0. The exact upstream license files are preserved once per byte-identical text group:
79
+
80
+ | Selected license file | SHA-256 | Applies to exact locked packages |
81
+ |---|---|---|
82
+ | [`licenses/MIT-aho-corasick-memchr.txt`](licenses/MIT-aho-corasick-memchr.txt) | `0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f` | `aho-corasick 1.1.4`, `memchr 2.8.3` |
83
+ | [`licenses/MIT-anstyle-clap-family.txt`](licenses/MIT-anstyle-clap-family.txt) | `6efb0476a1cc085077ed49357026d8c173bf33017278ef440f222fb9cbcb66e6` | `anstream 1.0.0`, `anstyle 1.0.14`, `anstyle-parse 1.0.0`, `anstyle-query 1.1.5`, `clap 4.6.4`, `clap_builder 4.6.2`, `clap_derive 4.6.4`, `clap_lex 1.1.0`, `colorchoice 1.0.5`, `is_terminal_polyfill 1.70.2` |
84
+ | [`licenses/MIT-heck.txt`](licenses/MIT-heck.txt) | `7b63ecd5f1902af1b63729947373683c32745c16a10e8e6292e2e2dcd7e90ae0` | `heck 0.5.0` |
85
+ | [`licenses/MIT-dtolnay-family.txt`](licenses/MIT-dtolnay-family.txt) | `23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3` | `itoa 1.0.18`, `proc-macro2 1.0.107`, `quote 1.0.47`, `serde 1.0.229`, `serde_core 1.0.229`, `serde_derive 1.0.229`, `serde_json 1.0.151`, `syn 3.0.3`, `unicode-ident 1.0.24`, `zmij 1.0.23` |
86
+ | [`licenses/MIT-regex-family.txt`](licenses/MIT-regex-family.txt) | `6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb` | `regex 1.13.1`, `regex-automata 0.4.16`, `regex-syntax 0.8.11` |
87
+ | [`licenses/MIT-strsim.txt`](licenses/MIT-strsim.txt) | `1e697ce8d21401fbf1bddd9b5c3fd4c4c79ae1e3bdf51f81761c85e11d5a89cd` | `strsim 0.11.1` |
88
+ | [`licenses/MIT-utf8parse.txt`](licenses/MIT-utf8parse.txt) | `e4c9b06fa850cb9b540a5e400e9f6394cf15efcf4098144de477d1d3dae10150` | `utf8parse 0.2.2` |
89
+ | [`licenses/Unicode-3.0.txt`](licenses/Unicode-3.0.txt) | `f7db81051789b729fea528a63ec4c938fdcb93d9d61d97dc8cc2e9df6d47f2a1` | `unicode-ident 1.0.24`; Rust standard-library Unicode data |
90
+
91
+ The two workspace packages use the project-authored MIT alternative preserved at `runtime/LICENSE-MIT`. No reachable crate has a package-specific notice file beyond the selected texts above.
92
+
93
+ ## Rust Standard Library and dynamic system inventory
94
+
95
+ Both provenance files identify `rustc 1.97.1 (8bab26f4f 2026-07-14)`, exact Rust source commit [`8bab26f4f68e0e26f0bb7960be334d5b520ea452`](https://github.com/rust-lang/rust/commit/8bab26f4f68e0e26f0bb7960be334d5b520ea452). The statically linked Rust Standard Library uses its MIT alternative plus Unicode-3.0 for generated Unicode data:
96
+
97
+ | Evidence | SHA-256 |
98
+ |---|---|
99
+ | [`licenses/Rust-1.97.1-COPYRIGHT.txt`](licenses/Rust-1.97.1-COPYRIGHT.txt) | `172020dbfd5b53a226dfde77616190a48dcff519b0bc0e6deb91a8450782c4af` |
100
+ | [`licenses/Rust-1.97.1-LICENSE-MIT.txt`](licenses/Rust-1.97.1-LICENSE-MIT.txt) | `b71bd43a069ca0641a9ecfe585ca7b3c53b5cc1608f8b68321168698e28b5ea1` |
101
+ | [`licenses/Rust-1.97.1-STDLIB-NOTICE.md`](licenses/Rust-1.97.1-STDLIB-NOTICE.md) | `294893c9a5aef6fa5578cc190735e72251268366924d8f1dd8a40ca0e58394df` |
102
+
103
+ The target linkage inventory is:
104
+
105
+ | Bundled target | Dynamic imports supplied by the target operating system |
106
+ |---|---|
107
+ | `aarch64-apple-darwin` | `/usr/lib/libSystem.B.dylib` |
108
+ | `x86_64-unknown-linux-gnu` | `libgcc_s.so.1`, `libc.so.6`, `ld-linux-x86-64.so.2` |
109
+
110
+ Those dynamic libraries are not copied into this repository, npm-pack artifact, or GitHub source archive; their host-system license payloads are therefore not package contents. The Rust notice explicitly excludes the Fuchsia-only standard-library source path from both compiled target inventories.
111
+
112
+ ## Completeness boundary
113
+
114
+ No MPL-2.0 UniFFI package is reachable from this `career-cli` normal/build graph. The UniFFI entries in `runtime/THIRD_PARTY_NOTICES.md` belong to the excluded Swift adapter graph, not either distributed CLI target.
115
+
116
+ This evidence closes the package-owned inventory and selected-license payload mechanically: 28 crates.io packages, two Career Core workspace packages, the Rust 1.97.1 Standard Library, and the exact dynamic imports for both binaries are accounted for. It is not legal advice or automated approval. The documented human review required by [`releasing.md`](releasing.md) must confirm the evidence and either approve it or keep release blocked; that policy transparently permits sole-maintainer sign-off when independent review is unavailable.
@@ -0,0 +1,47 @@
1
+ # Product flow roadmap
2
+
3
+ ## Current phase: deterministic tools and slash-command MVP
4
+
5
+ This package preserves the three stable native tools:
6
+
7
+ - `career_core_discover`
8
+ - `career_core_resume`
9
+ - `career_core_job`
10
+
11
+ It also registers:
12
+
13
+ - `/career-setup` for library and privacy onboarding—not external CLI installation
14
+ - `/career-library` for explicitly configured Markdown/text resume roots
15
+ - `/career-vacancy` for bounded vacancy input after session-persistence consent
16
+ - `/career-match` for deterministic multi-resume matching and conservative ranking
17
+ - `/career-analyze` for deterministic single-resume readiness detail
18
+
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.
20
+
21
+ Binding boundaries:
22
+
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
26
+ - session entries only after explicit persistence consent; entries persist to JSONL even when excluded from model context
27
+ - original resumes only for deterministic analyze/match
28
+ - assisted variants remain labeled and excluded from authoritative reranking
29
+ - stable path/id tie-breaking; any close-cluster label is a UI heuristic, not a Core result
30
+ - 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
32
+
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.
34
+
35
+ ## Later phase: assisted workflows
36
+
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.
38
+
39
+ ## Non-goals in this phase
40
+
41
+ - provider/model-assisted commands or full-screen UI
42
+ - PDF/DOCX/OCR/URL ingestion
43
+ - model/provider integration
44
+ - source-document or full-Core-result persistence outside the approved config/custom-entry workflow
45
+ - source document mutation
46
+ - publication, release downloads, signing, or notarization
47
+ - expanded runtime platform claims beyond `darwin-arm64` and `linux-x64-gnu`