alphacouncil-agent 1.0.2 → 1.0.3
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 +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/CHANGELOG.md +45 -0
- package/README.md +24 -15
- package/README.zh-CN.md +18 -10
- package/data/authored/core-seats.mjs +8 -4
- package/data/build-profile.v1.json +1 -1
- package/data/persona-v3-build-specs.v1.mjs +1 -1
- package/docs/plans/v1.1-say-something-worth-reading.md +116 -0
- package/knowledge/ai-assisted-solo/experiments/runs/a.json +2 -2
- package/knowledge/ai-assisted-solo/experiments/runs/b.json +2 -2
- package/knowledge/ai-assisted-solo/experiments/runs/c.json +2 -2
- package/knowledge/ai-assisted-solo/experiments/runs/d13.json +2 -2
- package/knowledge/ai-assisted-solo/experiments/runs/d26.json +9 -9
- package/knowledge/ai-assisted-solo/experiments/runs/e-d13.json +4 -4
- package/knowledge/ai-assisted-solo/experiments/runs/e-d26.json +12 -12
- package/knowledge/ai-assisted-solo/experiments/runs/h_ai_reference.json +13 -13
- package/knowledge/ai-assisted-solo/experiments/simulation-input.json +6 -6
- package/knowledge/ai-assisted-solo/experiments/simulation-manifest.json +19 -19
- package/knowledge/solo-test/masters/master_bogle/decision_policy.json +4 -3
- package/knowledge/solo-test/masters/master_bogle/provisional-index.json +3 -0
- package/knowledge/solo-test/masters/master_bogle/sources.jsonl +1 -1
- package/mcp/lib/constants.mjs +3 -0
- package/mcp/lib/fundamentals.mjs +11 -0
- package/mcp/lib/grounding.mjs +67 -1
- package/mcp/lib/insider-ownership.mjs +23 -12
- package/mcp/lib/orchestrator.mjs +10 -2
- package/mcp/lib/personas/engine.mjs +66 -9
- package/mcp/lib/personas-v3/deterministic-executor.mjs +39 -2
- package/mcp/lib/personas-v3/grounding-adapter.mjs +4 -0
- package/mcp/lib/personas-v3/runtime.mjs +9 -2
- package/mcp/lib/screen.mjs +27 -1
- package/mcp/lib/sec.mjs +80 -17
- package/mcp/lib/voice-from-decision.mjs +211 -0
- package/package.json +1 -1
|
@@ -44,12 +44,12 @@
|
|
|
44
44
|
"formal_h_satisfied": false,
|
|
45
45
|
"human_reference": false,
|
|
46
46
|
"input_binding": {
|
|
47
|
-
"input_hash": "sha256:
|
|
47
|
+
"input_hash": "sha256:cc4ffaa54c9477000383adc82ba43800c3725c331638f2f8f63cad15582a128f",
|
|
48
48
|
"path": "simulation-input.json"
|
|
49
49
|
},
|
|
50
50
|
"network_allowed": false,
|
|
51
51
|
"production_effect": "none",
|
|
52
|
-
"result_hash": "sha256:
|
|
52
|
+
"result_hash": "sha256:8f99e06ff6ea3c5df7eefad85005b5c94a5508e62c9f39616d9de2b8115cde3e",
|
|
53
53
|
"results": {
|
|
54
54
|
"blocked_fail_closed_count": 1,
|
|
55
55
|
"completion_status": "completed_machine_simulation",
|
|
@@ -417,18 +417,18 @@
|
|
|
417
417
|
"structured_decision_hash": "sha256:c7a93f8c67eb3c423fc94ef0d51bb868ab5444d75aba2d17455e9ce0a20965d1"
|
|
418
418
|
},
|
|
419
419
|
{
|
|
420
|
-
"anonymous_method_hash": "sha256:
|
|
421
|
-
"deterministic_core_hash": "sha256:
|
|
420
|
+
"anonymous_method_hash": "sha256:7e72f0c819a737e9e2c95938807bd1f856427fefbff42cc6a52dad7c4b9648b9",
|
|
421
|
+
"deterministic_core_hash": "sha256:aedc8b29c59176e6cf5994b51682a2fb1cfe2cb62f0f5882f4de16c220ce00f6",
|
|
422
422
|
"fact_pack_hash": "sha256:d035c7f7cbace9a80cce787b1ea3204f7b85437e4552dec34681765f0ab3af26",
|
|
423
|
-
"frozen_decision_hash": "sha256:
|
|
423
|
+
"frozen_decision_hash": "sha256:f82a1fb3c31d68ae5c1ce9e93fa6d1f61f3f373c14a999d7ac52bc398b8f1ca4",
|
|
424
424
|
"native_state": "provisional_fair_expected_return",
|
|
425
|
-
"pack_hash": "sha256:
|
|
425
|
+
"pack_hash": "sha256:cbc29f36bcf214b24045d582bf954d06cda6cec3aab06c41f650f7410df510f0",
|
|
426
426
|
"persona_id": "master_bogle",
|
|
427
|
-
"policy_execution_hash": "sha256:
|
|
427
|
+
"policy_execution_hash": "sha256:3f4dfca52772b1f9ad7adec925acdba1d45bdabcd9a5d1272646d86601e20c4c",
|
|
428
428
|
"score_ratio": 0.6666666666666666,
|
|
429
429
|
"stance": "cautious",
|
|
430
430
|
"status": "executed",
|
|
431
|
-
"structured_decision_hash": "sha256:
|
|
431
|
+
"structured_decision_hash": "sha256:71b52271b65d7229fe95524d953262eb175380066709f7bf50e4ee9386083a0e"
|
|
432
432
|
}
|
|
433
433
|
],
|
|
434
434
|
"deterministic_execution_count": 27,
|
|
@@ -449,13 +449,13 @@
|
|
|
449
449
|
"verifier_checks": [
|
|
450
450
|
{
|
|
451
451
|
"check_id": "physical_input_hash_binding",
|
|
452
|
-
"input_hash": "sha256:
|
|
452
|
+
"input_hash": "sha256:cc4ffaa54c9477000383adc82ba43800c3725c331638f2f8f63cad15582a128f",
|
|
453
453
|
"status": "pass"
|
|
454
454
|
},
|
|
455
455
|
{
|
|
456
456
|
"check_id": "deterministic_rederivation",
|
|
457
|
-
"first_result_hash": "sha256:
|
|
458
|
-
"repeated_result_hash": "sha256:
|
|
457
|
+
"first_result_hash": "sha256:70f60386d393bb2323c0fa970bebb5659d31e468cf48519c5d31af045df40a06",
|
|
458
|
+
"repeated_result_hash": "sha256:70f60386d393bb2323c0fa970bebb5659d31e468cf48519c5d31af045df40a06",
|
|
459
459
|
"status": "pass"
|
|
460
460
|
},
|
|
461
461
|
{
|
|
@@ -466,7 +466,7 @@
|
|
|
466
466
|
]
|
|
467
467
|
},
|
|
468
468
|
"reviewer_kind": "ai",
|
|
469
|
-
"run_artifact_hash": "sha256:
|
|
469
|
+
"run_artifact_hash": "sha256:be206b4a629bcb349da681e6eaed9f695b0c880d84963092466285c19f830ce4",
|
|
470
470
|
"run_id": "E:D26",
|
|
471
471
|
"schema_version": 1,
|
|
472
472
|
"simulation_scope": "D26 deterministic seats plus machine-only hash, rederivation and fail-closed checks"
|
|
@@ -44,12 +44,12 @@
|
|
|
44
44
|
"formal_h_satisfied": false,
|
|
45
45
|
"human_reference": false,
|
|
46
46
|
"input_binding": {
|
|
47
|
-
"input_hash": "sha256:
|
|
47
|
+
"input_hash": "sha256:cc4ffaa54c9477000383adc82ba43800c3725c331638f2f8f63cad15582a128f",
|
|
48
48
|
"path": "simulation-input.json"
|
|
49
49
|
},
|
|
50
50
|
"network_allowed": false,
|
|
51
51
|
"production_effect": "none",
|
|
52
|
-
"result_hash": "sha256:
|
|
52
|
+
"result_hash": "sha256:f3213233355e046dbee466b468eac2714db0754559bcb93533cb5728d168ea9d",
|
|
53
53
|
"results": {
|
|
54
54
|
"blocked_fail_closed_count": 1,
|
|
55
55
|
"completion_status": "completed_machine_simulation",
|
|
@@ -417,24 +417,24 @@
|
|
|
417
417
|
"structured_decision_hash": "sha256:c7a93f8c67eb3c423fc94ef0d51bb868ab5444d75aba2d17455e9ce0a20965d1"
|
|
418
418
|
},
|
|
419
419
|
{
|
|
420
|
-
"anonymous_method_hash": "sha256:
|
|
421
|
-
"deterministic_core_hash": "sha256:
|
|
420
|
+
"anonymous_method_hash": "sha256:7e72f0c819a737e9e2c95938807bd1f856427fefbff42cc6a52dad7c4b9648b9",
|
|
421
|
+
"deterministic_core_hash": "sha256:aedc8b29c59176e6cf5994b51682a2fb1cfe2cb62f0f5882f4de16c220ce00f6",
|
|
422
422
|
"fact_pack_hash": "sha256:d035c7f7cbace9a80cce787b1ea3204f7b85437e4552dec34681765f0ab3af26",
|
|
423
|
-
"frozen_decision_hash": "sha256:
|
|
423
|
+
"frozen_decision_hash": "sha256:f82a1fb3c31d68ae5c1ce9e93fa6d1f61f3f373c14a999d7ac52bc398b8f1ca4",
|
|
424
424
|
"native_state": "provisional_fair_expected_return",
|
|
425
|
-
"pack_hash": "sha256:
|
|
425
|
+
"pack_hash": "sha256:cbc29f36bcf214b24045d582bf954d06cda6cec3aab06c41f650f7410df510f0",
|
|
426
426
|
"persona_id": "master_bogle",
|
|
427
|
-
"policy_execution_hash": "sha256:
|
|
427
|
+
"policy_execution_hash": "sha256:3f4dfca52772b1f9ad7adec925acdba1d45bdabcd9a5d1272646d86601e20c4c",
|
|
428
428
|
"score_ratio": 0.6666666666666666,
|
|
429
429
|
"stance": "cautious",
|
|
430
430
|
"status": "executed",
|
|
431
|
-
"structured_decision_hash": "sha256:
|
|
431
|
+
"structured_decision_hash": "sha256:71b52271b65d7229fe95524d953262eb175380066709f7bf50e4ee9386083a0e"
|
|
432
432
|
}
|
|
433
433
|
],
|
|
434
434
|
"deterministic_execution_count": 27,
|
|
435
435
|
"executed_count": 26,
|
|
436
436
|
"formal_results": null,
|
|
437
|
-
"machine_reference_digest": "sha256:
|
|
437
|
+
"machine_reference_digest": "sha256:70f60386d393bb2323c0fa970bebb5659d31e468cf48519c5d31af045df40a06",
|
|
438
438
|
"metric_claims": [],
|
|
439
439
|
"network_call_count": 0,
|
|
440
440
|
"provider_cost_usd": 0,
|
|
@@ -449,13 +449,13 @@
|
|
|
449
449
|
"verifier_checks": [
|
|
450
450
|
{
|
|
451
451
|
"check_id": "physical_input_hash_binding",
|
|
452
|
-
"input_hash": "sha256:
|
|
452
|
+
"input_hash": "sha256:cc4ffaa54c9477000383adc82ba43800c3725c331638f2f8f63cad15582a128f",
|
|
453
453
|
"status": "pass"
|
|
454
454
|
},
|
|
455
455
|
{
|
|
456
456
|
"check_id": "deterministic_rederivation",
|
|
457
|
-
"first_result_hash": "sha256:
|
|
458
|
-
"repeated_result_hash": "sha256:
|
|
457
|
+
"first_result_hash": "sha256:70f60386d393bb2323c0fa970bebb5659d31e468cf48519c5d31af045df40a06",
|
|
458
|
+
"repeated_result_hash": "sha256:70f60386d393bb2323c0fa970bebb5659d31e468cf48519c5d31af045df40a06",
|
|
459
459
|
"status": "pass"
|
|
460
460
|
},
|
|
461
461
|
{
|
|
@@ -466,7 +466,7 @@
|
|
|
466
466
|
]
|
|
467
467
|
},
|
|
468
468
|
"reviewer_kind": "ai",
|
|
469
|
-
"run_artifact_hash": "sha256:
|
|
469
|
+
"run_artifact_hash": "sha256:790838e3d208ed1c9c3da3210ced26871f02b7fc8b01de920804bfbdefb4c000",
|
|
470
470
|
"run_id": "H_ai_reference",
|
|
471
471
|
"schema_version": 1,
|
|
472
472
|
"simulation_scope": "AI deterministic reference digest only; no human analysts or blinded human adjudicator"
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"formal_ga_effect": "none",
|
|
19
19
|
"formal_h_satisfied": false,
|
|
20
20
|
"human_reference": false,
|
|
21
|
-
"input_hash": "sha256:
|
|
21
|
+
"input_hash": "sha256:cc4ffaa54c9477000383adc82ba43800c3725c331638f2f8f63cad15582a128f",
|
|
22
22
|
"network_allowed": false,
|
|
23
23
|
"production_effect": "none",
|
|
24
24
|
"protocol_binding": {
|
|
@@ -31,14 +31,14 @@
|
|
|
31
31
|
"reviewer_kind": "ai",
|
|
32
32
|
"runtime_bindings": [
|
|
33
33
|
{
|
|
34
|
-
"byte_length":
|
|
34
|
+
"byte_length": 27650,
|
|
35
35
|
"path": "mcp/lib/personas-v3/runtime.mjs",
|
|
36
|
-
"physical_file_hash": "sha256:
|
|
36
|
+
"physical_file_hash": "sha256:aa32cf59eaec9eeb9583e44b76b31fac8fb8661e49b0b19da6de0f9b4ca5f568"
|
|
37
37
|
},
|
|
38
38
|
{
|
|
39
|
-
"byte_length":
|
|
39
|
+
"byte_length": 51789,
|
|
40
40
|
"path": "mcp/lib/personas-v3/deterministic-executor.mjs",
|
|
41
|
-
"physical_file_hash": "sha256:
|
|
41
|
+
"physical_file_hash": "sha256:ee45aed55448644c194e576b9f8611a9afd163e53b36f744ee687ae25ca99bdb"
|
|
42
42
|
},
|
|
43
43
|
{
|
|
44
44
|
"byte_length": 8032,
|
|
@@ -8278,7 +8278,7 @@
|
|
|
8278
8278
|
"schema_version": 1
|
|
8279
8279
|
},
|
|
8280
8280
|
"fact_pack_hash": "sha256:d035c7f7cbace9a80cce787b1ea3204f7b85437e4552dec34681765f0ab3af26",
|
|
8281
|
-
"pack_hash": "sha256:
|
|
8281
|
+
"pack_hash": "sha256:cbc29f36bcf214b24045d582bf954d06cda6cec3aab06c41f650f7410df510f0",
|
|
8282
8282
|
"pack_manifest_binding": {
|
|
8283
8283
|
"byte_length": 5640,
|
|
8284
8284
|
"path": "knowledge/solo-test/masters/master_bogle/manifest.json",
|
|
@@ -6,11 +6,11 @@
|
|
|
6
6
|
"formal_h_satisfied": false,
|
|
7
7
|
"human_reference": false,
|
|
8
8
|
"input_binding": {
|
|
9
|
-
"content_hash": "sha256:
|
|
10
|
-
"input_hash": "sha256:
|
|
9
|
+
"content_hash": "sha256:6340496a97245ce4bef30d91fdd7007e1128d7324ab28f55f8ff884a221a1363",
|
|
10
|
+
"input_hash": "sha256:cc4ffaa54c9477000383adc82ba43800c3725c331638f2f8f63cad15582a128f",
|
|
11
11
|
"path": "simulation-input.json"
|
|
12
12
|
},
|
|
13
|
-
"manifest_hash": "sha256:
|
|
13
|
+
"manifest_hash": "sha256:bb7437c3661c054886c048ed258739064cd132b86fb286265e7f0b43e22cd2f3",
|
|
14
14
|
"n_eff_disclosure_binding": {
|
|
15
15
|
"artifact_hash": "sha256:42ddb52fb8c5cc6335a0c90bbb4989fcfcc0a626ea1a32c87697ba4335ec94ab",
|
|
16
16
|
"content_hash": "sha256:18f4efc086ffa86322eeb9b442960b291f41811d92b7fc3f59db72dfb5cbc305",
|
|
@@ -32,66 +32,66 @@
|
|
|
32
32
|
"run_bindings": [
|
|
33
33
|
{
|
|
34
34
|
"blocked_fail_closed_count": 0,
|
|
35
|
-
"content_hash": "sha256:
|
|
35
|
+
"content_hash": "sha256:6370e7f572f4ebcdec74b2424cd4a8b7f2867bd788902d38319b09d7c966ce52",
|
|
36
36
|
"executed_count": 1,
|
|
37
37
|
"path": "runs/a.json",
|
|
38
|
-
"run_artifact_hash": "sha256:
|
|
38
|
+
"run_artifact_hash": "sha256:699e79ff212ba32d287d8847828b46e6bd46076519c6dc8dca5e9ac09f6d769f",
|
|
39
39
|
"run_id": "A"
|
|
40
40
|
},
|
|
41
41
|
{
|
|
42
42
|
"blocked_fail_closed_count": 0,
|
|
43
|
-
"content_hash": "sha256:
|
|
43
|
+
"content_hash": "sha256:82ad061ab98755a8f62ac2007ef245f28c711f71bbb9e99d27d02c8a61a52451",
|
|
44
44
|
"executed_count": 0,
|
|
45
45
|
"path": "runs/b.json",
|
|
46
|
-
"run_artifact_hash": "sha256:
|
|
46
|
+
"run_artifact_hash": "sha256:423ac48286f88cd5e95942dce855507559d54fe7fd3a5481327424c4e6966f85",
|
|
47
47
|
"run_id": "B"
|
|
48
48
|
},
|
|
49
49
|
{
|
|
50
50
|
"blocked_fail_closed_count": 0,
|
|
51
|
-
"content_hash": "sha256:
|
|
51
|
+
"content_hash": "sha256:900dc8d6b6514e06080c207d67e98564dccb9bb04170bf3e1dc19bbe8db90c1e",
|
|
52
52
|
"executed_count": 0,
|
|
53
53
|
"path": "runs/c.json",
|
|
54
|
-
"run_artifact_hash": "sha256:
|
|
54
|
+
"run_artifact_hash": "sha256:9a10ff578582c9476676ac454577d40e71aeb83dea128275e76d1d7e1d566f6c",
|
|
55
55
|
"run_id": "C"
|
|
56
56
|
},
|
|
57
57
|
{
|
|
58
58
|
"blocked_fail_closed_count": 0,
|
|
59
|
-
"content_hash": "sha256:
|
|
59
|
+
"content_hash": "sha256:acfe2440cd09928f73f542b39561bb5b66c77fc78cc37d56ec35b413daef32a5",
|
|
60
60
|
"executed_count": 13,
|
|
61
61
|
"path": "runs/d13.json",
|
|
62
|
-
"run_artifact_hash": "sha256:
|
|
62
|
+
"run_artifact_hash": "sha256:4ea0207eb1f9090b7a841585a268d8bef366a61d23b22bdeee0295bb52d47610",
|
|
63
63
|
"run_id": "D13"
|
|
64
64
|
},
|
|
65
65
|
{
|
|
66
66
|
"blocked_fail_closed_count": 1,
|
|
67
|
-
"content_hash": "sha256:
|
|
67
|
+
"content_hash": "sha256:ccf02804dd2e4e41d8d79f81d4226227c6796ba5b753d0ab9724c1617839f476",
|
|
68
68
|
"executed_count": 26,
|
|
69
69
|
"path": "runs/d26.json",
|
|
70
|
-
"run_artifact_hash": "sha256:
|
|
70
|
+
"run_artifact_hash": "sha256:eb5d0df7917c119e07f82f7d7b84b4d4e84c6423753462ca7a26f9be16ebfef8",
|
|
71
71
|
"run_id": "D26"
|
|
72
72
|
},
|
|
73
73
|
{
|
|
74
74
|
"blocked_fail_closed_count": 0,
|
|
75
|
-
"content_hash": "sha256:
|
|
75
|
+
"content_hash": "sha256:443b278936de20e6f1645dc9eda2b1e3743c0ed58933c00794177549b256be67",
|
|
76
76
|
"executed_count": 13,
|
|
77
77
|
"path": "runs/e-d13.json",
|
|
78
|
-
"run_artifact_hash": "sha256:
|
|
78
|
+
"run_artifact_hash": "sha256:3817bcac7b4ce7d1d0ddf06381b31b463b05790461f38de6b17e26ae2250f297",
|
|
79
79
|
"run_id": "E:D13"
|
|
80
80
|
},
|
|
81
81
|
{
|
|
82
82
|
"blocked_fail_closed_count": 1,
|
|
83
|
-
"content_hash": "sha256:
|
|
83
|
+
"content_hash": "sha256:9d5712d5baff1efe560691bc8208b25a5c90843b4ada21d1a339376a2b7395c7",
|
|
84
84
|
"executed_count": 26,
|
|
85
85
|
"path": "runs/e-d26.json",
|
|
86
|
-
"run_artifact_hash": "sha256:
|
|
86
|
+
"run_artifact_hash": "sha256:be206b4a629bcb349da681e6eaed9f695b0c880d84963092466285c19f830ce4",
|
|
87
87
|
"run_id": "E:D26"
|
|
88
88
|
},
|
|
89
89
|
{
|
|
90
90
|
"blocked_fail_closed_count": 1,
|
|
91
|
-
"content_hash": "sha256:
|
|
91
|
+
"content_hash": "sha256:805833bcc92aebb115c42de08e25c94ad4b8a98032d3375ed4301722521be02d",
|
|
92
92
|
"executed_count": 26,
|
|
93
93
|
"path": "runs/h_ai_reference.json",
|
|
94
|
-
"run_artifact_hash": "sha256:
|
|
94
|
+
"run_artifact_hash": "sha256:790838e3d208ed1c9c3da3210ced26871f02b7fc8b01de920804bfbdefb4c000",
|
|
95
95
|
"run_id": "H_ai_reference"
|
|
96
96
|
}
|
|
97
97
|
],
|
|
@@ -10,14 +10,14 @@
|
|
|
10
10
|
"fact_id": "fund.top_ten_weight"
|
|
11
11
|
}
|
|
12
12
|
},
|
|
13
|
-
"condition_id": "master_bogle.
|
|
13
|
+
"condition_id": "master_bogle.subject_is_a_basket",
|
|
14
14
|
"on_false": {
|
|
15
15
|
"common_stance": "out_of_scope",
|
|
16
|
-
"native_state": "
|
|
16
|
+
"native_state": "provisional_not_a_basket"
|
|
17
17
|
},
|
|
18
18
|
"on_uncomputable": {
|
|
19
19
|
"common_stance": "out_of_scope",
|
|
20
|
-
"native_state": "
|
|
20
|
+
"native_state": "provisional_not_a_basket"
|
|
21
21
|
},
|
|
22
22
|
"source_ids": [
|
|
23
23
|
"proxy:1b982d2dc6b935fc0"
|
|
@@ -77,6 +77,7 @@
|
|
|
77
77
|
}
|
|
78
78
|
],
|
|
79
79
|
"native_states": [
|
|
80
|
+
"provisional_not_a_basket",
|
|
80
81
|
"provisional_insufficient_return_inputs",
|
|
81
82
|
"provisional_overpriced_market",
|
|
82
83
|
"provisional_fair_expected_return",
|
|
@@ -6,9 +6,11 @@
|
|
|
6
6
|
"provisional_fair_expected_return": "cautious",
|
|
7
7
|
"provisional_insufficient_return_inputs": "out_of_scope",
|
|
8
8
|
"provisional_low_cost_index_candidate": "cautious",
|
|
9
|
+
"provisional_not_a_basket": "cautious",
|
|
9
10
|
"provisional_overpriced_market": "opposed"
|
|
10
11
|
},
|
|
11
12
|
"declared_state_hypotheses": [
|
|
13
|
+
"not_a_basket",
|
|
12
14
|
"insufficient_return_inputs",
|
|
13
15
|
"overpriced_market",
|
|
14
16
|
"fair_expected_return",
|
|
@@ -19,6 +21,7 @@
|
|
|
19
21
|
"formula_compilation_manifest_hash": "sha256:9eb750e5aec2e4b6ef7a7033aba119927d5a6540220d608cbe6fd90eaf255b05",
|
|
20
22
|
"method_model_eligible": false,
|
|
21
23
|
"native_states": [
|
|
24
|
+
"provisional_not_a_basket",
|
|
22
25
|
"provisional_insufficient_return_inputs",
|
|
23
26
|
"provisional_overpriced_market",
|
|
24
27
|
"provisional_fair_expected_return",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"adjudication":{"notes":"No human review, no named-method attribution, no production effect.","reviewer_ids":[],"status":"pending"},"author":"AlphaCouncil project build specification","content_hash":"sha256:
|
|
1
|
+
{"adjudication":{"notes":"No human review, no named-method attribution, no production effect.","reviewer_ids":[],"status":"pending"},"author":"AlphaCouncil project build specification","content_hash":"sha256:21670e88406249cc764918c4137c9782bcd28419ef8f2e96077ccb5f18df121c","grade":"E","known_at":"2026-07-27","locator":{"section":"master_bogle"},"public_at":"2026-07-27","published_at":"2026-07-27","retrieved_at":"2026-07-27","schema_version":1,"source_id":"proxy:1b982d2dc6b935fc0","source_kind":"derived_proxy","summary":"Project-authored provisional proxy used only to exercise the deterministic solo-test build; it is not source approval or method attribution.","supports":["solo_test_structure","deterministic_execution_only"],"title":"Provisional project-derived method hypothesis for master_bogle","url":"https://github.com/Zhao73/alphacouncil-agent/blob/main/data/persona-v3-build-specs.v1.mjs"}
|
package/mcp/lib/constants.mjs
CHANGED
|
@@ -183,6 +183,9 @@ export const LIMITS = Object.freeze({
|
|
|
183
183
|
)),
|
|
184
184
|
/** Deterministic grounding is useful, but it may not hold the whole run hostage. */
|
|
185
185
|
FULL_GROUNDING_MS: 30 * 1000,
|
|
186
|
+
// Grounding settles at its own budget and returns a partial result. This is only the
|
|
187
|
+
// backstop for a call that never returns at all, so it sits just beyond the budget.
|
|
188
|
+
GROUNDING_SETTLE_HEADROOM_MS: 5 * 1000,
|
|
186
189
|
/** All eight full evidence seats launch in one wave under this per-seat cap. */
|
|
187
190
|
FULL_EVIDENCE_MS: Math.max(1_000, Math.min(
|
|
188
191
|
Number(process.env.ALPHACOUNCIL_FULL_EVIDENCE_MS) || 6 * 60 * 1000,
|
package/mcp/lib/fundamentals.mjs
CHANGED
|
@@ -781,6 +781,17 @@ export function deriveFundamentals({ companyFacts, asOf = null, maintenanceCapex
|
|
|
781
781
|
});
|
|
782
782
|
}
|
|
783
783
|
|
|
784
|
+
/**
|
|
785
|
+
* True when a registrant has filed no XBRL at all.
|
|
786
|
+
*
|
|
787
|
+
* SEC's own ticker file maps XOM to ExxonMobil Holdings Corp -- a newly formed entity with zero
|
|
788
|
+
* us-gaap tags -- while the operating history sits under a different CIK. Every metric then
|
|
789
|
+
* reported as missing, individually, and nothing said the registrant itself was empty.
|
|
790
|
+
*/
|
|
791
|
+
export function hasNoXbrlHistory(companyFacts) {
|
|
792
|
+
return Object.keys(companyFacts?.facts?.["us-gaap"] || {}).length === 0;
|
|
793
|
+
}
|
|
794
|
+
|
|
784
795
|
/**
|
|
785
796
|
* Thin fetching wrapper: resolve the filer, pull Company Facts through the throttled and
|
|
786
797
|
* User-Agent-bearing sec.mjs client, then hand the JSON to the pure function above.
|
package/mcp/lib/grounding.mjs
CHANGED
|
@@ -8,6 +8,25 @@ import { INDEX_PROXIES, normalizeIndexSymbol } from "./index-aggregate.mjs";
|
|
|
8
8
|
import { SECTOR_SPDRS, fetchCrossMarket, fetchSectorDispersion } from "./cross-market.mjs";
|
|
9
9
|
import { fetchBasketNews } from "./basket-news.mjs";
|
|
10
10
|
import { gatherInstrumentFacts, LOOK_THROUGH_FACT_IDS } from "./instrument-facts.mjs";
|
|
11
|
+
|
|
12
|
+
/** The index a US company is measured against when a method asks what the market costs. */
|
|
13
|
+
const BROAD_MARKET_INDEX = "^GSPC";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Facts that describe the market rather than the subject.
|
|
17
|
+
*
|
|
18
|
+
* Everything else the index block produces -- leverage, growth, breadth of a basket -- is about
|
|
19
|
+
* a portfolio the company is not, and forwarding it would answer a different question in the
|
|
20
|
+
* subject's name.
|
|
21
|
+
*/
|
|
22
|
+
const MARKET_LEVEL_FACTS = new Set([
|
|
23
|
+
"index.aggregate_pe_ttm",
|
|
24
|
+
"index.aggregate_pe_forward",
|
|
25
|
+
"index.aggregate_earnings_yield",
|
|
26
|
+
"index.dividend_yield",
|
|
27
|
+
"valuation.implied_erp",
|
|
28
|
+
"cycle.valuation_percentile",
|
|
29
|
+
]);
|
|
11
30
|
import { fetchOptionsChain } from "./options.mjs";
|
|
12
31
|
import { screenTicker } from "./screen.mjs";
|
|
13
32
|
import { resolveIndustry, industryCoverage } from "./industry.mjs";
|
|
@@ -95,6 +114,7 @@ export async function gatherGrounding({
|
|
|
95
114
|
now = new Date(),
|
|
96
115
|
language = "English",
|
|
97
116
|
signal,
|
|
117
|
+
budgetMs = null,
|
|
98
118
|
} = {}) {
|
|
99
119
|
const snapshotPolicy = liveSnapshotPolicy(asOf, { now });
|
|
100
120
|
const gatheredAt = now instanceof Date ? now.toISOString() : new Date(now).toISOString();
|
|
@@ -320,6 +340,27 @@ export async function gatherGrounding({
|
|
|
320
340
|
out.unavailable.push(`structured financials for ${symbol}: this adapter is not point-in-time versioned; current data was not fetched for a historical cutoff`);
|
|
321
341
|
}
|
|
322
342
|
|
|
343
|
+
// The market's own valuation, for every US subject rather than only for baskets.
|
|
344
|
+
//
|
|
345
|
+
// Three seats require `index.aggregate_earnings_yield` and reported it missing on every
|
|
346
|
+
// single-company run this product has ever done. They were right to ask: the market's
|
|
347
|
+
// aggregate earnings yield is not a property of the subject, it is the yardstick the subject
|
|
348
|
+
// is measured against. Damodaran's implied premium needs it, Asness's Fed-model critique IS
|
|
349
|
+
// about it, and Marks reads it as where the cycle stands. The subject decides whose holdings
|
|
350
|
+
// get read; it does not decide whether the market has a price-earnings ratio.
|
|
351
|
+
if (symbol && !isFundOrIndex(out.instrument) && symbolMarket?.id === "US" && snapshotPolicy.allowed) {
|
|
352
|
+
jobs.push(safely("market valuation", () => gatherInstrumentFacts({
|
|
353
|
+
symbol: BROAD_MARKET_INDEX, instrument: { research_model: "index_aggregate", index_like: true },
|
|
354
|
+
asOf, signal, lookThroughFactIds: [],
|
|
355
|
+
})).then((r) => {
|
|
356
|
+
if (!r.ok) { out.unavailable.push(r.error); return; }
|
|
357
|
+
// Only the market-level block. A company's own leverage and growth come from its filings,
|
|
358
|
+
// and taking them from the index would be silently answering a different question.
|
|
359
|
+
const marketFacts = (r.value.facts || []).filter((fact) => MARKET_LEVEL_FACTS.has(fact.fact_id));
|
|
360
|
+
if (marketFacts.length) out.market_valuation = { ...r.value, facts: marketFacts };
|
|
361
|
+
}));
|
|
362
|
+
}
|
|
363
|
+
|
|
323
364
|
// A fund or index has no issuer financials, so this is where its evidence comes from
|
|
324
365
|
// instead: published holdings, index-level valuation and the look-through aggregates that
|
|
325
366
|
// let an operating-company method run against a basket at all.
|
|
@@ -379,7 +420,32 @@ export async function gatherGrounding({
|
|
|
379
420
|
out.unavailable.push("industry map: the curated map is not publication-versioned and was excluded from the historical information set");
|
|
380
421
|
}
|
|
381
422
|
|
|
382
|
-
|
|
423
|
+
// Return what arrived, not nothing.
|
|
424
|
+
//
|
|
425
|
+
// A caller that raced this whole function against a timer threw away a completed quote, a
|
|
426
|
+
// completed screen and a completed filing set because one slow feed had not landed -- and the
|
|
427
|
+
// analysts downstream, handed an empty object, reported "no ticker was provided". The symbol
|
|
428
|
+
// had been provided; the fetch had not finished. Settling at the budget keeps everything that
|
|
429
|
+
// did arrive and names what did not.
|
|
430
|
+
if (Number.isFinite(budgetMs) && budgetMs > 0) {
|
|
431
|
+
let settled = false;
|
|
432
|
+
const all = Promise.all(jobs).then(() => { settled = true; });
|
|
433
|
+
let timer;
|
|
434
|
+
await Promise.race([
|
|
435
|
+
all,
|
|
436
|
+
new Promise((resolve) => { timer = setTimeout(resolve, budgetMs); }),
|
|
437
|
+
]);
|
|
438
|
+
clearTimeout(timer);
|
|
439
|
+
if (!settled) {
|
|
440
|
+
out.partial = true;
|
|
441
|
+
out.unavailable.push(
|
|
442
|
+
`grounding budget of ${Math.round(budgetMs)}ms elapsed before every source answered;`
|
|
443
|
+
+ " this run carries what arrived by then and names the rest as gaps rather than discarding it",
|
|
444
|
+
);
|
|
445
|
+
}
|
|
446
|
+
} else {
|
|
447
|
+
await Promise.all(jobs);
|
|
448
|
+
}
|
|
383
449
|
|
|
384
450
|
// Coverage across every symbol in play, so a report cannot quietly become US-only.
|
|
385
451
|
const inPlay = [symbol, ...(out.industry?.participants || []).map((p) => p.symbol)].filter(Boolean);
|
|
@@ -26,6 +26,9 @@ const OWNERSHIP_FORMS = new Set(["3", "4", "5", "3/A", "4/A", "5/A"]);
|
|
|
26
26
|
/** A registrant with more insiders than this is not a governance question, it is a bad parse. */
|
|
27
27
|
const MAX_DISTINCT_OWNERS = 60;
|
|
28
28
|
|
|
29
|
+
/** Filings read per round. SEC's ~10 req/s guidance is enforced by the client's own throttle. */
|
|
30
|
+
const OWNERSHIP_BATCH = 8;
|
|
31
|
+
|
|
29
32
|
/** Below this share of the register the aggregate says nothing, so it refuses instead. */
|
|
30
33
|
export const MIN_OWNER_COVERAGE = 1;
|
|
31
34
|
|
|
@@ -105,19 +108,27 @@ export async function fetchInsiderOwnership(cik, { sharesOutstanding, asOf = nul
|
|
|
105
108
|
const byOwner = new Map();
|
|
106
109
|
const sources = [];
|
|
107
110
|
let newestFiling = null;
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
111
|
+
// Read in bounded concurrent batches rather than one filing at a time. Sequentially this was
|
|
112
|
+
// up to sixty throttled round trips on the critical path of every company run, which is what
|
|
113
|
+
// pushed grounding past its budget -- and a budget overrun used to discard the whole run's
|
|
114
|
+
// evidence. Newest-first order is preserved across batches, so an owner is still taken from
|
|
115
|
+
// their most recent filing.
|
|
116
|
+
const candidates = ownershipFilings.slice(0, MAX_DISTINCT_OWNERS * 3);
|
|
117
|
+
for (let offset = 0; offset < candidates.length && byOwner.size < MAX_DISTINCT_OWNERS; offset += OWNERSHIP_BATCH) {
|
|
118
|
+
const batch = candidates.slice(offset, offset + OWNERSHIP_BATCH);
|
|
119
|
+
const documents = await Promise.all(batch.map((filing) => (
|
|
120
|
+
fetchFilingDocument(index.cik, filing.accession, filing.primary_document, { signal })
|
|
121
|
+
.then((document) => ({ filing, document }))
|
|
122
|
+
.catch(() => null)
|
|
123
|
+
)));
|
|
124
|
+
for (const entry of documents) {
|
|
125
|
+
if (!entry) continue;
|
|
126
|
+
const parsed = parseOwnershipDocument(entry.document.text);
|
|
127
|
+
if (!parsed || byOwner.has(parsed.owner_cik)) continue;
|
|
128
|
+
byOwner.set(parsed.owner_cik, { ...parsed, filing_date: entry.filing.filing_date, url: entry.document.url });
|
|
129
|
+
sources.push(`sec:ownership:${index.cik}:${entry.filing.accession}`);
|
|
130
|
+
if (!newestFiling || entry.filing.filing_date > newestFiling) newestFiling = entry.filing.filing_date;
|
|
115
131
|
}
|
|
116
|
-
const parsed = parseOwnershipDocument(document.text);
|
|
117
|
-
if (!parsed || byOwner.has(parsed.owner_cik)) continue;
|
|
118
|
-
byOwner.set(parsed.owner_cik, { ...parsed, filing_date: filing.filing_date, url: document.url });
|
|
119
|
-
sources.push(`sec:ownership:${index.cik}:${filing.accession}`);
|
|
120
|
-
if (!newestFiling || filing.filing_date > newestFiling) newestFiling = filing.filing_date;
|
|
121
132
|
}
|
|
122
133
|
if (byOwner.size < MIN_OWNER_COVERAGE) {
|
|
123
134
|
return gap(`insider ownership: no Section 16 document for ${index.name || cik} could be parsed`);
|
package/mcp/lib/orchestrator.mjs
CHANGED
|
@@ -1200,7 +1200,15 @@ export async function groundingForHeadlessRun({ symbol, asOf, grounding, dryRun,
|
|
|
1200
1200
|
let timer;
|
|
1201
1201
|
const controller = Number.isFinite(timeoutMs) ? new AbortController() : null;
|
|
1202
1202
|
try {
|
|
1203
|
-
|
|
1203
|
+
// The budget is handed DOWN so grounding can settle and return what it has. Racing it from
|
|
1204
|
+
// out here discarded a completed quote and a completed screen whenever one feed was slow,
|
|
1205
|
+
// and the analysts then reported a missing ticker for a symbol that had been supplied.
|
|
1206
|
+
// The outer race stays as a backstop, with headroom, for a call that hangs entirely.
|
|
1207
|
+
const work = gather({
|
|
1208
|
+
symbol, asOf,
|
|
1209
|
+
...(Number.isFinite(timeoutMs) ? { budgetMs: timeoutMs } : {}),
|
|
1210
|
+
...(controller ? { signal: controller.signal } : {}),
|
|
1211
|
+
});
|
|
1204
1212
|
if (!Number.isFinite(timeoutMs)) return await work;
|
|
1205
1213
|
return await Promise.race([
|
|
1206
1214
|
work,
|
|
@@ -1209,7 +1217,7 @@ export async function groundingForHeadlessRun({ symbol, asOf, grounding, dryRun,
|
|
|
1209
1217
|
const error = new Error(`quick grounding timed out after ${Math.round(timeoutMs)}ms`);
|
|
1210
1218
|
reject(error);
|
|
1211
1219
|
controller?.abort(error);
|
|
1212
|
-
}, timeoutMs);
|
|
1220
|
+
}, timeoutMs + LIMITS.GROUNDING_SETTLE_HEADROOM_MS);
|
|
1213
1221
|
}),
|
|
1214
1222
|
]);
|
|
1215
1223
|
} catch (error) {
|