pi-career 0.3.0 → 0.4.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 +24 -0
- package/NOTICE +1 -1
- package/README.md +51 -12
- package/SECURITY.md +1 -1
- package/dist/index.js +6987 -3297
- package/dist/pdf-worker.js +1 -1
- package/docs/application-workspaces.md +744 -100
- package/docs/career-run-roadmap.md +29 -3
- package/docs/cover-letter-contract.md +18 -0
- package/docs/design.md +23 -4
- package/docs/hardening-validation.md +15 -0
- package/docs/persistence-acceptance.md +430 -0
- package/docs/product-flow.md +68 -11
- package/docs/release-plan-0.4.0.md +69 -0
- package/docs/releasing.md +20 -1
- package/docs/single-application-state.md +110 -0
- package/docs/variant-save-workflow.md +1 -1
- package/package.json +10 -13
- package/skills/career-core/SKILL.md +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,30 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## 0.4.0 - 2026-10-04
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- Implemented application-workspace Gate 1 behind user-only no-argument TUI/RPC `/career-workspace`: explicit strict config-v1-to-v2 migration, one existing owner-only disjoint application root, marker attach/detach, immutable application manifest and append-only status/workflow-original-vacancy/selected-original revisions, and read-only crash/drift reconciliation.
|
|
10
|
+
- Added canonical complete editor previews plus separate confirmation, config/inode compare-and-swap, exact config/root locks, no-clobber hard-link publication, bounded limits, private modes, sync/settlement, idempotency, payload-free failures, and synthetic macOS/Linux filesystem coverage for Gate 1.
|
|
11
|
+
- Added the separately authorized application-workspace transaction for user-authored Markdown/plain-text cover letters: an unchanged exact preview, distinct persistence confirmation, and ordinary workspace-mutation approval precede immutable no-clobber artifact/state publication; view and clear preserve validated history, and no assisted drafting, Core/provider/network call, or submission occurs.
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
|
|
15
|
+
- Updated the exact lockfile-pinned Pi development suite to 1.0.2, including compatibility coverage for Pi's structured working-directory prompt section and default interactive-mode entry point; the four Pi-provided runtime packages remain wildcard external peers. Pi 1.0.2 removes the vulnerable development shrinkwrap selection of `brace-expansion@5.0.9`, and the strict full audit and publication-readiness check pass with `brace-expansion@5.0.12`.
|
|
16
|
+
- Preserved first-run and v1 compatibility: ordinary setup may safely bootstrap only private `career/`, absent/v1 ordinary mutations continue writing canonical v1, only confirmed workspace-root configuration migrates to v2, and every later writer preserves v2 plus its optional application-root binding while freshly rejecting root overlap.
|
|
17
|
+
- Documented that Gate 1 performs no Core/runtime/provider/model/network/child/session-append action and does not implement assisted workspace artifacts, deletion, broader application files, repair, adoption, archive, or sync. The separate `/career-save` workflow is unchanged.
|
|
18
|
+
- When a persistent application is attached, `/career-vacancy`, `/career-match`, `/career-analyze`, `/career-workbench`, and `career_run context` use workspace files as the only current vacancy/Resume authority: cancelled vacancy saves change neither workspace nor session, match uses the effective Resume, analyze uses only the selected original, and workbench/assistance never auto-submit.
|
|
19
|
+
- Attached `/career-application` shows and updates workspace lifecycle only through a previewed file mutation, and `/career-application clear` detaches without a competing session-only status or vacancy.
|
|
20
|
+
- TUI `/career` is application-first: Applications and Resumes are the only top-level destinations, while Setup, job description, Analyze, Match, Workspace, and Ask Pi are contextual routes/actions. The existing `/career-*` commands remain direct compatibility routes with breadcrumb-aware Back/Escape behavior; Left/Right or Tab switches destinations, and `a` still attaches only after confirmation without activating assistance. Overlay navigation does not call Core or a provider.
|
|
21
|
+
- One Career view model now owns views, items, selection, detail, and attach. TUI overlay and RPC hierarchical select/confirm dialogs are only renderers of that model; those slash commands only choose the starting view, leftover command-specific menus are gone, and opening/browsing never attaches or calls Core.
|
|
22
|
+
- Setup and library views can add a resume root after confirmation (`n` in TUI, Add root in RPC). The action writes config only, reloads the shared model, and does not attach, call Core, or create files.
|
|
23
|
+
- TUI Career overlay now renders a centered, margin-separated, theme-compatible rounded Unicode modal frame with connected separators, consistent interior padding, explicit breadcrumbs/current state/recommended action/safe alternatives, concise contextual hints, and local help. ANSI/Unicode rows and exact previews are measured against the padded inner width, while a terminal-derived row budget preserves the frame and footer and scrolls only content; long catalogs keep selection visible and detail/help support Up/Down scrolling.
|
|
24
|
+
- Overlay/RPC Career UI can create an application, rescan or remove a library root, run analyze/match, edit a vacancy, update status, and open Gate 1 workspace management from the shared view model. Opening and browsing still never attach or call Core; those actions stay confirmation-gated.
|
|
25
|
+
- Overlay empty states, session-created applications, analyze/match result rows, Ask Pi, detach, and vacancy clear stay on the shared view model so `/career` can run as an in-Pi application without leftover command menus.
|
|
26
|
+
- Attached applications can select and immutably bind one eligible original Resume from Library, Analyze, or Match (`o` in TUI) through the existing exact preview and separate confirmation flow. Attached Analyze/Match no longer fall back to an unbound library Resume, and assisted variants remain ineligible.
|
|
27
|
+
- Legacy Applications rows can finish identity-only migration without a matching session or attachment after separately entering exact labels, reviewing exact canonical bytes, and confirming no-clobber publication; list/open, cancellation, drift, and losing concurrent plans remain no-write.
|
|
28
|
+
|
|
5
29
|
## 0.3.0 - 2026-08-14
|
|
6
30
|
|
|
7
31
|
### Breaking
|
package/NOTICE
CHANGED
|
@@ -15,7 +15,7 @@ notices belong to the separately installed or acquired exact
|
|
|
15
15
|
bundled by pi-career v0.1.0 remains in docs/native-dependency-inventory.md and
|
|
16
16
|
docs/releasing.md but is not part of the current runtime boundary.
|
|
17
17
|
|
|
18
|
-
Searchable PDF text extraction bundles unpdf 1.8.
|
|
18
|
+
Searchable PDF text extraction bundles unpdf 1.8.1, Copyright (c) 2023-PRESENT
|
|
19
19
|
Johann Schopplich, under the MIT License preserved at
|
|
20
20
|
docs/unpdf-LICENSE-MIT.txt. Its bundled serverless PDF.js implementation is
|
|
21
21
|
derived from Mozilla PDF.js and is distributed under the Apache License 2.0,
|
package/README.md
CHANGED
|
@@ -12,6 +12,7 @@ The package's command handlers do not call a model/provider. `/career-workbench`
|
|
|
12
12
|
It gives you:
|
|
13
13
|
|
|
14
14
|
- local slash commands for setting up a resume library, analyzing originals, and matching them to a vacancy;
|
|
15
|
+
- a user-only `/career-workspace` flow for an explicitly configured private application root, immutable status/vacancy revisions, selected-original digest binding, and read-only reconciliation;
|
|
15
16
|
- one compact managed agent tool, `career_run`, for guided work after the deterministic baseline;
|
|
16
17
|
- a visible workbench handoff that never sends private resume text until you review and submit it yourself;
|
|
17
18
|
- bounded TUI inspection and explicit selection of Core-reviewed non-PDF changes without automatic materialization;
|
|
@@ -20,12 +21,20 @@ It gives you:
|
|
|
20
21
|
|
|
21
22
|
Career Core remains authoritative for scores, evidence, warnings, uncertainty, matching, and proposal review. `pi-career` owns the Pi workflow and presentation layer; it does not reimplement Career Core algorithms or schemas.
|
|
22
23
|
|
|
23
|
-
> **Version note:** this
|
|
24
|
+
> **Version note:** this documentation describes `pi-career@0.4.0`. The prior native-free release is `pi-career@0.3.0`; `pi-career@0.2.0` is the earlier native-free release, and `pi-career@0.1.0` is the historical bundled-runtime release.
|
|
25
|
+
|
|
26
|
+
### `/career` application mode
|
|
27
|
+
|
|
28
|
+
`/career` is a modal application inside Pi, not a prompt that enters the agent loop. It locally lists persistent applications in deterministic order, supports text and lifecycle filters, creates and opens applications, displays the three-component package checklist and derived readiness, and exposes explicit attachment and lifecycle actions. A valid attached application opens directly in detail; browsing another application never attaches it. Existing `/career-application` and `/career-workspace` commands remain compatible fallbacks.
|
|
29
|
+
|
|
30
|
+
Opening, browsing, filtering, viewing readiness, and inspecting bounded local details use only local extension state. Explicit deterministic analysis or matching invokes Career Core locally without invoking a model. None of those actions submits a message, appends a session entry merely for navigation, or places Resume, job-description, application, or Core-result content in model context.
|
|
31
|
+
|
|
32
|
+
Model assistance begins only after the user selects an explicit assistance action, reviews the visible editor handoff, and submits it through normal Pi interaction. Persistent application attachment, Career-specific model-context activation, provider submission, and file mutation remain separate decisions. Ordinary sessions expose no Career Skill path or Career tool schema until a valid assistance-activation record is present and its path-free attachment pointer revalidates.
|
|
24
33
|
|
|
25
34
|
## Requirements
|
|
26
35
|
|
|
27
36
|
- Node.js 22.19 or newer
|
|
28
|
-
- Pi with 0.
|
|
37
|
+
- Pi with 1.0.0-compatible package APIs
|
|
29
38
|
- macOS or Linux on ARM64/x64; GNU Linux requires glibc 2.35+, and musl Linux is supported
|
|
30
39
|
- either a compatible local `career` executable or network access for first-use acquisition of exact `@revazi/career@0.2.0`
|
|
31
40
|
|
|
@@ -33,14 +42,14 @@ Windows is unsupported. npm enforces the package `os` allowlist; for a local or
|
|
|
33
42
|
|
|
34
43
|
## Install
|
|
35
44
|
|
|
36
|
-
|
|
45
|
+
Install the exact reviewed version:
|
|
37
46
|
|
|
38
47
|
```bash
|
|
39
|
-
pi install npm:pi-career@0.
|
|
48
|
+
pi install npm:pi-career@0.4.0
|
|
40
49
|
pi list
|
|
41
50
|
```
|
|
42
51
|
|
|
43
|
-
For
|
|
52
|
+
For local-checkout testing, a clean checkout includes reproducible `dist/index.js` and `dist/pdf-worker.js` bundles, so local installation does not require a build or npm install:
|
|
44
53
|
|
|
45
54
|
```bash
|
|
46
55
|
cd /absolute/path/to/pi-career
|
|
@@ -149,7 +158,7 @@ In Pi, run:
|
|
|
149
158
|
/career-setup
|
|
150
159
|
```
|
|
151
160
|
|
|
152
|
-
Choose **Add root** and enter the resume directory. Setup stores the canonical root in private local Pi configuration; it does not copy, move, or edit your resumes.
|
|
161
|
+
Choose **Add root** and enter the resume directory. Setup stores the canonical root in private local Pi configuration; it does not copy, move, or edit your resumes. On first ordinary setup, pi-career may create only the missing agent-directory-relative `career/` config directory as canonical effective-user-owned `0700` beneath the existing canonical Pi agent directory. It never adopts or chmods a pre-existing unsafe object. Workspace configuration remains stricter and requires that private config directory to exist before `/career-workspace` begins.
|
|
153
162
|
|
|
154
163
|
Setup also displays a preferred `variants/` destination. This is suggestion-only: it creates no directory or file and does not authorize a save.
|
|
155
164
|
|
|
@@ -190,6 +199,8 @@ Then set the vacancy:
|
|
|
190
199
|
|
|
191
200
|
Paste the vacancy text directly. `pi-career` never fetches a vacancy URL. Career Core validates the text before it becomes the current vacancy.
|
|
192
201
|
|
|
202
|
+
If you want the separate Gate 1 local application record, prepare an existing private `0700` directory outside every resume/variation root, then run `/career-workspace`. Configure the root and initialize the current application only after reviewing and confirming each exact mutation. This is optional and does not save an assisted resume.
|
|
203
|
+
|
|
193
204
|
### 6. Match your originals
|
|
194
205
|
|
|
195
206
|
```text
|
|
@@ -214,7 +225,7 @@ For a non-PDF tailored variation, `career_run variant-review` ends the agent tur
|
|
|
214
225
|
|
|
215
226
|
## Slash command reference
|
|
216
227
|
|
|
217
|
-
The workflow commands below require interactive TUI/RPC mode except `/career-vacancy clear`; `/career-review` is TUI-only, `/career-save`
|
|
228
|
+
The workflow commands below require interactive TUI/RPC mode except `/career-vacancy clear`; `/career-review` is TUI-only, `/career-save` and no-argument `/career-workspace` support TUI/RPC, and `/career-tools` is a lightweight tool-surface switch. Slash-command handlers do not invoke a model/provider. `/career-workbench` and `/career-review` prepare editor prompts whose later user submission does. Core-backed commands may resolve or acquire the external runtime before processing private input.
|
|
218
229
|
|
|
219
230
|
### `/career-setup [status]`
|
|
220
231
|
|
|
@@ -261,6 +272,23 @@ After clearing—or before working on another company/role—run `/new`. The sam
|
|
|
261
272
|
|
|
262
273
|
This command manages session state only. It does not create workspace folders or application files.
|
|
263
274
|
|
|
275
|
+
### `/career-workspace`
|
|
276
|
+
|
|
277
|
+
Open the user-only TUI/RPC application-workspace menu. The command accepts no arguments and is not available as a model tool. Print/JSON modes fail before reading config, session-private data, or workspace files.
|
|
278
|
+
|
|
279
|
+
Gate 1 can:
|
|
280
|
+
|
|
281
|
+
- show read-only status and classify drift, interrupted initialization, or crash-left locks/temporary files without repair;
|
|
282
|
+
- explicitly configure one already-existing canonical owner-only `0700` application root, creating or validating its private package marker;
|
|
283
|
+
- initialize the current active application at a package-derived direct-child path with immutable manifest and exact private display-identity metadata;
|
|
284
|
+
- append an immutable full state revision for current status, exact workflow-original vacancy bytes, vacancy clear, or a freshly scanned selected-original digest binding;
|
|
285
|
+
- write or revise a separately authorized user-authored Markdown/plain-text cover letter when a current vacancy and effective resume exist, view the current validated artifact, or clear its current reference while retaining immutable history;
|
|
286
|
+
- detach the root from config without changing the marker or any application file.
|
|
287
|
+
|
|
288
|
+
Every mutation displays a complete canonical preview in the editor, requires the preview to return byte-identically, and then requires a separate confirmation. Writing a cover letter also requires a distinct persistence confirmation before the ordinary workspace-mutation approval; cancellation writes nothing. Configuration and workspace files use owner-only modes, locks, bounded no-clobber publication, sync, and fail-closed identity/disjointness checks. Application roots must remain physically disjoint in both directions from every resume-library root and variation-root suggestion.
|
|
289
|
+
|
|
290
|
+
Workspace files outlive `/career-application clear`, `/new`, session deletion, transient shutdown, detach, package removal, and status `closed`. Gate 1 does **not** save an assisted resume, delete a workspace/root/application, copy or modify an original, save Core/provider output, create assisted cover-letter content, or create notes, `changes.md`, interview files, PDF/DOCX artifacts, repair, adoption, archive, or sync behavior. The cover-letter transaction accepts only content authored by the user in the local editor; it does not call Career Core, a model/provider, or the network, and it does not submit the letter. `/career-save` remains a separate resume-library variation workflow with independent consent.
|
|
291
|
+
|
|
264
292
|
### `/career-vacancy [clear]`
|
|
265
293
|
|
|
266
294
|
Set, inspect, replace, or clear the current vacancy.
|
|
@@ -400,7 +428,7 @@ When raw mode is explicitly enabled, discovery-first use remains mandatory: capa
|
|
|
400
428
|
3. package-local exact `@revazi/career@0.2.0`;
|
|
401
429
|
4. bounded acquisition of exact `@revazi/career@0.2.0` from the canonical npm registry.
|
|
402
430
|
|
|
403
|
-
Runtime installation is separate from loading the local Pi package. `/career-setup`, `/career-library`, `/career-application`, `/career-workbench`, and `/career-review` itself do not resolve or invoke Core; `/career-review` requires a still-live review produced earlier by `career_run`. `/career-vacancy`, `/career-analyze`, `/career-match`, `career_run`, and the raw tools do need Core.
|
|
431
|
+
Runtime installation is separate from loading the local Pi package. `/career-setup`, `/career-library`, `/career-application`, `/career-workspace`, `/career-workbench`, and `/career-review` itself do not resolve or invoke Core; `/career-review` requires a still-live review produced earlier by `career_run`. `/career-vacancy`, `/career-analyze`, `/career-match`, `career_run`, and the raw tools do need Core.
|
|
404
432
|
|
|
405
433
|
Extension initialization requires macOS or Linux and fails unsupported platforms with one payload-free `unsupported_platform` error before registering any command/tool or doing route work. Before private document stdin opens on a supported platform, the selected executable must pass the exact managed Career Core 0.2.0 operation and schema compatibility checks. An invalid explicit `CAREER_CLI_PATH` fails without fallback.
|
|
406
434
|
|
|
@@ -431,7 +459,8 @@ Use `pi --no-session` when you do not want a new Pi session JSONL. In a persiste
|
|
|
431
459
|
|
|
432
460
|
Possible persistence surfaces are distinct:
|
|
433
461
|
|
|
434
|
-
- **Package config:** canonical resume-root paths, bounded labels,
|
|
462
|
+
- **Package config:** canonical resume-root paths, bounded labels, an optional variation-directory suggestion, and an optional application-root UUID/path binding; never resume text, vacancy text, or full Core output.
|
|
463
|
+
- **Application workspace files:** an exact root marker, immutable non-content manifest, immutable bounded company/role display identity, append-only state metadata, exact explicitly approved workflow-original vacancy snapshots, selected-original digests, and separately approved user-authored Markdown/plain-text cover-letter revisions; no selected-original bytes, Core result, provider response, prompt, credential, session ID, or environment value.
|
|
435
464
|
- **Pi session:** consent, application/vacancy workflow entries, bounded result cards, and potentially tool arguments/results or submitted workbench messages.
|
|
436
465
|
- **Model provider:** only content you submit through ordinary Pi model interaction; `/career-workbench` makes the private payload visible before submission, while `/career-review` prepares only an ephemeral handle and selected canonical IDs.
|
|
437
466
|
- **Approved local variant files:** exact assisted Markdown/text bytes plus bounded marker/sidecar metadata only after `/career-save` preview and confirmation; never full Core JSON.
|
|
@@ -439,19 +468,19 @@ Possible persistence surfaces are distinct:
|
|
|
439
468
|
|
|
440
469
|
`pi-career` does not create payload/result temporary files, export full Core JSON, overwrite originals, or automatically save assisted resumes. Explicit `/career-save` files are local, private-mode, assisted/non-authoritative, and excluded from analysis/matching. Searchable PDF extraction is local, bounded, and network-disabled.
|
|
441
470
|
|
|
442
|
-
See [`SECURITY.md`](SECURITY.md), [`docs/design.md`](docs/design.md), and [`docs/product-flow.md`](docs/product-flow.md) for the complete boundary and threat model.
|
|
471
|
+
See [`SECURITY.md`](SECURITY.md), [`docs/design.md`](docs/design.md), and [`docs/product-flow.md`](docs/product-flow.md) for the complete boundary and threat model. Synthetic hardening evidence and its limitations are indexed in [`docs/hardening-validation.md`](docs/hardening-validation.md).
|
|
443
472
|
|
|
444
473
|
## Current limitations
|
|
445
474
|
|
|
446
475
|
- Supported original formats: searchable PDF, Markdown, and UTF-8 text.
|
|
447
476
|
- No OCR, DOCX/Pages editing, vacancy URL fetching, or PDF layout reconstruction.
|
|
448
|
-
- No automatic resume
|
|
477
|
+
- No automatic resume saving. Application workspaces persist only explicitly previewed status/vacancy/original bindings and the separate confirmation-gated user-authored Markdown/plain-text cover-letter revisions; assisted resume artifacts and package deletion remain unimplemented separate gates.
|
|
449
478
|
- PDF workbench output is targeted manual guidance only.
|
|
450
479
|
- Assisted variants remain non-authoritative and cannot be reranked as originals.
|
|
451
480
|
- Matching is conservative workflow guidance, not a hiring prediction or proprietary ATS simulation.
|
|
452
481
|
- Supported runtime targets are `darwin-arm64`, `darwin-x64`, `linux-x64-gnu`, `linux-arm64-gnu`, `linux-x64-musl`, and `linux-arm64-musl`; Windows is unsupported.
|
|
453
482
|
|
|
454
|
-
|
|
483
|
+
Application-workspace Gate 1, the separately authorized user-authored cover-letter transaction, and the still-unimplemented assisted-resume/deletion protocols are documented in [`docs/application-workspaces.md`](docs/application-workspaces.md) and [`docs/cover-letter-contract.md`](docs/cover-letter-contract.md). Neither implemented workflow authorizes or implies Gates 2–4.
|
|
455
484
|
|
|
456
485
|
## Development
|
|
457
486
|
|
|
@@ -490,6 +519,16 @@ CAREER_CORE_FIXTURE_ROOT=/absolute/path/to/reviewed/career-core \
|
|
|
490
519
|
|
|
491
520
|
The exact reviewed external runtime coordinate is [`@revazi/career@0.2.0`](https://www.npmjs.com/package/@revazi/career/v/0.2.0), published from Career Core commit [`536690632884c17336cc3c108f1bba0f254b862b`](https://github.com/revazi/career-core/tree/536690632884c17336cc3c108f1bba0f254b862b). Its launcher owns native target/libc selection and package metadata, provenance, file invariants, size, format, and SHA-256 verification. Registry integrity and SLSA v1 provenance were reviewed for the user-facing launcher and all six lockstep native packages. Pi-career validates that exact six-package v2 manifest and supports only its macOS/Linux targets.
|
|
492
521
|
|
|
522
|
+
Published `pi-career` v0.3.0 coordinates are retained for verification:
|
|
523
|
+
|
|
524
|
+
- npm: [`pi-career@0.3.0`](https://www.npmjs.com/package/pi-career/v/0.3.0)
|
|
525
|
+
- Git commit: [`2c0da9ff623b50cc02a7b5bccd3cb047596d947e`](https://github.com/revazi/pi-career/tree/2c0da9ff623b50cc02a7b5bccd3cb047596d947e)
|
|
526
|
+
- npm integrity: `sha512-u/odRK/KMYXhIt/lvGm93RFmQIwBQZV0qbAf1vs/GsNH8Fx/X2f+p+F1iyUYtMi5RH9++SkdhEN8CR2XBScyBw==`
|
|
527
|
+
- npm shasum: `3ad37db78cb76330838fbb3efe722c1cff4d8d00`
|
|
528
|
+
- same-SHA six-target compatibility: [run `31791011739`](https://github.com/revazi/pi-career/actions/runs/31791011739)
|
|
529
|
+
- OIDC publication and registry verification: [run `31791158472`](https://github.com/revazi/pi-career/actions/runs/31791158472)
|
|
530
|
+
- GitHub Release: [`v0.3.0`](https://github.com/revazi/pi-career/releases/tag/v0.3.0), with no custom assets
|
|
531
|
+
|
|
493
532
|
Historical published `pi-career` v0.1.0 coordinates are retained for verification:
|
|
494
533
|
|
|
495
534
|
- npm: [`pi-career@0.1.0`](https://www.npmjs.com/package/pi-career/v/0.1.0)
|
package/SECURITY.md
CHANGED
|
@@ -30,7 +30,7 @@ The process adapter creates no career payload/result temporary file and performs
|
|
|
30
30
|
|
|
31
31
|
`/career-vacancy`, `/career-match`, and `/career-analyze` use the same helper; setup/library scanning and application state remain local. `/career-workbench` does not call a provider, model, or Core process; it only prepares a bounded ordinary Pi editor message containing selected private source. Nothing is sent automatically. If submitted, Pi may persist it and send it to the selected provider.
|
|
32
32
|
|
|
33
|
-
Global config stores only canonical root paths, bounded labels,
|
|
33
|
+
Global config stores only canonical resume-root paths, bounded labels, an optional variation-directory suggestion, and an optional application-root UUID/path binding. First ordinary setup may create only the missing agent-directory-relative `career/` directory as canonical effective-user-owned `0700` beneath an existing canonical Pi agent directory; pre-existing unsafe objects are never adopted or chmodded, and workspace configuration requires that private directory already exist. Owner-only `0600` config locks plus byte/inode compare-and-swap protect writes. Ordinary absent/v1 mutations remain canonical v1 while no workspace is attached; only confirmed **Configure application root** migrates to strict v2, after which every writer preserves v2 and freshly rejects physical overlap. Scans are bounded, UTF-8 strict, and symlink-free. Searchable PDFs are limited to 10 MiB and 20 pages and parsed in a package-owned worker with fixed time, memory, and result ceilings. Network fetch, eval, WASM, streaming, auto-fetch, and system-font lookup are disabled; OCR is not performed. Source text and full Core results are never written to global config or logs. User-only no-argument `/career-workspace` Gate 1 may separately persist a non-content root marker/manifest, append-only full status metadata, exact explicitly approved workflow-original vacancy bytes, and selected-original digests under one existing owner-only `0700` root disjoint from every resume/variation root. Every mutation requires unchanged complete preview plus separate confirmation and uses bounded private no-clobber publication; workspace actions invoke no Core/runtime/provider/model/network/child process and append no session entry. Assisted workspace artifacts, deletion, repair/adoption/archive/sync, and broader files are not implemented.
|
|
34
34
|
|
|
35
35
|
Only a strictly shaped, bounded, allowlisted `career.error.v1` may cross a known nonzero Core failure. Other failures expose stable payload-free `career.pi_error.v1`. Runtime code must not log or expose source/result text, raw errors, stderr, executable paths, hashes, platform details, environment values, npm diagnostics, or credentials.
|
|
36
36
|
|