@event4u/agent-config 14.6.0 → 14.8.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/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +255 -145
- package/README.md +1 -1
- package/dist/agent-src/commands/analyze/inbox.md +264 -10
- package/dist/agent-src/commands/analyze.md +1 -1
- package/dist/agent-src/commands/evals/git-pr-merge.json +13 -0
- package/dist/agent-src/commands/evals/roadmap.json +17 -1
- package/dist/agent-src/commands/pr/create.md +14 -2
- package/dist/agent-src/commands/pr/merge.md +379 -0
- package/dist/agent-src/commands/roadmap/process-full.md +272 -32
- package/dist/agent-src/commands/roadmap.md +1 -1
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +46 -36
- package/dist/agent-src/contexts/execution/autonomy-mechanics.md +37 -2
- package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +95 -2
- package/dist/agent-src/contexts/execution/roadmap-process-loop.md +289 -106
- package/dist/agent-src/rules/artifact-drafting-protocol.md +5 -1
- package/dist/agent-src/rules/context-hygiene.md +2 -0
- package/dist/agent-src/rules/decision-revisit-gate.md +67 -32
- package/dist/agent-src/rules/fix-what-you-see.md +108 -0
- package/dist/agent-src/rules/no-roadmap-references.md +0 -5
- package/dist/agent-src/rules/recurring-criticism.md +110 -0
- package/dist/agent-src/rules/roadmap-progress-sync.md +20 -1
- package/dist/agent-src/rules/rule-type-governance.md +0 -2
- package/dist/agent-src/rules/self-repair-loop.md +17 -0
- package/dist/agent-src/rules/skill-quality.md +0 -2
- package/dist/agent-src/rules/source-confidentiality.md +37 -7
- package/dist/agent-src/scripts/archival_sweep.ts +117 -0
- package/dist/agent-src/scripts/archive_completed_roadmaps.ts +26 -7
- package/dist/agent-src/scripts/dashboard_mode.ts +212 -0
- package/dist/agent-src/scripts/gate_budget.ts +282 -0
- package/dist/agent-src/scripts/gate_execute.ts +72 -31
- package/dist/agent-src/scripts/roadmap_gates.ts +74 -3
- package/dist/agent-src/scripts/update_roadmap_progress.ts +296 -53
- package/dist/agent-src/skills/adr-create/SKILL.md +124 -5
- package/dist/agent-src/skills/ai-council/SKILL.md +48 -807
- package/dist/agent-src/skills/ai-council/references/advanced-modes.md +320 -0
- package/dist/agent-src/skills/ai-council/references/cost-and-redaction.md +99 -0
- package/dist/agent-src/skills/ai-council/references/execution-modes.md +162 -0
- package/dist/agent-src/skills/ai-council/references/output-and-synthesis.md +125 -0
- package/dist/agent-src/skills/ai-council/references/procedure.md +143 -0
- package/dist/agent-src/skills/decision-record/SKILL.md +61 -3
- package/dist/agent-src/skills/decision-review/SKILL.md +65 -0
- package/dist/agent-src/skills/merge-conflicts/SKILL.md +26 -0
- package/dist/agent-src/skills/quality-tools/SKILL.md +34 -326
- package/dist/agent-src/skills/quality-tools/references/js-ts-tools.md +113 -0
- package/dist/agent-src/skills/quality-tools/references/php-tools.md +222 -0
- package/dist/agent-src/skills/roadmap-management/SKILL.md +15 -409
- package/dist/agent-src/skills/roadmap-management/references/archival.md +226 -0
- package/dist/agent-src/skills/roadmap-management/references/authoring.md +107 -0
- package/dist/agent-src/skills/roadmap-management/references/dashboard.md +47 -0
- package/dist/agent-src/skills/roadmap-management/references/lifecycle.md +58 -0
- package/dist/agent-src/skills/security/SKILL.md +8 -0
- package/dist/agent-src/skills/security-audit/SKILL.md +12 -1
- package/dist/agent-src/skills/skill-writing/SKILL.md +34 -570
- package/dist/agent-src/skills/skill-writing/references/procedure.md +275 -0
- package/dist/agent-src/skills/skill-writing/references/read-only-scripts.md +18 -0
- package/dist/agent-src/skills/skill-writing/references/section-patterns.md +298 -0
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/roadmaps.md +65 -4
- package/dist/agent-src/templates/scripts/telemetry/flush_sender.mjs +163 -0
- package/dist/agent-src/templates/scripts/telemetry/remote.ts +160 -7
- package/dist/agent-src/templates/scripts/telemetry/transport.ts +169 -0
- package/dist/cli/registry.js +2 -1
- package/dist/cli/registry.js.map +1 -1
- package/dist/cli-delegate/chunk-2GNWGMAL.js +172 -0
- package/dist/cli-delegate/{chunk-P6LQDIWK.js → chunk-7PRE6ZV2.js} +338 -0
- package/dist/cli-delegate/{chunk-BKO2AZ7Z.js → chunk-B2ERU2VA.js} +1 -1
- package/dist/cli-delegate/chunk-E4XIZDIB.js +402 -0
- package/dist/cli-delegate/{chunk-3UCJWMMP.js → chunk-EEJUMCDZ.js} +16 -16
- package/dist/cli-delegate/{chunk-NXFWFAYV.js → chunk-G23AT6GD.js} +1 -0
- package/dist/cli-delegate/{chunk-XURJ4AQC.js → chunk-H4VIVD4C.js} +385 -284
- package/dist/cli-delegate/chunk-I3EIN2YG.js +36 -0
- package/dist/cli-delegate/{chunk-RLN73PR5.js → chunk-LPPWO5CE.js} +12 -8
- package/dist/cli-delegate/chunk-MWRD5YOH.js +100 -0
- package/dist/cli-delegate/{chunk-UEZ7D35A.js → chunk-N7CDDGI3.js} +4 -23
- package/dist/cli-delegate/{chunk-63WSP6YZ.js → chunk-PMEKGDED.js} +74 -167
- package/dist/cli-delegate/{chunk-GRRPEPRN.js → chunk-T7L2QK3K.js} +24 -5
- package/dist/cli-delegate/{chunk-EVTY7ISR.js → chunk-YM4GZDJG.js} +9 -1
- package/dist/cli-delegate/cmd_adr_effective.js +1162 -0
- package/dist/cli-delegate/cmd_conformance.js +466 -716
- package/dist/cli-delegate/cmd_converge.js +3 -3
- package/dist/cli-delegate/cmd_doctor.js +10 -10
- package/dist/cli-delegate/cmd_explain.js +1 -1
- package/dist/cli-delegate/cmd_export.js +10 -9
- package/dist/cli-delegate/cmd_handoff.js +10 -9
- package/dist/cli-delegate/cmd_memory_get.js +2 -1
- package/dist/cli-delegate/cmd_migrate.js +2 -2
- package/dist/cli-delegate/cmd_packs_active.js +1 -1
- package/dist/cli-delegate/cmd_preflight.js +5 -5
- package/dist/cli-delegate/cmd_prune.js +11 -10
- package/dist/cli-delegate/cmd_route_audit.js +6 -5
- package/dist/cli-delegate/cmd_route_explain.js +3 -3
- package/dist/cli-delegate/cmd_session_recycle.js +840 -30
- package/dist/cli-delegate/cmd_settings_get.js +3 -3
- package/dist/cli-delegate/cmd_settings_migrate.js +10 -9
- package/dist/cli-delegate/cmd_settings_set.js +1 -1
- package/dist/cli-delegate/cmd_sync.js +11 -10
- package/dist/cli-delegate/cmd_uninstall.js +13 -11
- package/dist/cli-delegate/cmd_update.js +4 -4
- package/dist/cli-delegate/cmd_upgrade.js +4 -4
- package/dist/cli-delegate/cmd_validate.js +11 -10
- package/dist/cli-delegate/cmd_versions.js +3 -3
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +111 -37
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +5 -5
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +15 -12
- package/dist/discovery/trust-report.md +3 -3
- package/dist/discovery/workspaces.json +11 -8
- package/dist/hooks/dispatch.js +3165 -2192
- package/dist/install/claudePathsPlan.js +187 -0
- package/dist/install/claudePathsPlan.js.map +1 -0
- package/dist/install/globalRuleLayers.js +169 -0
- package/dist/install/globalRuleLayers.js.map +1 -0
- package/dist/install/hostLayerFingerprint.js +136 -0
- package/dist/install/hostLayerFingerprint.js.map +1 -0
- package/dist/install/install.mjs +553 -425
- package/dist/install/partitionEligibility.js +432 -0
- package/dist/install/partitionEligibility.js.map +1 -0
- package/dist/install/ruleLayerPartition.js +157 -0
- package/dist/install/ruleLayerPartition.js.map +1 -0
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +1863 -1234
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/agent_src.js +41 -0
- package/dist/scripts/_lib/agent_src.js.map +1 -1
- package/dist/scripts/_lib/install_layout.js +83 -0
- package/dist/scripts/_lib/install_layout.js.map +1 -0
- package/dist/scripts/_lib/installed_lock.js +444 -0
- package/dist/scripts/_lib/installed_lock.js.map +1 -0
- package/dist/scripts/_lib/prune_empty_dirs.js +85 -0
- package/dist/scripts/_lib/prune_empty_dirs.js.map +1 -0
- package/dist/scripts/condense.js +63 -251
- package/dist/scripts/condense.js.map +1 -1
- package/dist/server/schemas/settings.js +4 -0
- package/dist/server/schemas/settings.js.map +1 -1
- package/docs/contracts/settings-classes.md +12 -6
- package/docs/guidelines/agent-infra/agent-interaction-and-decision-quality.md +8 -3
- package/docs/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +45 -1
- package/docs/guidelines/agent-infra/context-hygiene-mechanics.md +26 -0
- package/docs/guidelines/agent-infra/false-green.md +47 -1
- package/docs/guidelines/agent-infra/memory-access.md +17 -0
- package/docs/guidelines/agent-infra/recurring-criticism-mechanics.md +96 -0
- package/package.json +1 -1
- package/src/agent-src/scripts/archival_sweep.ts +117 -0
- package/src/agent-src/scripts/archive_completed_roadmaps.ts +26 -7
- package/src/agent-src/scripts/dashboard_mode.ts +212 -0
- package/src/agent-src/scripts/gate_budget.ts +282 -0
- package/src/agent-src/scripts/gate_execute.ts +72 -31
- package/src/agent-src/scripts/roadmap_gates.ts +74 -3
- package/src/agent-src/scripts/update_roadmap_progress.ts +296 -53
- package/src/agent-src/templates/scripts/telemetry/flush_sender.mjs +163 -0
- package/src/agent-src/templates/scripts/telemetry/remote.ts +160 -7
- package/src/agent-src/templates/scripts/telemetry/transport.ts +169 -0
- package/src/config/agent-settings.template.yml +27 -2
- package/src/config/ci-local-parity.yml +39 -0
- package/src/config/estate-count-budget.json +612 -3
- package/src/config/evaluator-budgets.json +3 -3
- package/src/config/gate-coverage.yml +220 -12
- package/src/config/gate-violation-baselines.json +73 -63
- package/src/config/gitignore-block.txt +15 -2
- package/src/config/hook-latency-budget.json +5 -0
- package/src/config/rule-activation-census.json +14 -6
- package/src/config/rule-stub-ceilings.json +34 -7
- package/src/install/claudePathsPlan.ts +196 -0
- package/src/install/globalRuleLayers.ts +197 -0
- package/src/install/hostLayerFingerprint.ts +145 -0
- package/src/install/partitionEligibility.ts +502 -0
- package/src/install/ruleLayerPartition.ts +212 -0
- package/src/scripts/_cli/cmd_adr_effective.ts +484 -0
- package/src/scripts/_cli/cmd_session_recycle.ts +9 -1
- package/src/scripts/_dispatch.bash +17 -1
- package/src/scripts/_lib/ac_heading.ts +30 -0
- package/src/scripts/_lib/adr_frontmatter.test.ts +365 -0
- package/src/scripts/_lib/adr_frontmatter.ts +459 -0
- package/src/scripts/_lib/agent_src.ts +42 -0
- package/src/scripts/_lib/bench_ab_pinned_repo.ts +162 -0
- package/src/scripts/_lib/bench_ab_workspace.ts +10 -1
- package/src/scripts/_lib/envelope_grounding.ts +49 -9
- package/src/scripts/_lib/installed_lock.ts +50 -5
- package/src/scripts/_lib/layer_overlap_notice.ts +11 -2
- package/src/scripts/_lib/md_section.ts +129 -0
- package/src/scripts/_lib/prune_empty_dirs.ts +80 -0
- package/src/scripts/_lib/scope_guard.sh +26 -3
- package/src/scripts/_lib/self_repair.ts +19 -0
- package/src/scripts/_lib/self_repair_class_b.ts +171 -0
- package/src/scripts/adr/evidence_census.ts +899 -0
- package/src/scripts/adr/regenerate_index.ts +12 -32
- package/src/scripts/adr_cite_check.ts +540 -39
- package/src/scripts/ai_council/cli_help.ts +55 -0
- package/src/scripts/audit_adr_coverage.ts +103 -17
- package/src/scripts/before_complete_hook.ts +153 -28
- package/src/scripts/bench_ab_v2_complexity.ts +27 -7
- package/src/scripts/bench_hook_latency.ts +204 -0
- package/src/scripts/build_archive_index.ts +34 -0
- package/src/scripts/check_adr_frontmatter.ts +574 -39
- package/src/scripts/check_hook_bundle_content.ts +219 -0
- package/src/scripts/check_new_adr_evidence.ts +529 -0
- package/src/scripts/check_references.ts +78 -0
- package/src/scripts/check_release_published.ts +32 -11
- package/src/scripts/check_rule_layer_partition.ts +531 -0
- package/src/scripts/check_single_delivery.ts +194 -17
- package/src/scripts/check_standing_rule_delivery.ts +8 -2
- package/src/scripts/ci_settle.ts +170 -0
- package/src/scripts/condense.ts +79 -259
- package/src/scripts/council_cli.ts +3 -3
- package/src/scripts/dispatch_r2_reviewer.ts +6 -14
- package/src/scripts/external_sources_denylist.json +4 -1
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +77 -14
- package/src/scripts/hooks/block_no_verify.ts +61 -10
- package/src/scripts/hooks/block_unauthorized_git.ts +21 -1
- package/src/scripts/hooks/concern_registry.ts +4 -0
- package/src/scripts/hooks/dispatch_hook.ts +154 -187
- package/src/scripts/hooks/dispatch_issues.ts +38 -19
- package/src/scripts/hooks/fallback_yaml.ts +66 -0
- package/src/scripts/hooks/host_semantics.ts +21 -0
- package/src/scripts/hooks/injection_budget.ts +13 -3
- package/src/scripts/hooks/py_json_dumps.ts +103 -0
- package/src/scripts/hooks/rtk_wrap_hook.ts +8 -3
- package/src/scripts/hooks/run_continuation_hook.ts +8 -5
- package/src/scripts/hooks/ship_diff_volume_hook.ts +81 -15
- package/src/scripts/hooks/source_first_gate_hook.ts +464 -0
- package/src/scripts/hooks/state_io.ts +870 -21
- package/src/scripts/hooks/stdin_failure_policy.ts +96 -0
- package/src/scripts/hooks/subagent_ledger_hook.ts +44 -15
- package/src/scripts/hooks/telemetry_flush_hook.ts +139 -0
- package/src/scripts/hooks/telemetry_self_repair.ts +128 -0
- package/src/scripts/hooks/telemetry_usage_hook.ts +22 -4
- package/src/scripts/hooks/turn_end_gate_hook.ts +81 -15
- package/src/scripts/injection_scan_hook.ts +137 -5
- package/src/scripts/install.ts +16 -11
- package/src/scripts/language_mirror_hook.ts +561 -25
- package/src/scripts/lint_framework_leakage_allowlist.json +2 -2
- package/src/scripts/lint_hook_manifest.ts +49 -0
- package/src/scripts/lint_plan_risk_register.ts +4 -3
- package/src/scripts/lint_provenance_vocabulary.ts +472 -4
- package/src/scripts/lint_skill_router_head.ts +4 -4
- package/src/scripts/mcp_server/tools.ts +2 -2
- package/src/scripts/new_roadmap.ts +136 -0
- package/src/scripts/pack_mcp_content.ts +20 -5
- package/src/scripts/release.ts +37 -38
- package/src/scripts/report_layer_overlap.ts +6 -0
- package/src/scripts/routing_doctor.ts +5 -1
- package/src/scripts/self_repair_hook.ts +37 -5
- package/src/scripts/session_register_hook.ts +11 -0
- package/src/scripts/skill_usage_collect.ts +11 -1
- package/src/scripts/skill_usage_report.ts +278 -8
- package/src/scripts/sync_pr_branch.ts +170 -20
- package/src/server/schemas/settings.ts +8 -0
- package/dist/cli-delegate/chunk-EJITJBJX.js +0 -172
- package/dist/cli-delegate/chunk-PZWRPRWP.js +0 -38
- package/dist/cli-delegate/{chunk-PPQO4NGR.js → chunk-6RJA2F5A.js} +3 -3
- package/dist/cli-delegate/{chunk-RYNADUFG.js → chunk-LWTYTX6F.js} +0 -0
- package/dist/cli-delegate/{chunk-FBKL6JWT.js → chunk-MMSGVZKV.js} +3 -3
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Class-B path (road-to-org-telemetry Phase 5, step 5.2).
|
|
3
|
+
*
|
|
4
|
+
* Class A is the automatic half: structural fields, no content, shipped under
|
|
5
|
+
* recorded org consent. Class B is an abstracted CASE — what was expected
|
|
6
|
+
* versus what happened, and which artefacts were involved — and it ships only
|
|
7
|
+
* on explicit per-case approval of the exact text that would leave.
|
|
8
|
+
*
|
|
9
|
+
* THE GATE IS THE HUMAN READING THE OUTBOUND TEXT, NOT A FILTER. Rank 1 of the
|
|
10
|
+
* roadmap risk register is "an abstraction miss ships a path or an identifier
|
|
11
|
+
* out of a consumer project", and its stated mitigation is per-case review of
|
|
12
|
+
* the exact outbound text rather than a filter heuristic. So this module's job
|
|
13
|
+
* is to make the exact bytes visible and then refuse to release them unless the
|
|
14
|
+
* approval names those same bytes. `approve` takes a digest of the rendered
|
|
15
|
+
* text; a text that changed after the human read it no longer matches, and the
|
|
16
|
+
* release refuses rather than shipping something nobody approved.
|
|
17
|
+
*
|
|
18
|
+
* SILENT SHIPPING IS PERMANENTLY OUT OF SCOPE, and the step says so in those
|
|
19
|
+
* words. There is deliberately no "auto-approve", no allow-list of
|
|
20
|
+
* self-evidently safe classes, and no timeout that approves by default.
|
|
21
|
+
*
|
|
22
|
+
* TWO EXISTING PRIMITIVES ARE REUSED RATHER THAN RE-INVENTED:
|
|
23
|
+
* - `renderReport` is "the existing symptom format" the step names.
|
|
24
|
+
* - `egressBlockedReason` is the audited privacy floor — the same one the
|
|
25
|
+
* local corpus write and the upstream release already pass through. It
|
|
26
|
+
* REFUSES rather than rewriting, which is the property that makes it a gate;
|
|
27
|
+
* a module that silently scrubbed and shipped would be a soft gate wearing
|
|
28
|
+
* a hard gate's name.
|
|
29
|
+
*
|
|
30
|
+
* WHAT THIS MODULE DOES NOT DO: send anything. Transport and sink-side storage
|
|
31
|
+
* are Phase 5 step 5.3, transferred with `sink-choice` — no sink exists for an
|
|
32
|
+
* approved case to travel to. `ClassBRecord` is therefore built, gated and
|
|
33
|
+
* held; the field that carries the text is `case_text` and it is a typed
|
|
34
|
+
* member of a typed record, never a string interpolated into a prompt.
|
|
35
|
+
*/
|
|
36
|
+
import * as crypto from 'node:crypto';
|
|
37
|
+
|
|
38
|
+
import {
|
|
39
|
+
type DefectRecord,
|
|
40
|
+
egressBlockedReason,
|
|
41
|
+
renderReport,
|
|
42
|
+
} from './self_repair.js';
|
|
43
|
+
|
|
44
|
+
/** Schema version for the Class-B envelope, independent of Class A. */
|
|
45
|
+
export const CLASS_B_SCHEMA_VERSION = 1;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* One approved case.
|
|
49
|
+
*
|
|
50
|
+
* `case_text` is the ONLY free-form member and it exists on purpose: Class B
|
|
51
|
+
* is defined as an abstracted case, so a Class-B record without text would be
|
|
52
|
+
* a Class-A record. The controls are that it is (a) a named, typed field
|
|
53
|
+
* rather than an open `payload`, (b) present only after `approve` matched a
|
|
54
|
+
* digest a human read, and (c) documented as data end to end — see
|
|
55
|
+
* `assertNeverInterpolated`.
|
|
56
|
+
*/
|
|
57
|
+
export interface ClassBRecord {
|
|
58
|
+
schema_version: number;
|
|
59
|
+
record_class: 'case';
|
|
60
|
+
/** Detector / intake class, from the pinned vocabulary. */
|
|
61
|
+
defect_class: string;
|
|
62
|
+
/** Fingerprint of the local record this case abstracts. */
|
|
63
|
+
fingerprint: string;
|
|
64
|
+
/** SHA-256 of `case_text`, so a consumer can verify what was approved. */
|
|
65
|
+
case_digest: string;
|
|
66
|
+
/** The abstracted case, exactly as the human approved it. */
|
|
67
|
+
case_text: string;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export type ClassBRefusal =
|
|
71
|
+
| { ok: false; reason: string; kind: 'privacy-floor' | 'digest-mismatch' | 'empty' };
|
|
72
|
+
|
|
73
|
+
export type ClassBResult = { ok: true; record: ClassBRecord } | ClassBRefusal;
|
|
74
|
+
|
|
75
|
+
/** SHA-256 hex of the exact bytes a human is asked to approve. */
|
|
76
|
+
export function caseDigest(text: string): string {
|
|
77
|
+
return crypto.createHash('sha256').update(text, 'utf-8').digest('hex');
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Render the exact outbound text for one record, or refuse.
|
|
82
|
+
*
|
|
83
|
+
* Refusal comes from the audited privacy floor and is returned as a reason
|
|
84
|
+
* string for the caller to show. It is NOT downgraded to a scrub-and-continue:
|
|
85
|
+
* a record whose evidence trips the floor stays local, which is the same
|
|
86
|
+
* verdict the upstream release path already reaches.
|
|
87
|
+
*/
|
|
88
|
+
export function renderCase(
|
|
89
|
+
record: DefectRecord,
|
|
90
|
+
repoRoot?: string | null,
|
|
91
|
+
): { ok: true; text: string; digest: string } | ClassBRefusal {
|
|
92
|
+
const blocked = egressBlockedReason(record, repoRoot ?? null);
|
|
93
|
+
if (blocked !== null) {
|
|
94
|
+
return { ok: false, reason: blocked, kind: 'privacy-floor' };
|
|
95
|
+
}
|
|
96
|
+
// `issue` is the route whose rendering carries no patch and no repository
|
|
97
|
+
// path — the narrowest of the existing shapes, and the right one for a
|
|
98
|
+
// case that travels to a telemetry sink rather than to a code host.
|
|
99
|
+
const text = renderReport(record, 'issue');
|
|
100
|
+
if (text.trim() === '') {
|
|
101
|
+
return { ok: false, reason: 'nothing to send', kind: 'empty' };
|
|
102
|
+
}
|
|
103
|
+
return { ok: true, text, digest: caseDigest(text) };
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Approve one rendered case for release.
|
|
108
|
+
*
|
|
109
|
+
* `approved_digest` is what the human saw. If the text has changed since —
|
|
110
|
+
* a new occurrence folded in, a re-render, anything — the digests differ and
|
|
111
|
+
* this refuses. That is the difference between approving a case and approving
|
|
112
|
+
* a category.
|
|
113
|
+
*/
|
|
114
|
+
export function approve(
|
|
115
|
+
record: DefectRecord,
|
|
116
|
+
text: string,
|
|
117
|
+
approved_digest: string,
|
|
118
|
+
): ClassBResult {
|
|
119
|
+
const actual = caseDigest(text);
|
|
120
|
+
if (actual !== approved_digest) {
|
|
121
|
+
return {
|
|
122
|
+
ok: false,
|
|
123
|
+
kind: 'digest-mismatch',
|
|
124
|
+
reason:
|
|
125
|
+
'the approved text is not the text that would be sent — '
|
|
126
|
+
+ 're-render, read it again, and approve the new digest',
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
ok: true,
|
|
131
|
+
record: {
|
|
132
|
+
schema_version: CLASS_B_SCHEMA_VERSION,
|
|
133
|
+
record_class: 'case',
|
|
134
|
+
defect_class: record.defect_class,
|
|
135
|
+
fingerprint: record.fingerprint,
|
|
136
|
+
case_digest: actual,
|
|
137
|
+
case_text: text,
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Serialise an approved case as ONE JSON object.
|
|
144
|
+
*
|
|
145
|
+
* This is the whole of "quoted, typed data" (step 5.3's repository-side half):
|
|
146
|
+
* the text is a JSON string value, so a downstream reader parses it into a
|
|
147
|
+
* field. Nothing here concatenates it into a sentence, a prompt, or a shell
|
|
148
|
+
* argument, and rank 2 of the risk register — a crafted complaint steering a
|
|
149
|
+
* generated change — is what that discipline is for.
|
|
150
|
+
*/
|
|
151
|
+
export function serialiseCase(record: ClassBRecord): string {
|
|
152
|
+
return JSON.stringify(record);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Guard for a downstream consumer: refuse a prompt-shaped use of case text.
|
|
157
|
+
*
|
|
158
|
+
* Deliberately a narrow, honest tool. It cannot stop a caller that never asks;
|
|
159
|
+
* what it does is give the generation step in Phase 6 something to call, so
|
|
160
|
+
* "reads taxonomy fields only, never Class-B free text" is a check rather than
|
|
161
|
+
* a convention. The intended use is at the boundary where a record becomes
|
|
162
|
+
* model input.
|
|
163
|
+
*/
|
|
164
|
+
export function assertNeverInterpolated(candidate: string, record: ClassBRecord): void {
|
|
165
|
+
if (record.case_text !== '' && candidate.includes(record.case_text)) {
|
|
166
|
+
throw new Error(
|
|
167
|
+
'Class-B case text must reach a model as quoted data, never as part '
|
|
168
|
+
+ 'of an instruction string — pass the record, not a concatenation',
|
|
169
|
+
);
|
|
170
|
+
}
|
|
171
|
+
}
|