The review of v6.2.0..f669b87 (BLOCK: 1 BLOCKER, 12 MAJOR, 1 MINOR), each fixed behind a test that failed first, or, for the two missing tests, a test shown to fail on a stub of the branch it covers. - Review steps appended by /trekexecute Phase 7.2 are held to the step rules on any plan version: plan-validator --steps-from <N> (on a plan below 1.8 a template review step validated and was executed). - The guard refuses where no one can be asked also when its rules will not load; the wave merge path names that refusal instead of MERGE_REFUSED. Tests for the classifier-error refusal and post-approval-log's own check. - release-check: the version files may change only in their version after the review (JSON compared without it), README diff lines are read inside hunks only, an unreadable diff is exit 2, and npm test runs without NODE_TEST_CONTEXT. - What counts as a step of only tests: a note in parentheses is not a path, and a data file under specs/ is not a test. End-to-end: rides on the last step that builds behaviour (validator hint, trekplan, template). - A removed line is cited as <rev>:<path>:<line> (findings-schema hint, trekreview re-ask). - skill-lint counts a trailing newline as no line; regression-check takes commandEnv from lib/util/command-env.mjs; CLAUDE.md names four mode-read exemptions. - /security-review, older than v6.2.0: the criteria runner refuses git --output, which writes a file. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
80 lines
6.2 KiB
Markdown
80 lines
6.2 KiB
Markdown
# Voyage JSONL stats — schema audit (v4.1 input)
|
|
|
|
> **Purpose:** Field-allowlist input for v4.1 OTel exporter (Step 11). Lists every
|
|
> field every voyage stats JSONL writer emits today, plus the additive fields v4.1
|
|
> introduces. Load-bearing for Step 11 (field-allowlist) and Step 8 (stats plumbing).
|
|
>
|
|
> **PII-flag:** `command_excerpt` from `hooks/scripts/post-bash-stats.mjs` slices
|
|
> the first 120 chars of an arbitrary Bash command — may contain operator paths,
|
|
> branch names, or fragments of secrets that survived the secrets-hook. CWE-212
|
|
> (Improper Cross-boundary Removal of Sensitive Data). The OTel exporter MUST
|
|
> NOT export this field unless the operator explicitly opts in via
|
|
> `VOYAGE_EXPORT_INCLUDE_COMMAND_EXCERPT=1` (deferred to v4.2 — v4.1 hard-excludes).
|
|
>
|
|
> **Additive v4.1 fields:** `profile`, `phase_models`, `parallel_agents`,
|
|
> `external_research_enabled`, `profile_source`. All are forward-compat: existing
|
|
> v4.0 consumers ignore unknown keys, v4.1 consumers get richer signal.
|
|
|
|
## Field table per JSONL writer
|
|
|
|
| schema_id | fields | writer_path | line_ref | v4.1 additive | PII |
|
|
|-----------|--------|-------------|----------|---------------|-----|
|
|
| trekbrief-stats | ts, task, slug, mode, interview_turns, review_iterations, brief_quality, research_topics, auto_research, auto_result, intent_approved, project_dir, order_id, order_claimed_at, order_reason | commands/trekbrief.md (orchestrator-emit Phase 7; order_* added by lib/stats/stats-append.mjs) | trekbrief.md:1130-1145 | profile, phase_models, profile_source | none |
|
|
| trekresearch-stats | ts, question, mode, scope, engine, slug, project_dir, brief_path, dimensions, dimensions_baseline, dimensions_baseline_preserved, effort, conv_turns, empty_turns, unique_sources, agents_local, agents_external, gemini_used, confidence, contradictions, open_questions | lib/stats/stats-append.mjs (trekresearch.md Stats tracking) | trekresearch.md:782-808 | profile, phase_models, parallel_agents, external_research_enabled, profile_source | none |
|
|
| trekplan-stats | ts, task, mode, slug, brief_path, project_dir, codebase_size, codebase_files, agents_deployed, deep_dives, research_briefs_used, research_scout_used, critic_verdict, guardian_verdict, outcome | lib/stats/stats-append.mjs (trekplan.md Phase 12) | trekplan.md:1115-1135 | profile, phase_models, parallel_agents, profile_source | none |
|
|
| trekexecute-stats (Phase 9 record) | ts, plan, plan_type, mode, result, steps_total, steps_passed, steps_failed, steps_skipped, failed_at_step | lib/stats/stats-append.mjs (trekexecute.md Phase 9) | trekexecute.md:2867-2889 | profile, phase_models, profile_source | none |
|
|
| trekexecute-stats (autonomy events) | ts, event, known_event, payload | lib/stats/event-emit.mjs `emit()` | event-emit.mjs:78-99 | payload.profile, payload.phase_models, payload.profile_source | none |
|
|
| trekexecute-stats (PostToolUse Bash) | ts, session_id, command_excerpt, duration_ms, success | hooks/scripts/post-bash-stats.mjs (Bash PostToolUse) | post-bash-stats.mjs:42-54 | none (hook is plugin-level, not profile-aware) | command_excerpt (CWE-212) |
|
|
| trekreview-stats | ts, slug, verdict, counts (BLOCKER/MAJOR/MINOR/SUGGESTION), reviewed_files_count, mode, duration_ms | lib/stats/stats-append.mjs (trekreview.md Phase 8) | trekreview.md:628-632 | profile, phase_models, profile_source | none |
|
|
| trekcontinue-stats | ts, project, next_session_label, status | lib/stats/stats-append.mjs (trekcontinue.md Phase 5) | trekcontinue.md:293-297 | profile, profile_source | none |
|
|
| token-usage | ts, session_id, scope, model, tokens_input, tokens_output, tokens_cache_creation, tokens_cache_read, cost_usd, is_estimate, price_table_version | lib/stats/token-usage.mjs `captureTokenUsage` (via hooks/scripts/otel-export.mjs Stop hook, opt-in `VOYAGE_TOKEN_METER`) | token-usage.mjs:buildRecord | n/a (SKAL-2 schema) | session_id (stripped at export) |
|
|
|
|
## Field-allowlist input for Step 11
|
|
|
|
The OTel exporter (Step 11 `lib/exporters/field-allowlist.mjs`) MUST inline the
|
|
following static const arrays (NOT load from this file at runtime — Step 11
|
|
explicit constraint: INLINE static const, IKKE runtime fra tests/fixtures):
|
|
|
|
**EXPORT_ALLOWLIST** (numeric/bool/short-string fields safe for OTel metric labels):
|
|
|
|
```
|
|
ts, slug, mode, brief_quality, auto_research, auto_result,
|
|
codebase_size, codebase_files, agents_deployed, deep_dives,
|
|
agents_local, agents_external, gemini_used, dimensions, confidence,
|
|
contradictions, open_questions, interview_turns, review_iterations,
|
|
research_topics, research_briefs_used, research_scout_used,
|
|
critic_verdict, guardian_verdict, outcome, plan_type, result,
|
|
steps_total, steps_passed, steps_failed, steps_skipped, failed_at_step,
|
|
verdict, reviewed_files_count, duration_ms, status, next_session_label,
|
|
event, known_event, success, scope,
|
|
profile, profile_source, parallel_agents, external_research_enabled,
|
|
model, tokens_input, tokens_output, tokens_cache_creation, tokens_cache_read,
|
|
cost_usd, is_estimate, price_table_version
|
|
```
|
|
|
|
**EXPORT_DENYLIST** (PII or high-cardinality, never export):
|
|
|
|
```
|
|
task, question, project_dir, project, plan, brief_path, command_excerpt, payload, counts, phase_models, session_id,
|
|
order_id, order_claimed_at, order_reason
|
|
```
|
|
|
|
> Notes:
|
|
> - `task` and `question` may contain user-content prose → high-cardinality + PII risk.
|
|
> - `project_dir` and paths leak filesystem layout.
|
|
> - `command_excerpt` per CWE-212 above.
|
|
> - `phase_models` is a structured object (6 keys) — too high-cardinality for label;
|
|
> profile name (`profile`) is the safe summary. v4.2 may revisit if operators ask.
|
|
> - `counts` (review BLOCKER/MAJOR/MINOR/SUGGESTION) is a nested object — Step 11
|
|
> exporter flattens to `voyage_review_counts_blocker`/`_major`/`_minor`/`_suggestion`
|
|
> metrics rather than a label.
|
|
> - `session_id` is a UUID — high-cardinality, not useful as a label, log-only.
|
|
|
|
## Cross-reference
|
|
|
|
- Step 8 (stats plumbing) — adds `profile` + `phase_models` + `profile_source` to all
|
|
6 orchestrator-emit sites listed above.
|
|
- Step 11 (field-allowlist) — codifies the EXPORT_ALLOWLIST/DENYLIST arrays above
|
|
as inline static consts in `lib/exporters/field-allowlist.mjs`.
|
|
- Step 9 (Prometheus textfile) — emits one metric line per allowlist-numeric field
|
|
per JSONL writer; PII-flagged fields are dropped at format-layer, not export-layer.
|