job-application-agent 2.0.3 → 2.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
  **Discover better roles · Apply with verified facts · Keep private data local · Learn from outcomes**
14
14
 
15
- [Quick start](#-quick-start) · [How it works](#-how-it-works) · [Safety](#-safety-by-design) · [Privacy](#-privacy-model) · [Analytics](#-usage-analytics) · [Security](SECURITY.md)
15
+ [Quick start](#-quick-start) · [How it works](#-how-it-works) · [Safety](#-safety-by-design) · [Privacy](#-privacy-model) · [Public dashboard](https://job-application-agent-telemetry.varora1406.workers.dev/) · [Analytics](#-usage-analytics) · [Security](SECURITY.md)
16
16
 
17
17
  </div>
18
18
 
@@ -149,6 +149,8 @@ Structured anonymous usage analytics are enabled by default so the project can l
149
149
 
150
150
  It never includes candidate identity, profile fields, résumé content, prompts, form answers, notes, browser data, IP addresses, or raw errors. A Cloudflare relay validates the schema before forwarding personless events to a private PostHog dashboard.
151
151
 
152
+ The [public usage dashboard](https://job-application-agent-telemetry.varora1406.workers.dev/) shows aggregate installations, activity, applications, outcomes, ATS mix, and role seniority. The relay increments a separate aggregate-only Cloudflare D1 store after PostHog accepts each event. The public API exposes no raw events or installation identifiers and suppresses small segments.
153
+
152
154
  ```sh
153
155
  node ~/.codex/skills/job-application-agent/scripts/job-application.mjs telemetry status
154
156
  node ~/.codex/skills/job-application-agent/scripts/job-application.mjs telemetry disable
@@ -61,5 +61,7 @@ Only documented enums, bounded numbers, Booleans, bounded company/title/country
61
61
  - The project does not call PostHog identify, alias, group, person-property, autocapture, or session-replay features.
62
62
  - Anonymous installation IDs remain stable until reset.
63
63
  - The product retention policy is 24 months and dashboards are private. Dashboard queries exclude data older than 24 months.
64
+ - A public usage dashboard exposes only fixed aggregate metrics. It never exposes raw events or anonymous installation IDs, rolls segment counts below three into `other`, and caches results at the edge for 15 minutes.
65
+ - After PostHog accepts an event, the relay best-effort increments a separate Cloudflare D1 store containing daily counters and HMAC-derived installation hashes. The public endpoint reads only this aggregate store; it has no PostHog read credential.
64
66
  - PostHog US Cloud must be configured with a 24-month raw-event TTL before production telemetry is considered fully retention-compliant. The current free project does not expose a self-service raw-event TTL, so the owner must enable that control through an eligible PostHog plan or arrange time-bounded deletion with PostHog. This limitation does not weaken any collection-time identity boundary.
65
67
  - The Worker does not forward client IPs or request headers, and Worker observability is disabled.
@@ -36,7 +36,7 @@ async function writePrivate(file, value) {
36
36
  }
37
37
 
38
38
  export class TelemetryClient {
39
- constructor({ stateDir, endpoint = DEFAULT_TELEMETRY_ENDPOINT, fetch: fetchFn = globalThis.fetch, stderr = (value) => process.stderr.write(value), now = () => new Date(), timeoutMs = Number(process.env.JOB_APPLICATION_AGENT_TELEMETRY_TIMEOUT_MS ?? 750) }) {
39
+ constructor({ stateDir, endpoint = DEFAULT_TELEMETRY_ENDPOINT, fetch: fetchFn = globalThis.fetch, stderr = (value) => process.stderr.write(value), now = () => new Date(), timeoutMs = Number(process.env.JOB_APPLICATION_AGENT_TELEMETRY_TIMEOUT_MS ?? 3000) }) {
40
40
  this.stateDir = stateDir;
41
41
  this.endpoint = endpoint.replace(/\/$/, '');
42
42
  this.fetch = fetchFn;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "job-application-agent",
3
- "version": "2.0.3",
3
+ "version": "2.0.4",
4
4
  "description": "A self-updating Codex skill for evidence-based job discovery, application completion, and outcome tracking.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -37,7 +37,7 @@
37
37
  "test": "node --test job-application-agent/tests/*.test.mjs telemetry-worker/tests/*.test.mjs installer/tests/*.test.mjs",
38
38
  "privacy-audit": "node --test job-application-agent/tests/privacy-audit.test.mjs",
39
39
  "smoke:package": "node scripts/smoke-package.mjs",
40
- "check": "node --check job-application-agent/scripts/job-application.mjs && node --check job-application-agent/scripts/telemetry-client.mjs && node --check job-application-agent/scripts/telemetry-schema.mjs && node --check telemetry-worker/src/worker.mjs && node --check installer/src/cli.mjs && node --check installer/src/installer.mjs && node --check installer/src/runner.mjs && node --check installer/src/scheduler.mjs && node --check bin/job-application-agent.mjs",
40
+ "check": "node --check job-application-agent/scripts/job-application.mjs && node --check job-application-agent/scripts/telemetry-client.mjs && node --check job-application-agent/scripts/telemetry-schema.mjs && node --check telemetry-worker/src/worker.mjs && node --check telemetry-worker/src/public-stats.mjs && node --check telemetry-worker/public/dashboard.js && node --check installer/src/cli.mjs && node --check installer/src/installer.mjs && node --check installer/src/runner.mjs && node --check installer/src/scheduler.mjs && node --check bin/job-application-agent.mjs",
41
41
  "prepack": "npm run check && npm test && npm run privacy-audit"
42
42
  },
43
43
  "engines": {