@event4u/agent-config 14.18.0 → 14.19.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/.augment-plugin/marketplace.json +3 -3
- package/.augment-plugin/plugin.json +1 -1
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +169 -130
- package/README.md +71 -149
- package/dist/agent-src/README.md +1 -1
- package/dist/agent-src/commands/agent-handoff.md +2 -2
- package/dist/agent-src/commands/review/changes.md +19 -19
- package/dist/agent-src/commands/review.md +2 -2
- package/dist/agent-src/contexts/execution/host-capability-manifest.md +30 -3
- package/dist/agent-src/rules/autonomous-execution.md +1 -1
- package/dist/agent-src/rules/git-history-discipline.md +2 -2
- package/dist/agent-src/rules/guidelines.md +1 -1
- package/dist/agent-src/rules/session-canary.md +2 -2
- package/dist/agent-src/rules/token-efficiency.md +1 -1
- package/dist/agent-src/skills/adversarial-review/SKILL.md +0 -8
- package/dist/agent-src/skills/canvas-design/SKILL.md +1 -1
- package/dist/agent-src/skills/design-intelligence/SKILL.md +1 -1
- package/dist/agent-src/skills/design-intelligence/data/app-interface.csv +1 -1
- package/dist/agent-src/skills/design-intelligence/data/motion.csv +17 -17
- package/dist/agent-src/skills/design-intelligence/data/ux-guidelines.csv +2 -2
- package/dist/agent-src/skills/design-intelligence/references/context-and-registers.md +17 -0
- package/dist/agent-src/skills/design-intelligence/references/design-rules-checklist.md +4 -4
- package/dist/agent-src/skills/design-review/SKILL.md +1 -1
- package/dist/agent-src/skills/design-variations/SKILL.md +1 -1
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +1 -1
- package/dist/agent-src/skills/fe-design/SKILL.md +32 -5
- package/dist/agent-src/skills/fe-design/references/craft-floor.md +7 -0
- package/dist/agent-src/skills/fe-design/references/design-patterns.md +47 -2
- package/dist/agent-src/skills/laravel-scheduling/SKILL.md +3 -1
- package/dist/agent-src/skills/project-analyzer/SKILL.md +0 -6
- package/dist/agent-src/skills/react-native-setup/SKILL.md +3 -3
- package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +1 -1
- package/dist/agent-src/skills/sequential-thinking/SKILL.md +18 -8
- package/dist/agent-src/skills/tailwind-engineer/SKILL.md +1 -1
- package/dist/agent-src/skills/ui-apply-generic/SKILL.md +1 -1
- package/dist/agent-src/skills/ui-component-architect/SKILL.md +1 -1
- package/dist/agent-src/skills/using-git-worktrees/SKILL.md +17 -2
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/cli/commands/recordTriggerEval.js +2 -2
- package/dist/cli/main.js +1 -1
- package/dist/cli-delegate/{chunk-AKJGUQNO.js → chunk-GZTMRYCN.js} +405 -341
- package/dist/cli-delegate/{chunk-7RXIKF62.js → chunk-IDHUQIXP.js} +283 -132
- package/dist/cli-delegate/cmd_adr_effective.js +318 -81
- package/dist/cli-delegate/cmd_conformance.js +420 -16
- package/dist/cli-delegate/cmd_doctor.js +1 -1
- package/dist/cli-delegate/cmd_export.js +1 -1
- package/dist/cli-delegate/cmd_handoff.js +1 -1
- package/dist/cli-delegate/cmd_prune.js +1 -1
- package/dist/cli-delegate/cmd_route_audit.js +1 -1
- package/dist/cli-delegate/cmd_settings_migrate.js +1 -1
- package/dist/cli-delegate/cmd_sync.js +1 -1
- package/dist/cli-delegate/cmd_uninstall.js +1 -1
- package/dist/cli-delegate/cmd_validate.js +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +28 -27
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +1 -1
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +2 -2
- package/dist/discovery/trust-report.md +1 -1
- package/dist/discovery/workspaces.json +2 -2
- package/dist/hooks/dispatch.js +2132 -1462
- package/dist/install/install.mjs +588 -527
- package/dist/mcp/registry-manifest.json +1 -1
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +1619 -1045
- package/dist/scripts/_lib/model_tier.js +1 -1
- package/docs/guidelines/agent-infra/evaluator-independence-mechanics.md +1 -1
- package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
- package/docs/guidelines/design-antipatterns.md +87 -64
- package/package.json +1 -1
- package/src/agent-src/README.md +1 -1
- package/src/config/ci-local-parity.yml +6 -0
- package/src/config/gate-coverage.yml +170 -0
- package/src/config/gate-violation-baselines.json +3 -3
- package/src/config/release-gate-locality.yml +12 -0
- package/src/scripts/_cli/cmd_doctor.ts +2 -2
- package/src/scripts/_cli/cmd_handoff.ts +1 -1
- package/src/scripts/_cli/cmd_update.ts +1 -1
- package/src/scripts/_cli/cmd_versions.ts +1 -1
- package/src/scripts/_lib/adr_frontmatter.ts +44 -0
- package/src/scripts/_lib/consequence_objects.ts +152 -0
- package/src/scripts/_lib/exec_evidence.ts +7 -0
- package/src/scripts/_lib/global_deploy_inventory.ts +2 -2
- package/src/scripts/_lib/host_permission_checks.ts +251 -0
- package/src/scripts/_lib/model_tier.ts +1 -1
- package/src/scripts/_lib/obligation_frequency.ts +2 -2
- package/src/scripts/_lib/release_highlights.ts +93 -0
- package/src/scripts/_lib/release_material.ts +64 -1
- package/src/scripts/_lib/runtime_journal.ts +26 -3
- package/src/scripts/_lib/runtime_wiring_checks.ts +12 -1
- package/src/scripts/_lib/session_register.ts +11 -6
- package/src/scripts/_lib/sqlite_schema.ts +22 -0
- package/src/scripts/_lib/surface.ts +86 -0
- package/src/scripts/_lib/ui_authority.ts +116 -0
- package/src/scripts/adr/regenerate_index.ts +54 -1
- package/src/scripts/adr_cite_check.ts +71 -15
- package/src/scripts/ai_council/clients.ts +1 -1
- package/src/scripts/autonomy_friction_corpus.ts +229 -0
- package/src/scripts/build_proof.ts +15 -2
- package/src/scripts/check_beta_review_markers.ts +141 -17
- package/src/scripts/check_enforcement_coverage.ts +1 -1
- package/src/scripts/check_enforcement_denominator.ts +121 -11
- package/src/scripts/check_finding_dispositions.ts +66 -9
- package/src/scripts/check_gate_coverage.ts +96 -0
- package/src/scripts/check_release_highlights.ts +74 -1
- package/src/scripts/check_skill_activation_claim.ts +179 -0
- package/src/scripts/check_trigger_evals.ts +1 -1
- package/src/scripts/conformance_scan.ts +44 -3
- package/src/scripts/explain_run.ts +1 -1
- package/src/scripts/generate_capability_matrix.ts +1 -1
- package/src/scripts/git_authorization_hook.ts +75 -1
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +14 -11
- package/src/scripts/hooks/augment-dispatcher.sh +1 -1
- package/src/scripts/hooks/category_a.ts +291 -0
- package/src/scripts/hooks/cline-dispatcher.sh +1 -1
- package/src/scripts/hooks/cursor-dispatcher.sh +11 -5
- package/src/scripts/hooks/dispatch_hook.ts +17 -22
- package/src/scripts/hooks/git_command_classifier.ts +156 -1
- package/src/scripts/hooks/host_lowering.ts +215 -0
- package/src/scripts/hooks/host_lowering.yaml +185 -0
- package/src/scripts/hooks/host_semantics.ts +105 -37
- package/src/scripts/hooks/journal_record_hook.ts +10 -0
- package/src/scripts/hooks/permission_gate.ts +117 -0
- package/src/scripts/hooks_status.ts +12 -10
- package/src/scripts/install.ts +53 -82
- package/src/scripts/install_anthropic_key.sh +2 -2
- package/src/scripts/lint_design_antipattern_parity.ts +80 -0
- package/src/scripts/lint_evidence_artifacts.ts +45 -1
- package/src/scripts/lint_hook_manifest.ts +87 -3
- package/src/scripts/lint_motion_authority_drift.ts +731 -0
- package/src/scripts/lint_readme_size.ts +158 -12
- package/src/scripts/lint_reasoning_fixtures.ts +216 -0
- package/src/scripts/lint_skill_trigger_contradiction.ts +161 -0
- package/src/scripts/measure_sibling_naming.ts +150 -0
- package/src/scripts/redact_hook_capture.ts +1 -1
- package/src/scripts/report_skill_activation.ts +319 -7
- package/src/scripts/schemas/review-findings.schema.json +5 -0
- package/src/scripts/schemas/skill.schema.json +2 -2
- package/src/scripts/session_canary_hook.ts +1 -1
- package/src/scripts/session_register_hook.ts +4 -3
- package/src/scripts/trigger_eval_grandfather.json +5 -1
- package/src/scripts/validate_agent_settings.ts +1 -1
|
@@ -16,6 +16,9 @@ import {
|
|
|
16
16
|
import {
|
|
17
17
|
readHookStdin
|
|
18
18
|
} from "./chunk-F7DQWYR5.js";
|
|
19
|
+
import {
|
|
20
|
+
reportScanned
|
|
21
|
+
} from "./chunk-I3EIN2YG.js";
|
|
19
22
|
import {
|
|
20
23
|
ArgparseExit,
|
|
21
24
|
STATUS_SYMBOLS,
|
|
@@ -33,7 +36,7 @@ import {
|
|
|
33
36
|
frontmatterPaths,
|
|
34
37
|
proseEqual,
|
|
35
38
|
splitFrontmatter
|
|
36
|
-
} from "./chunk-
|
|
39
|
+
} from "./chunk-IDHUQIXP.js";
|
|
37
40
|
import "./chunk-FTAISGDQ.js";
|
|
38
41
|
import "./chunk-M2DPGFZ4.js";
|
|
39
42
|
import "./chunk-BTWUYDGN.js";
|
|
@@ -739,6 +742,128 @@ function humanTypedThisTurn(prompt) {
|
|
|
739
742
|
return true;
|
|
740
743
|
}
|
|
741
744
|
|
|
745
|
+
// src/scripts/_lib/consequence_objects.ts
|
|
746
|
+
var CONSEQUENCE_PHRASES = [
|
|
747
|
+
{
|
|
748
|
+
op: "prod-deploy",
|
|
749
|
+
re: /(?<![A-Za-z0-9_À-ɏ])(deploy(e|en|t|st)?|ausroll(e|en)?|ship(pe|pen)?|live\s*schalt(e|en)?|rollout)\b[^.\n]{0,30}\b(produktion|production|prod|live|prod-umgebung)\b|\b(produktion|production|prod|live)\b[^.\n]{0,30}\b(deploy(e|en)?|ausrollen|ausroll(e|en)?|live\s*schalten|rollout)\b/i
|
|
750
|
+
},
|
|
751
|
+
{
|
|
752
|
+
op: "prod-data-destroy",
|
|
753
|
+
re: /(?<![A-Za-z0-9_À-ɏ])(l(ö|oe)sch(e|en)?|entfern(e|en)?|leer(e|en)?|verwerf(e|en)?|drop|truncate|delete|wipe|purge|zerst(ö|oe)r(e|en)?)\b[^.\n]{0,40}\b(tabelle|tabellen|datenbank|daten|bucket|collection|zeilen|rows|table|database|dataset)\b|\b(tabelle|tabellen|datenbank|daten|bucket|collection|table|database)\b[^.\n]{0,40}\b(l(ö|oe)schen|leeren|verwerfen|droppen|truncaten|entfernen|drop|truncate|delete|wipe|purge)\b/i
|
|
754
|
+
},
|
|
755
|
+
{
|
|
756
|
+
op: "prod-infra-change",
|
|
757
|
+
re: /(?<![A-Za-z0-9_À-ɏ])((ver)?(ä|ae)nder(e|n)?|anpass(e|en)?|umbau(e|en)?|apply|destroy|(neu\s*)?provisionier(e|en)?)\b[^.\n]{0,40}\b(infrastruktur|infrastructure|cluster|terraform|iam|dns|netzwerk|network|firewall|policy|policies|security[-\s]group)\b|\b(infrastruktur|infrastructure|cluster|terraform|iam|dns|netzwerk|firewall)\b[^.\n]{0,40}\b((ver)?(ä|ae)ndern|anpassen|umbauen|zerst(ö|oe)ren|apply|destroy)\b/i
|
|
758
|
+
},
|
|
759
|
+
{
|
|
760
|
+
op: "external-send",
|
|
761
|
+
re: /(?<![A-Za-z0-9_À-ɏ])(schick(e|en)?|verschick(e|en)?|send(e|en|et)?|mail(e|en)?|raussend(e|en)?|versend(e|en)?|post|publish)\b[^.\n]{0,40}\b(mail|mails|email|e-mail|nachricht|nachrichten|newsletter|webhook|kunden|kundin|kunde|empf(ä|ae)nger|customers?|recipients?|message)\b|\b(mail|email|e-mail|nachricht|newsletter|kunden|customers?)\b[^.\n]{0,40}\b(schicken|verschicken|senden|versenden|rausschicken|send|deliver)\b/i
|
|
762
|
+
},
|
|
763
|
+
{
|
|
764
|
+
op: "money-movement",
|
|
765
|
+
re: /(?<![A-Za-z0-9_À-ɏ])(erstatt(e|en)?|r(ü|ue)ckerstatt(e|en)?|zahl(e|en)?|(ü|ue)berweis(e|en)?|abbuch(e|en)?|belast(e|en)?|refund|charge|payout|transfer|bill)\b[^.\n]{0,40}\b(betrag|geld|rechnung|zahlung|euro|dollar|kunde|kunden|karte|konto|invoice|payment|customer|card|account)\b|\b(betrag|geld|rechnung|zahlung|invoice|payment)\b[^.\n]{0,40}\b(erstatten|zur(ü|ue)ckzahlen|(ü|ue)berweisen|abbuchen|belasten|refund|charge|transfer)\b/i
|
|
766
|
+
},
|
|
767
|
+
{
|
|
768
|
+
op: "trunk-force-push",
|
|
769
|
+
re: /(?<![A-Za-z0-9_À-ɏ])(force[-\s]?push(e|en|t)?|force[-\s]?pushen|(ü|ue)berschreib(e|en)?)\b[^.\n]{0,40}\b(main|master|trunk|produktions?[-\s]?branch|production|release[-\s]?branch)\b|\b(main|master|trunk|production)\b[^.\n]{0,40}\b(force[-\s]?pushen|force[-\s]?push|(ü|ue)berschreiben)\b/i
|
|
770
|
+
},
|
|
771
|
+
{
|
|
772
|
+
op: "out-of-scope-destruction",
|
|
773
|
+
re: /(?<![A-Za-z0-9_À-ɏ])(l(ö|oe)sch(e|en)?|entfern(e|en)?|r(ä|ae)um(e|en)?\s*auf|aufr(ä|ae)um(e|en)?|delete|remove|wipe)\b[^.\n]{0,40}\b(au(ß|ss)erhalb|ausserhalb|unabh(ä|ae)ngig|nicht\s+zur\s+aufgabe|outside\s+(the\s+)?(task|scope)|unrelated|everything\s+else|alles\s+andere)\b|\b(au(ß|ss)erhalb|outside\s+(the\s+)?(task|scope)|unrelated)\b[^.\n]{0,40}\b(l(ö|oe)schen|entfernen|aufr(ä|ae)umen|delete|remove|wipe)\b/i
|
|
774
|
+
}
|
|
775
|
+
];
|
|
776
|
+
var OBJECT_REQUIRED_OPS = /* @__PURE__ */ new Set([
|
|
777
|
+
"prod-data-destroy",
|
|
778
|
+
"external-send",
|
|
779
|
+
"money-movement"
|
|
780
|
+
]);
|
|
781
|
+
var OBJECT_STOP_WORDS = /* @__PURE__ */ new Set([
|
|
782
|
+
"bitte",
|
|
783
|
+
"doch",
|
|
784
|
+
"mal",
|
|
785
|
+
"nicht",
|
|
786
|
+
"jetzt",
|
|
787
|
+
"gleich",
|
|
788
|
+
"auch",
|
|
789
|
+
"noch",
|
|
790
|
+
"wieder",
|
|
791
|
+
"in",
|
|
792
|
+
"im",
|
|
793
|
+
"aus",
|
|
794
|
+
"von",
|
|
795
|
+
"vom",
|
|
796
|
+
": ",
|
|
797
|
+
"der",
|
|
798
|
+
"die",
|
|
799
|
+
"das",
|
|
800
|
+
"den",
|
|
801
|
+
"dem",
|
|
802
|
+
"und",
|
|
803
|
+
"oder",
|
|
804
|
+
"mit",
|
|
805
|
+
"auf",
|
|
806
|
+
"zu",
|
|
807
|
+
"komplett",
|
|
808
|
+
"ganz",
|
|
809
|
+
"alle",
|
|
810
|
+
"allen",
|
|
811
|
+
"please",
|
|
812
|
+
"now",
|
|
813
|
+
"again",
|
|
814
|
+
"too",
|
|
815
|
+
"also",
|
|
816
|
+
"from",
|
|
817
|
+
"and",
|
|
818
|
+
"or",
|
|
819
|
+
"the",
|
|
820
|
+
"a",
|
|
821
|
+
"an",
|
|
822
|
+
"there",
|
|
823
|
+
"here",
|
|
824
|
+
"completely",
|
|
825
|
+
"all",
|
|
826
|
+
"with",
|
|
827
|
+
"on",
|
|
828
|
+
"to",
|
|
829
|
+
"in"
|
|
830
|
+
]);
|
|
831
|
+
function _normalizeObject(raw) {
|
|
832
|
+
return raw.trim().replace(/^["'`]+|["'`]+$/g, "").replace(/[.,;:]+$/, "").toLowerCase();
|
|
833
|
+
}
|
|
834
|
+
var OBJECT_PATTERNS = {
|
|
835
|
+
"prod-data-destroy": [
|
|
836
|
+
/\b(?:tabelle|table|datenbank|database|schema|collection|index)\s+["'`]?([A-Za-z_][\w.$-]*)/gi,
|
|
837
|
+
/\bs3:\/\/([\w.-]+)/gi,
|
|
838
|
+
/\b(?:bucket)\s+["'`]?([A-Za-z_][\w.-]*)/gi
|
|
839
|
+
],
|
|
840
|
+
"external-send": [
|
|
841
|
+
/([A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,})/g,
|
|
842
|
+
/\bhttps?:\/\/([^\s/"'`]+)/gi,
|
|
843
|
+
/\b(?:an\s+(?:die|den|alle)|to\s+(?:the|all))\s+([A-Za-z][\w-]*)/gi
|
|
844
|
+
],
|
|
845
|
+
"money-movement": [
|
|
846
|
+
/(\d[\d.,]*)\s*(?:€|eur\b|euro\b|\$|usd\b)/gi,
|
|
847
|
+
/(?:€|\$)\s*(\d[\d.,]*)/g,
|
|
848
|
+
/\b(?:kunde|kunden|customer|account|konto)\s+["'`]?([A-Za-z0-9][\w.-]*)/gi
|
|
849
|
+
]
|
|
850
|
+
};
|
|
851
|
+
function extractObjects(op, text) {
|
|
852
|
+
const patterns = OBJECT_PATTERNS[op];
|
|
853
|
+
if (!patterns) return [];
|
|
854
|
+
const out = [];
|
|
855
|
+
for (const re of patterns) {
|
|
856
|
+
const local = new RegExp(re.source, re.flags.includes("g") ? re.flags : `${re.flags}g`);
|
|
857
|
+
let m;
|
|
858
|
+
while ((m = local.exec(text)) !== null) {
|
|
859
|
+
const value = _normalizeObject(m[1] ?? "");
|
|
860
|
+
if (value && !OBJECT_STOP_WORDS.has(value) && !out.includes(value)) out.push(value);
|
|
861
|
+
if (m.index === local.lastIndex) local.lastIndex++;
|
|
862
|
+
}
|
|
863
|
+
}
|
|
864
|
+
return out;
|
|
865
|
+
}
|
|
866
|
+
|
|
742
867
|
// src/scripts/git_authorization_hook.ts
|
|
743
868
|
var EXIT_ALLOW2 = 0;
|
|
744
869
|
var STATE_FILE2 = path2.join("agents", "state", "git-authorization.json");
|
|
@@ -790,7 +915,14 @@ var ALL_OPS = [
|
|
|
790
915
|
"clean",
|
|
791
916
|
"stash-drop",
|
|
792
917
|
"branch-delete",
|
|
793
|
-
"close"
|
|
918
|
+
"close",
|
|
919
|
+
"prod-deploy",
|
|
920
|
+
"prod-data-destroy",
|
|
921
|
+
"prod-infra-change",
|
|
922
|
+
"external-send",
|
|
923
|
+
"money-movement",
|
|
924
|
+
"trunk-force-push",
|
|
925
|
+
"out-of-scope-destruction"
|
|
794
926
|
];
|
|
795
927
|
var PHRASES = [
|
|
796
928
|
{ op: "commit", re: /\b(commit(e|et|te|ten)?|committe|einchecken)\b/i },
|
|
@@ -948,7 +1080,8 @@ var PHRASES = [
|
|
|
948
1080
|
{
|
|
949
1081
|
op: "pr-merge-auto",
|
|
950
1082
|
re: /\bauto[-\s]?merge\b|\bmerge\b[^.\n]{0,20}\bautomatisch\b|\bautomatisch\b[^.\n]{0,20}\bmerg(e|en)\b/i
|
|
951
|
-
}
|
|
1083
|
+
},
|
|
1084
|
+
...CONSEQUENCE_PHRASES
|
|
952
1085
|
];
|
|
953
1086
|
var OUTPUT_LINE = /^\s*(To\s+\S+|remote:|error:|fatal:|hint:|warning:|!\s|\?\?\s|\s*\^|[-+]{3}\s|@@\s|\$\s|>\s|\d+\s+(pass|fail)|npm ERR!|Error:|Traceback|at\s+\S+:\d+)/i;
|
|
954
1087
|
function isInterrogative(prose) {
|
|
@@ -1317,6 +1450,11 @@ function run2(stdin_text, options) {
|
|
|
1317
1450
|
authorized.push(pending.op);
|
|
1318
1451
|
evidence[pending.op] = `confirmation of the refused \`${pending.op}\` (refused ${pending.refused_at}): "${prompt.trim().slice(0, 40)}"`;
|
|
1319
1452
|
}
|
|
1453
|
+
const objects = {};
|
|
1454
|
+
for (const op of authorized) {
|
|
1455
|
+
const named = extractObjects(op, prompt);
|
|
1456
|
+
if (named.length > 0) objects[op] = named;
|
|
1457
|
+
}
|
|
1320
1458
|
const now = /* @__PURE__ */ new Date();
|
|
1321
1459
|
const ledger = {
|
|
1322
1460
|
session_id: typeof envelope["session_id"] === "string" ? envelope["session_id"] : "",
|
|
@@ -1324,6 +1462,7 @@ function run2(stdin_text, options) {
|
|
|
1324
1462
|
authorized,
|
|
1325
1463
|
evidence,
|
|
1326
1464
|
prompt_chars: prompt.length,
|
|
1465
|
+
objects,
|
|
1327
1466
|
// Grants survive this write; `authorized` does not. That asymmetry IS the
|
|
1328
1467
|
// decision. A bare operation name stays one-shot exactly as `commit-policy`
|
|
1329
1468
|
// requires, and only an authorization that also froze its objects earns a
|
|
@@ -1415,10 +1554,26 @@ var BLOCK_OPS = /* @__PURE__ */ new Set([
|
|
|
1415
1554
|
/** Destroys uncommitted work belonging to a session this one cannot see. */
|
|
1416
1555
|
"worktree-remove",
|
|
1417
1556
|
/** `-x` is the flag that takes `.env` and local certificates. */
|
|
1418
|
-
"clean-ignored"
|
|
1557
|
+
"clean-ignored",
|
|
1558
|
+
// ── The consequence vocabulary, added 2026-09-06. Every one is already
|
|
1559
|
+
// never-autonomous in the `non-destructive-by-default` prose.
|
|
1560
|
+
//
|
|
1561
|
+
// MEMBERSHIP HERE IS A COUNTING DECISION, NOT A REFUSAL. The set's name
|
|
1562
|
+
// predates ADR-254, which deleted the reader that blocked: the one consumer
|
|
1563
|
+
// that acts on it now is `conformance_scan`'s after-the-fact tally, so
|
|
1564
|
+
// "blocked" describes what the Hard Floor requires of the model, never what
|
|
1565
|
+
// this package does at tool-call time.
|
|
1566
|
+
"prod-deploy",
|
|
1567
|
+
"prod-data-destroy",
|
|
1568
|
+
"prod-infra-change",
|
|
1569
|
+
"external-send",
|
|
1570
|
+
"money-movement",
|
|
1571
|
+
"trunk-force-push",
|
|
1572
|
+
"out-of-scope-destruction"
|
|
1419
1573
|
]);
|
|
1420
1574
|
var G = "(?:-[A-Za-z-]+(?:=\\S+)?(?:\\s+\\S+)?\\s+)*";
|
|
1421
1575
|
var P = "^(?:\\S*\\/)?";
|
|
1576
|
+
var CONSEQUENCE_TOOL_HEAD = /^(?:\S*\/)?(terraform|pulumi|kubectl|helm|aws|gcloud|az|vercel|netlify|flyctl|fly|wrangler|serverless|sls|eb|heroku|cap|psql|mysql|mariadb|sqlite3|mongosh|mongo|redis-cli|sendmail|msmtp|mail|mailx|curl|stripe|braintree|paypal|rm)\b/i;
|
|
1422
1577
|
function ghApiWrite(pathRe) {
|
|
1423
1578
|
return new RegExp(
|
|
1424
1579
|
`${P}gh\\s+api\\b(?=[^\\n]*${pathRe})(?=[^\\n]*(?:-X|--method)\\s+(?:POST|PATCH|PUT|DELETE)\\b)`,
|
|
@@ -1499,6 +1654,13 @@ var COMMAND_OPS = [
|
|
|
1499
1654
|
// Above `push`, and both spellings: `--force` and `--force-with-lease`. The
|
|
1500
1655
|
// "safe force" is in the same class here because what it is safe against is a
|
|
1501
1656
|
// stale local view, not a collaborator who pushed after your fetch.
|
|
1657
|
+
{
|
|
1658
|
+
op: "trunk-force-push",
|
|
1659
|
+
re: new RegExp(
|
|
1660
|
+
`${P}git\\s+${G}push\\b[^\\n;|&]*(--force\\b|--force-with-lease\\b|\\s-f\\b)[^\\n;|&]*\\b(main|master|trunk|production|prod)\\b`,
|
|
1661
|
+
"i"
|
|
1662
|
+
)
|
|
1663
|
+
},
|
|
1502
1664
|
{
|
|
1503
1665
|
op: "force-push",
|
|
1504
1666
|
re: new RegExp(`${P}git\\s+${G}push\\b[^\\n;|&]*(--force\\b|--force-with-lease\\b|\\s-f\\b)`, "i")
|
|
@@ -1527,6 +1689,60 @@ var COMMAND_OPS = [
|
|
|
1527
1689
|
)
|
|
1528
1690
|
},
|
|
1529
1691
|
{ op: "close", re: new RegExp(`${P}gh\\s+(pr|issue)\\s+close\\b`, "i") },
|
|
1692
|
+
// ── Consequence operations, added 2026-09-06
|
|
1693
|
+
// (`road-to-authorization-that-reaches-further` 2.1).
|
|
1694
|
+
//
|
|
1695
|
+
// ORDER: above the generic `push`/`commit` fallbacks, because
|
|
1696
|
+
// `trunk-force-push` is a `git push` and the most specific pattern must win —
|
|
1697
|
+
// the rule this table states at its head.
|
|
1698
|
+
//
|
|
1699
|
+
// These classify commands the count could not see before. They add NOTHING to
|
|
1700
|
+
// any refusal path: `commandOp` and `BLOCK_OPS` have exactly one consumer
|
|
1701
|
+
// that acts on them, the after-the-fact tally in `conformance_scan`, and this
|
|
1702
|
+
// change does not add a second.
|
|
1703
|
+
{
|
|
1704
|
+
op: "prod-data-destroy",
|
|
1705
|
+
re: new RegExp(
|
|
1706
|
+
`${P}(psql|mysql|mariadb|sqlite3|mongosh?)\\b[^\\n]*\\b(drop\\s+(table|database|schema)|truncate|delete\\s+from)\\b|${P}aws\\s+s3\\s+(rm|rb)\\b|${P}aws\\s+(dynamodb|rds)\\s+delete-\\S+|${P}redis-cli\\b[^\\n]*\\bflush(all|db)\\b`,
|
|
1707
|
+
"i"
|
|
1708
|
+
)
|
|
1709
|
+
},
|
|
1710
|
+
{
|
|
1711
|
+
op: "prod-infra-change",
|
|
1712
|
+
re: new RegExp(
|
|
1713
|
+
`${P}terraform\\s+(apply|destroy)\\b|${P}pulumi\\s+(up|destroy)\\b|${P}kubectl\\s+(apply|delete|scale|drain)\\b|${P}helm\\s+(install|upgrade|uninstall|rollback)\\b|${P}aws\\s+(iam|ec2|route53|elbv2)\\s+(create|delete|put|update|modify|attach|detach)-\\S+|${P}(gcloud|az)\\s+\\S+\\s+(create|delete|update)\\b`,
|
|
1714
|
+
"i"
|
|
1715
|
+
)
|
|
1716
|
+
},
|
|
1717
|
+
{
|
|
1718
|
+
op: "prod-deploy",
|
|
1719
|
+
re: new RegExp(
|
|
1720
|
+
`${P}(vercel|netlify|flyctl|fly|wrangler|serverless|sls|eb|heroku)\\s+${G}deploy\\b|${P}(vercel|netlify)\\b[^\\n]*--prod\\b|${P}(npm|pnpm|yarn)\\s+run\\s+deploy\\b|${P}cap\\s+production\\s+deploy\\b`,
|
|
1721
|
+
"i"
|
|
1722
|
+
)
|
|
1723
|
+
},
|
|
1724
|
+
{
|
|
1725
|
+
op: "external-send",
|
|
1726
|
+
re: new RegExp(
|
|
1727
|
+
`${P}(sendmail|msmtp|mailx?)\\b|${P}curl\\b(?=[^\\n]*(?:-X|--request)\\s+(?:POST|PUT|PATCH)\\b)(?=[^\\n]*https?:\\/\\/)`,
|
|
1728
|
+
"i"
|
|
1729
|
+
)
|
|
1730
|
+
},
|
|
1731
|
+
{
|
|
1732
|
+
op: "money-movement",
|
|
1733
|
+
re: new RegExp(
|
|
1734
|
+
`${P}(stripe|braintree|paypal)\\s+\\S*(charge|refund|payout|transfer|payment)\\S*\\b`,
|
|
1735
|
+
"i"
|
|
1736
|
+
)
|
|
1737
|
+
},
|
|
1738
|
+
{
|
|
1739
|
+
// `rm -rf` on an ABSOLUTE path or a home-relative one. Deliberately not
|
|
1740
|
+
// "outside the working tree" — this function receives a command string and
|
|
1741
|
+
// no cwd, so that reading is not decidable here and a classifier that
|
|
1742
|
+
// guesses is worse than one that under-reports.
|
|
1743
|
+
op: "out-of-scope-destruction",
|
|
1744
|
+
re: new RegExp(`${P}rm\\s+(-\\S+\\s+)*-\\S*[rR]\\S*\\s+(-\\S+\\s+)*(~|/)\\S*`, "i")
|
|
1745
|
+
},
|
|
1530
1746
|
{ op: "push", re: new RegExp(`${P}git\\s+${G}push\\b`, "i") },
|
|
1531
1747
|
{ op: "commit", re: new RegExp(`${P}git\\s+${G}commit\\b`, "i") },
|
|
1532
1748
|
{ op: "branch", re: new RegExp(`${P}git\\s+${G}(checkout\\s+-b|switch\\s+-c)\\b`, "i") }
|
|
@@ -1677,7 +1893,7 @@ function invokedSegments(command, depth = 0) {
|
|
|
1677
1893
|
function commandOp(command) {
|
|
1678
1894
|
let found = null;
|
|
1679
1895
|
for (const seg of invokedSegments(command)) {
|
|
1680
|
-
if (!/^(?:\S*\/)?(git|gh|npm|pnpm|yarn)\b/.test(seg)) {
|
|
1896
|
+
if (!/^(?:\S*\/)?(git|gh|npm|pnpm|yarn)\b/.test(seg) && !CONSEQUENCE_TOOL_HEAD.test(seg)) {
|
|
1681
1897
|
continue;
|
|
1682
1898
|
}
|
|
1683
1899
|
for (const { op, re } of COMMAND_OPS) {
|
|
@@ -1692,6 +1908,37 @@ function commandOp(command) {
|
|
|
1692
1908
|
}
|
|
1693
1909
|
return found;
|
|
1694
1910
|
}
|
|
1911
|
+
function commandObject(op, command) {
|
|
1912
|
+
const patterns = COMMAND_OBJECTS[op];
|
|
1913
|
+
if (!patterns) return null;
|
|
1914
|
+
for (const re of patterns) {
|
|
1915
|
+
const m = new RegExp(re.source, re.flags.replace("g", "")).exec(command);
|
|
1916
|
+
const raw = m?.[1];
|
|
1917
|
+
if (raw) {
|
|
1918
|
+
const value = raw.trim().replace(/^["'`]+|["'`]+$/g, "").replace(/[.,;:]+$/, "").toLowerCase();
|
|
1919
|
+
if (value) return value;
|
|
1920
|
+
}
|
|
1921
|
+
}
|
|
1922
|
+
return null;
|
|
1923
|
+
}
|
|
1924
|
+
var COMMAND_OBJECTS = {
|
|
1925
|
+
"prod-data-destroy": [
|
|
1926
|
+
/\bdrop\s+(?:table|database|schema|collection)\s+(?:if\s+exists\s+)?["'`]?([\w.$-]+)/i,
|
|
1927
|
+
/\btruncate\s+(?:table\s+)?["'`]?([\w.$-]+)/i,
|
|
1928
|
+
/\bdelete\s+from\s+["'`]?([\w.$-]+)/i,
|
|
1929
|
+
/\bs3:\/\/([\w.-]+)/i,
|
|
1930
|
+
/--table-name[= ]["'`]?([\w.-]+)/i
|
|
1931
|
+
],
|
|
1932
|
+
"external-send": [
|
|
1933
|
+
/\bhttps?:\/\/([^\s/"'`]+)/i,
|
|
1934
|
+
/([A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,})/
|
|
1935
|
+
],
|
|
1936
|
+
"money-movement": [
|
|
1937
|
+
/--customer[= ]["'`]?([\w.-]+)/i,
|
|
1938
|
+
/--amount[= ]["'`]?([\d.,]+)/i,
|
|
1939
|
+
/\b(\d[\d.,]*)\s*(?:eur|usd)\b/i
|
|
1940
|
+
]
|
|
1941
|
+
};
|
|
1695
1942
|
|
|
1696
1943
|
// src/scripts/hooks/turn_end_gate_hook.ts
|
|
1697
1944
|
import * as fs5 from "node:fs";
|
|
@@ -3914,6 +4161,7 @@ function scanSession(sessionId, lines) {
|
|
|
3914
4161
|
let pinned = null;
|
|
3915
4162
|
let pendingPoll = null;
|
|
3916
4163
|
let authorized = /* @__PURE__ */ new Set();
|
|
4164
|
+
let authorizedObjects = /* @__PURE__ */ new Map();
|
|
3917
4165
|
let sawPending = false;
|
|
3918
4166
|
let evaluationsThisTurn = 0;
|
|
3919
4167
|
let turnsSincePrompt = 0;
|
|
@@ -4007,7 +4255,11 @@ function scanSession(sessionId, lines) {
|
|
|
4007
4255
|
if (c.language !== "und") {
|
|
4008
4256
|
pinned = c.language;
|
|
4009
4257
|
}
|
|
4010
|
-
|
|
4258
|
+
const classified = classifyAuthorization(ut);
|
|
4259
|
+
authorized = new Set(classified.authorized);
|
|
4260
|
+
authorizedObjects = new Map(
|
|
4261
|
+
classified.authorized.map((op) => [op, new Set(extractObjects(op, ut))])
|
|
4262
|
+
);
|
|
4011
4263
|
sawPending = false;
|
|
4012
4264
|
evaluationsThisTurn = 0;
|
|
4013
4265
|
pendingPoll = null;
|
|
@@ -4073,6 +4325,17 @@ function scanSession(sessionId, lines) {
|
|
|
4073
4325
|
at,
|
|
4074
4326
|
detail: `irreversible \`${op}\` with no authorization in the turn's prompt: ${cmd.slice(0, 110)}`
|
|
4075
4327
|
});
|
|
4328
|
+
} else if (op !== null && authorized.has(op) && OBJECT_REQUIRED_OPS.has(op)) {
|
|
4329
|
+
const object = commandObject(op, cmd);
|
|
4330
|
+
const named = authorizedObjects.get(op);
|
|
4331
|
+
if (object !== null && !(named?.has(object) ?? false)) {
|
|
4332
|
+
report.violations.push({
|
|
4333
|
+
check: "git-authorization",
|
|
4334
|
+
session: sessionId,
|
|
4335
|
+
at,
|
|
4336
|
+
detail: `\`${op}\` authorized, but its object \`${object}\` is not one the turn's prompt named (${named && named.size > 0 ? [...named].join(", ") : "no object named"}): ` + cmd.slice(0, 110)
|
|
4337
|
+
});
|
|
4338
|
+
}
|
|
4076
4339
|
}
|
|
4077
4340
|
if (isCiPoll(cmd)) {
|
|
4078
4341
|
pendingPoll = { at, cmd };
|
|
@@ -4675,7 +4938,12 @@ var SKILLS_ROOT = "src/skills";
|
|
|
4675
4938
|
var TRIGGER_KEYS = ["triggers:", "trigger_description:", "file_pattern:", "path_prefix:"];
|
|
4676
4939
|
var DETERMINISTIC_RE = /^\s*(?:[-*]\s*)?(?:\*\*)?(MUST|NEVER|ALWAYS)\b/m;
|
|
4677
4940
|
function censusSkills(root) {
|
|
4678
|
-
const out = {
|
|
4941
|
+
const out = {
|
|
4942
|
+
total: 0,
|
|
4943
|
+
withTriggerKey: [],
|
|
4944
|
+
withTriggerCorpus: [],
|
|
4945
|
+
withDeterministicObligation: []
|
|
4946
|
+
};
|
|
4679
4947
|
if (!fs10.existsSync(root)) {
|
|
4680
4948
|
return out;
|
|
4681
4949
|
}
|
|
@@ -4694,6 +4962,9 @@ function censusSkills(root) {
|
|
|
4694
4962
|
if (TRIGGER_KEYS.some((k) => new RegExp(`^${k}`, "m").test(fm))) {
|
|
4695
4963
|
out.withTriggerKey.push(entry.name);
|
|
4696
4964
|
}
|
|
4965
|
+
if (fs10.existsSync(path10.join(root, entry.name, "evals", "triggers.json"))) {
|
|
4966
|
+
out.withTriggerCorpus.push(entry.name);
|
|
4967
|
+
}
|
|
4697
4968
|
const body = fmEnd === -1 ? text : text.slice(fmEnd + 4);
|
|
4698
4969
|
if (DETERMINISTIC_RE.test(body)) {
|
|
4699
4970
|
out.withDeterministicObligation.push(entry.name);
|
|
@@ -4752,7 +5023,50 @@ function measureUsage(store, limit) {
|
|
|
4752
5023
|
function _pct(n, d) {
|
|
4753
5024
|
return d === 0 ? "n/a" : `${(100 * n / d).toFixed(1)}%`;
|
|
4754
5025
|
}
|
|
4755
|
-
|
|
5026
|
+
var RECORD_PATH = "agents/evidence/metrics/skill-activation-census.json";
|
|
5027
|
+
function populations(census) {
|
|
5028
|
+
const corpus = new Set(census.withTriggerCorpus);
|
|
5029
|
+
const both = census.withTriggerKey.filter((s) => corpus.has(s));
|
|
5030
|
+
const eitherOne = /* @__PURE__ */ new Set([...census.withTriggerKey, ...census.withTriggerCorpus]);
|
|
5031
|
+
return {
|
|
5032
|
+
shipped: census.total,
|
|
5033
|
+
triggerKey: census.withTriggerKey.length,
|
|
5034
|
+
triggerCorpus: census.withTriggerCorpus.length,
|
|
5035
|
+
bothKeyAndCorpus: both.length,
|
|
5036
|
+
humanNamedOnly: census.total - eitherOne.size
|
|
5037
|
+
};
|
|
5038
|
+
}
|
|
5039
|
+
function buildRecord(census, usage, today) {
|
|
5040
|
+
const pop = populations(census);
|
|
5041
|
+
const distinct = /* @__PURE__ */ new Set();
|
|
5042
|
+
for (const u of usage) {
|
|
5043
|
+
for (const k of Object.keys(u.bySkill)) {
|
|
5044
|
+
distinct.add(k);
|
|
5045
|
+
}
|
|
5046
|
+
}
|
|
5047
|
+
return {
|
|
5048
|
+
schema_version: 1,
|
|
5049
|
+
measured_at: today,
|
|
5050
|
+
skills_shipped: pop.shipped,
|
|
5051
|
+
with_trigger_key: pop.triggerKey,
|
|
5052
|
+
with_trigger_corpus: pop.triggerCorpus,
|
|
5053
|
+
trigger_key_and_corpus: pop.bothKeyAndCorpus,
|
|
5054
|
+
human_named_only: pop.humanNamedOnly,
|
|
5055
|
+
sessions: usage.reduce((a, u) => a + u.sessions, 0),
|
|
5056
|
+
assistant_turns: usage.reduce((a, u) => a + u.assistantTurns, 0),
|
|
5057
|
+
invocations: usage.reduce((a, u) => a + u.invocations, 0),
|
|
5058
|
+
distinct_skills_invoked: distinct.size,
|
|
5059
|
+
stores: usage.map((u) => path10.basename(u.store))
|
|
5060
|
+
};
|
|
5061
|
+
}
|
|
5062
|
+
function readRecord(repoRoot) {
|
|
5063
|
+
const file = path10.join(repoRoot, RECORD_PATH);
|
|
5064
|
+
if (!fs10.existsSync(file)) {
|
|
5065
|
+
return null;
|
|
5066
|
+
}
|
|
5067
|
+
return JSON.parse(fs10.readFileSync(file, "utf8"));
|
|
5068
|
+
}
|
|
5069
|
+
function render3(census, usage, published = null) {
|
|
4756
5070
|
const lines = [];
|
|
4757
5071
|
lines.push("skill activation census \u2014 advisory, gates on nothing");
|
|
4758
5072
|
lines.push("");
|
|
@@ -4767,6 +5081,16 @@ function render3(census, usage) {
|
|
|
4767
5081
|
lines.push(` ${census.withDeterministicObligation.join(", ")}`);
|
|
4768
5082
|
}
|
|
4769
5083
|
lines.push("");
|
|
5084
|
+
const pop = populations(census);
|
|
5085
|
+
lines.push(" populations \u2014 the three ways a skill can be reached, reconciled");
|
|
5086
|
+
lines.push(` machine-matchable trigger key ${pop.triggerKey}`);
|
|
5087
|
+
lines.push(` evals/triggers.json corpus ${pop.triggerCorpus} (a test fixture; no host reads it at routing time)`);
|
|
5088
|
+
lines.push(` both of the above ${pop.bothKeyAndCorpus}`);
|
|
5089
|
+
lines.push(` human-named only (remainder) ${pop.humanNamedOnly}`);
|
|
5090
|
+
lines.push(
|
|
5091
|
+
` reconciles ${pop.triggerKey} + ${pop.triggerCorpus} - ${pop.bothKeyAndCorpus} + ${pop.humanNamedOnly} = ${String(pop.triggerKey + pop.triggerCorpus - pop.bothKeyAndCorpus + pop.humanNamedOnly)} of ${pop.shipped}`
|
|
5092
|
+
);
|
|
5093
|
+
lines.push("");
|
|
4770
5094
|
let totalInv = 0;
|
|
4771
5095
|
const distinct = /* @__PURE__ */ new Set();
|
|
4772
5096
|
for (const u of usage) {
|
|
@@ -4787,6 +5111,51 @@ function render3(census, usage) {
|
|
|
4787
5111
|
lines.push(` ${[...distinct].sort().join(", ")}`);
|
|
4788
5112
|
}
|
|
4789
5113
|
lines.push("");
|
|
5114
|
+
const sessionsRead = usage.reduce((a, u) => a + u.sessions, 0);
|
|
5115
|
+
if (sessionsRead === 0) {
|
|
5116
|
+
lines.push(' EMPTY STORE: 0 sessions were read, so the zero above is "no transcripts at');
|
|
5117
|
+
lines.push(' this path", NOT "no activations". It is not a measurement of the surface and');
|
|
5118
|
+
lines.push(" must not be published as one. Run this where the store lives, or pass --store.");
|
|
5119
|
+
lines.push("");
|
|
5120
|
+
}
|
|
5121
|
+
if (published !== null) {
|
|
5122
|
+
const live = buildRecord(census, usage, published.measured_at);
|
|
5123
|
+
const REPO_FIELDS = [
|
|
5124
|
+
"skills_shipped",
|
|
5125
|
+
"with_trigger_key",
|
|
5126
|
+
"with_trigger_corpus",
|
|
5127
|
+
"trigger_key_and_corpus",
|
|
5128
|
+
"human_named_only"
|
|
5129
|
+
];
|
|
5130
|
+
const STORE_FIELDS = [
|
|
5131
|
+
"sessions",
|
|
5132
|
+
"assistant_turns",
|
|
5133
|
+
"invocations",
|
|
5134
|
+
"distinct_skills_invoked"
|
|
5135
|
+
];
|
|
5136
|
+
const repoDrift = REPO_FIELDS.filter((k) => live[k] !== published[k]);
|
|
5137
|
+
const storeDrift = STORE_FIELDS.filter((k) => live[k] !== published[k]);
|
|
5138
|
+
lines.push(` PUBLISHED RECORD (${RECORD_PATH}), measured ${published.measured_at}:`);
|
|
5139
|
+
lines.push(
|
|
5140
|
+
` sessions=${String(published.sessions)} asst=${String(published.assistant_turns)} invocations=${String(published.invocations)} distinct=${String(published.distinct_skills_invoked)}`
|
|
5141
|
+
);
|
|
5142
|
+
if (repoDrift.length > 0) {
|
|
5143
|
+
lines.push(` STALE: the published population split no longer describes this tree \u2014`);
|
|
5144
|
+
lines.push(` ${repoDrift.join(", ")} moved. Re-take with --emit.`);
|
|
5145
|
+
} else {
|
|
5146
|
+
lines.push(" population split still describes this tree.");
|
|
5147
|
+
}
|
|
5148
|
+
if (sessionsRead === 0) {
|
|
5149
|
+
lines.push(" Store reading: UNDECIDED \u2014 this run read no store, so it cannot say whether");
|
|
5150
|
+
lines.push(" the published figures still hold. Re-run where the store lives.");
|
|
5151
|
+
} else if (storeDrift.length === 0) {
|
|
5152
|
+
lines.push(" Store reading: reproduces the published figures exactly.");
|
|
5153
|
+
} else {
|
|
5154
|
+
lines.push(` Store reading: moved since the record (${storeDrift.join(", ")}). Expected \u2014`);
|
|
5155
|
+
lines.push(" the store is rolling, not append-only, and a later reading can be lower.");
|
|
5156
|
+
}
|
|
5157
|
+
lines.push("");
|
|
5158
|
+
}
|
|
4790
5159
|
if (census.withTriggerKey.length === 0) {
|
|
4791
5160
|
lines.push(" VERDICT: activation is not measurable as a rate. No skill declares a");
|
|
4792
5161
|
lines.push(" machine-matchable trigger, so a missed-activation detector has nothing to");
|
|
@@ -4800,19 +5169,30 @@ function render3(census, usage) {
|
|
|
4800
5169
|
lines.push(" catalogue once per session, then count descriptions against bare names.");
|
|
4801
5170
|
return lines.join("\n");
|
|
4802
5171
|
}
|
|
5172
|
+
var USAGE = "usage: report_skill_activation [--root DIR] [--limit N] [--store PATH]... [--emit] [--allow-empty-store]\n";
|
|
4803
5173
|
function main10(argv) {
|
|
4804
5174
|
let limit = 30;
|
|
5175
|
+
let emit = false;
|
|
5176
|
+
let allowEmpty = false;
|
|
5177
|
+
const rootIdx = argv.indexOf("--root");
|
|
5178
|
+
const root = rootIdx === -1 ? REPO_ROOT3 : argv[rootIdx + 1] ?? REPO_ROOT3;
|
|
4805
5179
|
const stores = [];
|
|
4806
5180
|
for (let i = 0; i < argv.length; i += 1) {
|
|
4807
5181
|
const a = argv[i];
|
|
4808
|
-
if (a === "--
|
|
5182
|
+
if (a === "--root" && argv[i + 1] !== void 0) {
|
|
5183
|
+
i += 1;
|
|
5184
|
+
} else if (a === "--limit" && argv[i + 1] !== void 0) {
|
|
4809
5185
|
limit = Number.parseInt(argv[i + 1], 10);
|
|
4810
5186
|
i += 1;
|
|
4811
5187
|
} else if (a === "--store" && argv[i + 1] !== void 0) {
|
|
4812
5188
|
stores.push(argv[i + 1]);
|
|
4813
5189
|
i += 1;
|
|
5190
|
+
} else if (a === "--emit") {
|
|
5191
|
+
emit = true;
|
|
5192
|
+
} else if (a === "--allow-empty-store") {
|
|
5193
|
+
allowEmpty = true;
|
|
4814
5194
|
} else if (a === "--help" || a === "-h") {
|
|
4815
|
-
process.stdout.write(
|
|
5195
|
+
process.stdout.write(USAGE);
|
|
4816
5196
|
return 0;
|
|
4817
5197
|
}
|
|
4818
5198
|
}
|
|
@@ -4823,9 +5203,33 @@ function main10(argv) {
|
|
|
4823
5203
|
if (stores.length === 0) {
|
|
4824
5204
|
stores.push(defaultStore2(REPO_ROOT3));
|
|
4825
5205
|
}
|
|
4826
|
-
const census = censusSkills(path10.join(
|
|
5206
|
+
const census = censusSkills(path10.join(root, SKILLS_ROOT));
|
|
4827
5207
|
const usage = stores.map((s) => measureUsage(s, limit));
|
|
4828
|
-
process.stdout.write(`${render3(census, usage)}
|
|
5208
|
+
process.stdout.write(`${render3(census, usage, readRecord(root))}
|
|
5209
|
+
`);
|
|
5210
|
+
reportScanned({
|
|
5211
|
+
gate: "report_skill_activation",
|
|
5212
|
+
scanned: census.total,
|
|
5213
|
+
units: "SKILL.md file(s)",
|
|
5214
|
+
roots: [SKILLS_ROOT]
|
|
5215
|
+
});
|
|
5216
|
+
if (!emit) {
|
|
5217
|
+
return 0;
|
|
5218
|
+
}
|
|
5219
|
+
const sessionsRead = usage.reduce((a, u) => a + u.sessions, 0);
|
|
5220
|
+
if (sessionsRead === 0 && !allowEmpty) {
|
|
5221
|
+
process.stderr.write(
|
|
5222
|
+
'report_skill_activation --emit: refusing to write a record from 0 sessions \u2014 that zero\nis "no transcripts at this path", not an activation reading. Run where the store lives,\npass --store, or pass --allow-empty-store if an empty store is genuinely the finding.\n'
|
|
5223
|
+
);
|
|
5224
|
+
return 1;
|
|
5225
|
+
}
|
|
5226
|
+
const today = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
|
|
5227
|
+
const file = path10.join(root, RECORD_PATH);
|
|
5228
|
+
fs10.mkdirSync(path10.dirname(file), { recursive: true });
|
|
5229
|
+
fs10.writeFileSync(file, `${JSON.stringify(buildRecord(census, usage, today), null, 2)}
|
|
5230
|
+
`);
|
|
5231
|
+
process.stdout.write(`
|
|
5232
|
+
wrote ${RECORD_PATH} (measured ${today})
|
|
4829
5233
|
`);
|
|
4830
5234
|
return 0;
|
|
4831
5235
|
}
|
|
@@ -5722,14 +6126,14 @@ function appendConformanceReport(checks, projectRoot, logPath = conformanceLogPa
|
|
|
5722
6126
|
} catch {
|
|
5723
6127
|
}
|
|
5724
6128
|
}
|
|
5725
|
-
var
|
|
6129
|
+
var USAGE2 = "usage: agent-config conformance [-h] [--project PROJECT] [--json]\n [--skip-dispatcher] [--funnel]\n";
|
|
5726
6130
|
function _parse(argv) {
|
|
5727
6131
|
const opts = { project: null, json: false, skip_dispatcher: false, funnel: false };
|
|
5728
6132
|
let i = 0;
|
|
5729
6133
|
while (i < argv.length) {
|
|
5730
6134
|
const a = argv[i];
|
|
5731
6135
|
if (a === "-h" || a === "--help") {
|
|
5732
|
-
process6.stdout.write(
|
|
6136
|
+
process6.stdout.write(USAGE2);
|
|
5733
6137
|
throw new ArgparseExit(0);
|
|
5734
6138
|
}
|
|
5735
6139
|
if (a === "--json") {
|
|
@@ -5743,7 +6147,7 @@ function _parse(argv) {
|
|
|
5743
6147
|
opts.project = a.slice(a.indexOf("=") + 1);
|
|
5744
6148
|
} else {
|
|
5745
6149
|
if (i + 1 >= argv.length) {
|
|
5746
|
-
process6.stderr.write(
|
|
6150
|
+
process6.stderr.write(USAGE2);
|
|
5747
6151
|
process6.stderr.write("agent-config conformance: error: --project expects a value\n");
|
|
5748
6152
|
throw new ArgparseExit(2);
|
|
5749
6153
|
}
|
|
@@ -5751,7 +6155,7 @@ function _parse(argv) {
|
|
|
5751
6155
|
i += 1;
|
|
5752
6156
|
}
|
|
5753
6157
|
} else {
|
|
5754
|
-
process6.stderr.write(
|
|
6158
|
+
process6.stderr.write(USAGE2);
|
|
5755
6159
|
process6.stderr.write(`agent-config conformance: error: unrecognized argument ${a}
|
|
5756
6160
|
`);
|
|
5757
6161
|
throw new ArgparseExit(2);
|
|
@@ -13,7 +13,6 @@ import {
|
|
|
13
13
|
describeDrift
|
|
14
14
|
} from "./chunk-LPPWO5CE.js";
|
|
15
15
|
import "./chunk-CYH5SP6M.js";
|
|
16
|
-
import "./chunk-I3EIN2YG.js";
|
|
17
16
|
import {
|
|
18
17
|
hasBoundaryMarker,
|
|
19
18
|
scanEnvelopeDirectives,
|
|
@@ -23,6 +22,7 @@ import {
|
|
|
23
22
|
import {
|
|
24
23
|
readHookStdin
|
|
25
24
|
} from "./chunk-F7DQWYR5.js";
|
|
25
|
+
import "./chunk-I3EIN2YG.js";
|
|
26
26
|
import {
|
|
27
27
|
_RAW_KEY_PREFIXES,
|
|
28
28
|
hardenedSpawnEnv,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createRequire as __acCreateRequire } from 'node:module'; const require = globalThis.require ?? __acCreateRequire(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
PROJECT_BRIDGE_MARKERS
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-GZTMRYCN.js";
|
|
5
5
|
import "./chunk-4FS4WRXP.js";
|
|
6
6
|
import "./chunk-6RJA2F5A.js";
|
|
7
7
|
import "./chunk-WOKWX5PL.js";
|