@plazmodium/odin 0.3.2-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +306 -0
- package/dist/adapters/archive/supabase.d.ts +19 -0
- package/dist/adapters/archive/supabase.d.ts.map +1 -0
- package/dist/adapters/archive/supabase.js +121 -0
- package/dist/adapters/archive/supabase.js.map +1 -0
- package/dist/adapters/archive/types.d.ts +26 -0
- package/dist/adapters/archive/types.d.ts.map +1 -0
- package/dist/adapters/archive/types.js +6 -0
- package/dist/adapters/archive/types.js.map +1 -0
- package/dist/adapters/formal-verification/tla-precheck.d.ts +22 -0
- package/dist/adapters/formal-verification/tla-precheck.d.ts.map +1 -0
- package/dist/adapters/formal-verification/tla-precheck.js +270 -0
- package/dist/adapters/formal-verification/tla-precheck.js.map +1 -0
- package/dist/adapters/formal-verification/types.d.ts +37 -0
- package/dist/adapters/formal-verification/types.d.ts.map +1 -0
- package/dist/adapters/formal-verification/types.js +6 -0
- package/dist/adapters/formal-verification/types.js.map +1 -0
- package/dist/adapters/review/semgrep.d.ts +12 -0
- package/dist/adapters/review/semgrep.d.ts.map +1 -0
- package/dist/adapters/review/semgrep.js +175 -0
- package/dist/adapters/review/semgrep.js.map +1 -0
- package/dist/adapters/review/types.d.ts +14 -0
- package/dist/adapters/review/types.d.ts.map +1 -0
- package/dist/adapters/review/types.js +6 -0
- package/dist/adapters/review/types.js.map +1 -0
- package/dist/adapters/skills/filesystem.d.ts +18 -0
- package/dist/adapters/skills/filesystem.d.ts.map +1 -0
- package/dist/adapters/skills/filesystem.js +398 -0
- package/dist/adapters/skills/filesystem.js.map +1 -0
- package/dist/adapters/skills/types.d.ts +19 -0
- package/dist/adapters/skills/types.d.ts.map +1 -0
- package/dist/adapters/skills/types.js +6 -0
- package/dist/adapters/skills/types.js.map +1 -0
- package/dist/adapters/sql-executor/direct-postgres.d.ts +15 -0
- package/dist/adapters/sql-executor/direct-postgres.d.ts.map +1 -0
- package/dist/adapters/sql-executor/direct-postgres.js +33 -0
- package/dist/adapters/sql-executor/direct-postgres.js.map +1 -0
- package/dist/adapters/sql-executor/supabase-management-api.d.ts +17 -0
- package/dist/adapters/sql-executor/supabase-management-api.d.ts.map +1 -0
- package/dist/adapters/sql-executor/supabase-management-api.js +40 -0
- package/dist/adapters/sql-executor/supabase-management-api.js.map +1 -0
- package/dist/adapters/sql-executor/types.d.ts +15 -0
- package/dist/adapters/sql-executor/types.d.ts.map +1 -0
- package/dist/adapters/sql-executor/types.js +6 -0
- package/dist/adapters/sql-executor/types.js.map +1 -0
- package/dist/adapters/workflow-state/in-memory.d.ts +69 -0
- package/dist/adapters/workflow-state/in-memory.d.ts.map +1 -0
- package/dist/adapters/workflow-state/in-memory.js +444 -0
- package/dist/adapters/workflow-state/in-memory.js.map +1 -0
- package/dist/adapters/workflow-state/supabase.d.ts +55 -0
- package/dist/adapters/workflow-state/supabase.d.ts.map +1 -0
- package/dist/adapters/workflow-state/supabase.js +823 -0
- package/dist/adapters/workflow-state/supabase.js.map +1 -0
- package/dist/adapters/workflow-state/types.d.ts +55 -0
- package/dist/adapters/workflow-state/types.d.ts.map +1 -0
- package/dist/adapters/workflow-state/types.js +6 -0
- package/dist/adapters/workflow-state/types.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +52 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +44 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +115 -0
- package/dist/config.js.map +1 -0
- package/dist/domain/actors.d.ts +10 -0
- package/dist/domain/actors.d.ts.map +1 -0
- package/dist/domain/actors.js +60 -0
- package/dist/domain/actors.js.map +1 -0
- package/dist/domain/development-evals.d.ts +9 -0
- package/dist/domain/development-evals.d.ts.map +1 -0
- package/dist/domain/development-evals.js +164 -0
- package/dist/domain/development-evals.js.map +1 -0
- package/dist/domain/matching.d.ts +8 -0
- package/dist/domain/matching.d.ts.map +1 -0
- package/dist/domain/matching.js +24 -0
- package/dist/domain/matching.js.map +1 -0
- package/dist/domain/phases.d.ts +10 -0
- package/dist/domain/phases.d.ts.map +1 -0
- package/dist/domain/phases.js +165 -0
- package/dist/domain/phases.js.map +1 -0
- package/dist/domain/quality-gates.d.ts +7 -0
- package/dist/domain/quality-gates.d.ts.map +1 -0
- package/dist/domain/quality-gates.js +8 -0
- package/dist/domain/quality-gates.js.map +1 -0
- package/dist/domain/resonance.d.ts +33 -0
- package/dist/domain/resonance.d.ts.map +1 -0
- package/dist/domain/resonance.js +100 -0
- package/dist/domain/resonance.js.map +1 -0
- package/dist/domain/tasks.d.ts +9 -0
- package/dist/domain/tasks.d.ts.map +1 -0
- package/dist/domain/tasks.js +57 -0
- package/dist/domain/tasks.js.map +1 -0
- package/dist/init.d.ts +7 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +387 -0
- package/dist/init.js.map +1 -0
- package/dist/schemas.d.ts +366 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +184 -0
- package/dist/schemas.js.map +1 -0
- package/dist/server.d.ts +7 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +243 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/apply-migrations.d.ts +21 -0
- package/dist/tools/apply-migrations.d.ts.map +1 -0
- package/dist/tools/apply-migrations.js +286 -0
- package/dist/tools/apply-migrations.js.map +1 -0
- package/dist/tools/archive-feature-release.d.ts +13 -0
- package/dist/tools/archive-feature-release.d.ts.map +1 -0
- package/dist/tools/archive-feature-release.js +182 -0
- package/dist/tools/archive-feature-release.js.map +1 -0
- package/dist/tools/capture-learning.d.ts +9 -0
- package/dist/tools/capture-learning.d.ts.map +1 -0
- package/dist/tools/capture-learning.js +53 -0
- package/dist/tools/capture-learning.js.map +1 -0
- package/dist/tools/explore-knowledge.d.ts +9 -0
- package/dist/tools/explore-knowledge.d.ts.map +1 -0
- package/dist/tools/explore-knowledge.js +142 -0
- package/dist/tools/explore-knowledge.js.map +1 -0
- package/dist/tools/get-claims-needing-review.d.ts +8 -0
- package/dist/tools/get-claims-needing-review.d.ts.map +1 -0
- package/dist/tools/get-claims-needing-review.js +21 -0
- package/dist/tools/get-claims-needing-review.js.map +1 -0
- package/dist/tools/get-development-eval-status.d.ts +8 -0
- package/dist/tools/get-development-eval-status.d.ts.map +1 -0
- package/dist/tools/get-development-eval-status.js +49 -0
- package/dist/tools/get-development-eval-status.js.map +1 -0
- package/dist/tools/get-feature-status.d.ts +8 -0
- package/dist/tools/get-feature-status.d.ts.map +1 -0
- package/dist/tools/get-feature-status.js +68 -0
- package/dist/tools/get-feature-status.js.map +1 -0
- package/dist/tools/get-next-phase.d.ts +8 -0
- package/dist/tools/get-next-phase.d.ts.map +1 -0
- package/dist/tools/get-next-phase.js +26 -0
- package/dist/tools/get-next-phase.js.map +1 -0
- package/dist/tools/prepare-phase-context.d.ts +9 -0
- package/dist/tools/prepare-phase-context.d.ts.map +1 -0
- package/dist/tools/prepare-phase-context.js +151 -0
- package/dist/tools/prepare-phase-context.js.map +1 -0
- package/dist/tools/record-commit.d.ts +8 -0
- package/dist/tools/record-commit.d.ts.map +1 -0
- package/dist/tools/record-commit.js +28 -0
- package/dist/tools/record-commit.js.map +1 -0
- package/dist/tools/record-eval-plan.d.ts +8 -0
- package/dist/tools/record-eval-plan.d.ts.map +1 -0
- package/dist/tools/record-eval-plan.js +40 -0
- package/dist/tools/record-eval-plan.js.map +1 -0
- package/dist/tools/record-eval-run.d.ts +8 -0
- package/dist/tools/record-eval-run.d.ts.map +1 -0
- package/dist/tools/record-eval-run.js +42 -0
- package/dist/tools/record-eval-run.js.map +1 -0
- package/dist/tools/record-merge.d.ts +8 -0
- package/dist/tools/record-merge.d.ts.map +1 -0
- package/dist/tools/record-merge.js +16 -0
- package/dist/tools/record-merge.js.map +1 -0
- package/dist/tools/record-phase-artifact.d.ts +8 -0
- package/dist/tools/record-phase-artifact.d.ts.map +1 -0
- package/dist/tools/record-phase-artifact.js +26 -0
- package/dist/tools/record-phase-artifact.js.map +1 -0
- package/dist/tools/record-phase-result.d.ts +9 -0
- package/dist/tools/record-phase-result.d.ts.map +1 -0
- package/dist/tools/record-phase-result.js +122 -0
- package/dist/tools/record-phase-result.js.map +1 -0
- package/dist/tools/record-pull-request.d.ts +8 -0
- package/dist/tools/record-pull-request.d.ts.map +1 -0
- package/dist/tools/record-pull-request.js +16 -0
- package/dist/tools/record-pull-request.js.map +1 -0
- package/dist/tools/record-quality-gate.d.ts +8 -0
- package/dist/tools/record-quality-gate.d.ts.map +1 -0
- package/dist/tools/record-quality-gate.js +26 -0
- package/dist/tools/record-quality-gate.js.map +1 -0
- package/dist/tools/record-watcher-review.d.ts +8 -0
- package/dist/tools/record-watcher-review.d.ts.map +1 -0
- package/dist/tools/record-watcher-review.js +18 -0
- package/dist/tools/record-watcher-review.js.map +1 -0
- package/dist/tools/run-policy-checks.d.ts +8 -0
- package/dist/tools/run-policy-checks.d.ts.map +1 -0
- package/dist/tools/run-policy-checks.js +38 -0
- package/dist/tools/run-policy-checks.js.map +1 -0
- package/dist/tools/run-review-checks.d.ts +9 -0
- package/dist/tools/run-review-checks.d.ts.map +1 -0
- package/dist/tools/run-review-checks.js +45 -0
- package/dist/tools/run-review-checks.js.map +1 -0
- package/dist/tools/start-feature.d.ts +8 -0
- package/dist/tools/start-feature.d.ts.map +1 -0
- package/dist/tools/start-feature.js +33 -0
- package/dist/tools/start-feature.js.map +1 -0
- package/dist/tools/submit-claim.d.ts +8 -0
- package/dist/tools/submit-claim.d.ts.map +1 -0
- package/dist/tools/submit-claim.js +45 -0
- package/dist/tools/submit-claim.js.map +1 -0
- package/dist/tools/verify-claims.d.ts +8 -0
- package/dist/tools/verify-claims.d.ts.map +1 -0
- package/dist/tools/verify-claims.js +39 -0
- package/dist/tools/verify-claims.js.map +1 -0
- package/dist/tools/verify-design.d.ts +8 -0
- package/dist/tools/verify-design.d.ts.map +1 -0
- package/dist/tools/verify-design.js +31 -0
- package/dist/tools/verify-design.js.map +1 -0
- package/dist/types.d.ts +333 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +52 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +24 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +50 -0
- package/dist/utils.js.map +1 -0
- package/migrations/001_schema.sql +795 -0
- package/migrations/002_functions.sql +2126 -0
- package/migrations/003_views.sql +599 -0
- package/migrations/004_seed.sql +106 -0
- package/migrations/005_odin_v2_schema.sql +217 -0
- package/migrations/006_odin_v2_functions.sql +671 -0
- package/migrations/007_odin_v2_phase_alignment.sql +554 -0
- package/migrations/008_related_learnings.sql +80 -0
- package/migrations/README.md +23 -0
- package/package.json +63 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Development Eval Workflow Helpers
|
|
3
|
+
* Version: 0.1.0
|
|
4
|
+
*/
|
|
5
|
+
const NON_INTERFERENCE_RULES = [
|
|
6
|
+
'Development evals are additive and never replace formal verification, tests, security review, runtime verification, or watcher checks.',
|
|
7
|
+
'A passing eval result does not override a failing Semgrep/security outcome.',
|
|
8
|
+
'A passing eval result does not override build, runtime, or claim-verification failures.',
|
|
9
|
+
];
|
|
10
|
+
function getLatestArtifact(artifacts, output_type) {
|
|
11
|
+
return artifacts.filter((artifact) => artifact.output_type === output_type).at(-1) ?? null;
|
|
12
|
+
}
|
|
13
|
+
function getPhaseSpecificRequirements(mode, phase) {
|
|
14
|
+
switch (phase) {
|
|
15
|
+
case '1':
|
|
16
|
+
return ['Capture success criteria, non-goals, and failure shape for downstream eval planning.'];
|
|
17
|
+
case '2':
|
|
18
|
+
return ['Capture happy-path, edge, failure, and should-not-trigger scenarios for downstream eval planning.'];
|
|
19
|
+
case '3':
|
|
20
|
+
return mode === 'plan_required'
|
|
21
|
+
? ['Record an eval_plan artifact with capability and regression cases before build.']
|
|
22
|
+
: ['Define the minimal acceptance/regression case that must exist before Builder completes.'];
|
|
23
|
+
case '4':
|
|
24
|
+
return mode === 'plan_required'
|
|
25
|
+
? ['Decide the eval_readiness gate before Builder starts.']
|
|
26
|
+
: ['Verify the minimal L1 development eval obligation is concrete before Builder proceeds.'];
|
|
27
|
+
case '5':
|
|
28
|
+
return mode === 'plan_required'
|
|
29
|
+
? ['Implement against the eval_plan; eval coverage does not replace real tests.']
|
|
30
|
+
: ['Before Builder completes, ensure at least one minimal acceptance or regression case exists.'];
|
|
31
|
+
case '6':
|
|
32
|
+
return ['Record an eval_run artifact; failing development evals do not override security-review blockers.'];
|
|
33
|
+
case '7':
|
|
34
|
+
return ['Resolve any partial eval state with observable runtime or end-state verification.'];
|
|
35
|
+
case '9':
|
|
36
|
+
return ['Archive the relevant eval summary when present.'];
|
|
37
|
+
default:
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function getExpectedArtifacts(mode, phase, latest_run) {
|
|
42
|
+
switch (phase) {
|
|
43
|
+
case '3':
|
|
44
|
+
return mode === 'plan_required' ? ['eval_plan'] : [];
|
|
45
|
+
case '6':
|
|
46
|
+
return ['eval_run'];
|
|
47
|
+
case '7':
|
|
48
|
+
return getEvalRunStatus(latest_run) === 'partial' ? ['eval_run'] : [];
|
|
49
|
+
default:
|
|
50
|
+
return [];
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function getExpectedGate(mode, phase) {
|
|
54
|
+
return phase === '4' && mode === 'plan_required' ? 'eval_readiness' : null;
|
|
55
|
+
}
|
|
56
|
+
function toPhaseNumber(phase) {
|
|
57
|
+
return Number.parseInt(phase, 10);
|
|
58
|
+
}
|
|
59
|
+
function getLatestOpenReadinessGate(open_gate_records) {
|
|
60
|
+
return open_gate_records
|
|
61
|
+
.filter((gate) => gate.gate_name === 'eval_readiness')
|
|
62
|
+
.sort((left, right) => {
|
|
63
|
+
const timestamp_delta = new Date(right.approved_at).getTime() - new Date(left.approved_at).getTime();
|
|
64
|
+
if (timestamp_delta !== 0) {
|
|
65
|
+
return timestamp_delta;
|
|
66
|
+
}
|
|
67
|
+
return toPhaseNumber(right.phase) - toPhaseNumber(left.phase);
|
|
68
|
+
})
|
|
69
|
+
.at(0) ?? null;
|
|
70
|
+
}
|
|
71
|
+
function getEvalRunStatus(latest_run) {
|
|
72
|
+
if (latest_run == null || latest_run.content == null || typeof latest_run.content !== 'object') {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
const status = latest_run.content.status;
|
|
76
|
+
return typeof status === 'string' ? status : null;
|
|
77
|
+
}
|
|
78
|
+
function buildStatusSummary(mode, phase, latest_plan, latest_run, open_readiness_gate) {
|
|
79
|
+
const summary = [];
|
|
80
|
+
const phase_number = toPhaseNumber(phase);
|
|
81
|
+
if (mode === 'plan_required' && phase_number >= 3 && latest_plan == null) {
|
|
82
|
+
summary.push('No eval_plan artifact has been recorded yet.');
|
|
83
|
+
}
|
|
84
|
+
if (latest_plan != null) {
|
|
85
|
+
summary.push(`Latest eval_plan recorded by ${latest_plan.created_by} at ${latest_plan.created_at}.`);
|
|
86
|
+
}
|
|
87
|
+
const latest_run_status = getEvalRunStatus(latest_run);
|
|
88
|
+
if (phase_number >= 6 && latest_run == null) {
|
|
89
|
+
summary.push('No eval_run artifact has been recorded yet.');
|
|
90
|
+
}
|
|
91
|
+
else if (latest_run != null) {
|
|
92
|
+
summary.push(latest_run_status == null
|
|
93
|
+
? `Latest eval_run recorded by ${latest_run.created_by} at ${latest_run.created_at}.`
|
|
94
|
+
: `Latest eval_run status is ${latest_run_status}.`);
|
|
95
|
+
}
|
|
96
|
+
if (phase === '7' && latest_run_status === 'partial') {
|
|
97
|
+
summary.push('Integrator must resolve the partial eval_run before Release.');
|
|
98
|
+
}
|
|
99
|
+
if (open_readiness_gate != null) {
|
|
100
|
+
summary.push(`Open eval_readiness gate is ${open_readiness_gate.status} in phase ${open_readiness_gate.phase}.`);
|
|
101
|
+
}
|
|
102
|
+
return summary;
|
|
103
|
+
}
|
|
104
|
+
function buildHarnessPromptBlock(mode, phase, latest_plan, latest_run, open_readiness_gate) {
|
|
105
|
+
const lines = [];
|
|
106
|
+
if (phase === '3' && mode === 'plan_required') {
|
|
107
|
+
lines.push('Development Evals are required: produce an `eval_plan` artifact with capability and regression cases before handoff.');
|
|
108
|
+
}
|
|
109
|
+
if (phase === '4' && mode === 'plan_required') {
|
|
110
|
+
lines.push('Development Evals are required: decide the `eval_readiness` gate explicitly before Builder starts.');
|
|
111
|
+
lines.push('Reject eval plans that are ambiguous, path-rigid, or missing regression coverage for bug fixes.');
|
|
112
|
+
}
|
|
113
|
+
if (phase === '5') {
|
|
114
|
+
lines.push(latest_plan == null && mode === 'plan_required'
|
|
115
|
+
? 'Development Evals are required: no `eval_plan` is visible, so block and escalate instead of guessing.'
|
|
116
|
+
: open_readiness_gate != null
|
|
117
|
+
? `Development Evals are required: the open \`eval_readiness\` gate is ${open_readiness_gate.status}. Respect that gate and escalate instead of bypassing it.`
|
|
118
|
+
: 'Development Evals guide implementation, but they do not replace real tests, build checks, or other review steps.');
|
|
119
|
+
}
|
|
120
|
+
if (phase === '6') {
|
|
121
|
+
lines.push('Development Evals are required here: record an `eval_run` artifact after review-time execution.');
|
|
122
|
+
lines.push('A passing `eval_run` never overrides failing security findings.');
|
|
123
|
+
}
|
|
124
|
+
if (phase === '7') {
|
|
125
|
+
lines.push(getEvalRunStatus(latest_run) === 'partial'
|
|
126
|
+
? 'The latest `eval_run` is partial: resolve it with runtime/end-state evidence and record an updated `eval_run`.'
|
|
127
|
+
: 'If runtime verification materially changes development-eval confidence, record an updated `eval_run`.');
|
|
128
|
+
}
|
|
129
|
+
if (lines.length > 0) {
|
|
130
|
+
lines.push('Development Evals are additive only; they never replace formal verification, Semgrep, tests, runtime verification, or watcher checks.');
|
|
131
|
+
}
|
|
132
|
+
return lines;
|
|
133
|
+
}
|
|
134
|
+
export function getDevelopmentEvalMode(feature) {
|
|
135
|
+
return feature.complexity_level === 1 ? 'l1_minimal' : 'plan_required';
|
|
136
|
+
}
|
|
137
|
+
export function buildDevelopmentEvalContext(feature, phase, artifacts, open_gate_records) {
|
|
138
|
+
const mode = getDevelopmentEvalMode(feature);
|
|
139
|
+
const latest_plan = getLatestArtifact(artifacts, 'eval_plan');
|
|
140
|
+
const latest_run = getLatestArtifact(artifacts, 'eval_run');
|
|
141
|
+
const open_readiness_gate = getLatestOpenReadinessGate(open_gate_records);
|
|
142
|
+
return {
|
|
143
|
+
mode,
|
|
144
|
+
latest_plan,
|
|
145
|
+
latest_run,
|
|
146
|
+
expected_artifacts: getExpectedArtifacts(mode, phase, latest_run),
|
|
147
|
+
expected_gate: getExpectedGate(mode, phase),
|
|
148
|
+
open_readiness_gate,
|
|
149
|
+
requirements: getPhaseSpecificRequirements(mode, phase),
|
|
150
|
+
status_summary: buildStatusSummary(mode, phase, latest_plan, latest_run, open_readiness_gate),
|
|
151
|
+
harness_prompt_block: buildHarnessPromptBlock(mode, phase, latest_plan, latest_run, open_readiness_gate),
|
|
152
|
+
non_interference_rules: NON_INTERFERENCE_RULES,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
export function appendDevelopmentEvalChecks(base_checks, phase) {
|
|
156
|
+
if (phase === '6') {
|
|
157
|
+
return [...base_checks, 'development eval review'];
|
|
158
|
+
}
|
|
159
|
+
if (phase === '7') {
|
|
160
|
+
return [...base_checks, 'development eval runtime resolution'];
|
|
161
|
+
}
|
|
162
|
+
return base_checks;
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=development-evals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"development-evals.js","sourceRoot":"","sources":["../../src/domain/development-evals.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Domain Matching
|
|
3
|
+
* Version: 0.1.0
|
|
4
|
+
*/
|
|
5
|
+
import type { DomainMatch, KnowledgeDomain } from '../types.js';
|
|
6
|
+
export declare function normalizeTerm(term: string): string;
|
|
7
|
+
export declare function matchDomains(tags: string[], domains: KnowledgeDomain[]): DomainMatch[];
|
|
8
|
+
//# sourceMappingURL=matching.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matching.d.ts","sourceRoot":"","sources":["../../src/domain/matching.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEhE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,WAAW,EAAE,CAiBtF"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Domain Matching
|
|
3
|
+
* Version: 0.1.0
|
|
4
|
+
*/
|
|
5
|
+
export function normalizeTerm(term) {
|
|
6
|
+
return term.toLowerCase().replace(/[.\-_\s]/g, '');
|
|
7
|
+
}
|
|
8
|
+
export function matchDomains(tags, domains) {
|
|
9
|
+
if (tags.length === 0) {
|
|
10
|
+
return [];
|
|
11
|
+
}
|
|
12
|
+
const normalized_tags = new Set(tags.map(normalizeTerm));
|
|
13
|
+
return domains
|
|
14
|
+
.map((domain) => {
|
|
15
|
+
const strong = domain.strong_keywords.filter((k) => normalized_tags.has(normalizeTerm(k)));
|
|
16
|
+
const weak = domain.weak_keywords.filter((k) => normalized_tags.has(normalizeTerm(k)));
|
|
17
|
+
const relevance = (strong.length + weak.length) / Math.max(1, normalized_tags.size);
|
|
18
|
+
const persisted = strong.length >= 1 && relevance >= 0.60;
|
|
19
|
+
return { domain, relevance, strong_matches: strong, weak_matches: weak, persisted };
|
|
20
|
+
})
|
|
21
|
+
.filter((m) => m.relevance >= 0.30)
|
|
22
|
+
.sort((a, b) => b.relevance - a.relevance);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=matching.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matching.js","sourceRoot":"","sources":["../../src/domain/matching.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAc,EAAE,OAA0B;IACrE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;IAEzD,OAAO,OAAO;SACX,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QACd,MAAM,MAAM,GAAG,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3F,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvF,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;QACpF,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,SAAS,IAAI,IAAI,CAAC;QAC1D,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IACtF,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC;SAClC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Odin Phase Contracts
|
|
3
|
+
* Version: 0.1.0
|
|
4
|
+
*/
|
|
5
|
+
import type { PhaseAgentInstructions, PhaseContract, PhaseId } from '../types.js';
|
|
6
|
+
export declare function getPhaseContract(phase: PhaseId): PhaseContract;
|
|
7
|
+
export declare function getPhaseAgentInstructions(phase: PhaseId): PhaseAgentInstructions;
|
|
8
|
+
export declare function getNextPhaseId(phase: PhaseId): PhaseId | null;
|
|
9
|
+
export declare function isWatchedPhase(phase: PhaseId): boolean;
|
|
10
|
+
//# sourceMappingURL=phases.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phases.d.ts","sourceRoot":"","sources":["../../src/domain/phases.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAuJlF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,CAE9D;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,sBAAsB,CAEhF;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI,CAG7D;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEtD"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Odin Phase Contracts
|
|
3
|
+
* Version: 0.1.0
|
|
4
|
+
*/
|
|
5
|
+
const PHASE_CONTRACTS = {
|
|
6
|
+
'0': {
|
|
7
|
+
id: '0',
|
|
8
|
+
name: 'Planning',
|
|
9
|
+
purpose: 'Establish the feature request and prepare the workflow entry point.',
|
|
10
|
+
definition_of_done: ['Feature request understood', 'Next phase identified'],
|
|
11
|
+
required_artifacts: [],
|
|
12
|
+
allowed_next_phases: ['1'],
|
|
13
|
+
},
|
|
14
|
+
'1': {
|
|
15
|
+
id: '1',
|
|
16
|
+
name: 'Product',
|
|
17
|
+
purpose: 'Capture the product requirements for the feature.',
|
|
18
|
+
definition_of_done: ['PRD or exemption recorded', 'Success / non-goals / failure shape captured'],
|
|
19
|
+
required_artifacts: ['prd'],
|
|
20
|
+
allowed_next_phases: ['2'],
|
|
21
|
+
},
|
|
22
|
+
'2': {
|
|
23
|
+
id: '2',
|
|
24
|
+
name: 'Discovery',
|
|
25
|
+
purpose: 'Gather requirements, context, and technical constraints.',
|
|
26
|
+
definition_of_done: ['Requirements recorded', 'Eval-relevant scenarios captured'],
|
|
27
|
+
required_artifacts: ['requirements'],
|
|
28
|
+
allowed_next_phases: ['3'],
|
|
29
|
+
},
|
|
30
|
+
'3': {
|
|
31
|
+
id: '3',
|
|
32
|
+
name: 'Architect',
|
|
33
|
+
purpose: 'Produce the technical spec and task shape.',
|
|
34
|
+
definition_of_done: ['Spec recorded', 'Tasks recorded', 'Eval plan recorded when required'],
|
|
35
|
+
required_artifacts: ['spec', 'tasks'],
|
|
36
|
+
allowed_next_phases: ['4'],
|
|
37
|
+
},
|
|
38
|
+
'4': {
|
|
39
|
+
id: '4',
|
|
40
|
+
name: 'Guardian',
|
|
41
|
+
purpose: 'Review the plan for correctness, quality, and risk before build.',
|
|
42
|
+
definition_of_done: ['Review recorded', 'Eval readiness decided when required'],
|
|
43
|
+
required_artifacts: ['review'],
|
|
44
|
+
allowed_next_phases: ['5'],
|
|
45
|
+
},
|
|
46
|
+
'5': {
|
|
47
|
+
id: '5',
|
|
48
|
+
name: 'Builder',
|
|
49
|
+
purpose: 'Implement the approved specification.',
|
|
50
|
+
definition_of_done: ['Implementation completed', 'Build/test obligations met'],
|
|
51
|
+
required_artifacts: ['spec', 'tasks'],
|
|
52
|
+
allowed_next_phases: ['6'],
|
|
53
|
+
},
|
|
54
|
+
'6': {
|
|
55
|
+
id: '6',
|
|
56
|
+
name: 'Reviewer',
|
|
57
|
+
purpose: 'Run security and unit-test quality review before integration.',
|
|
58
|
+
definition_of_done: ['Security review completed', 'Test quality evaluation completed', 'Eval run recorded when required'],
|
|
59
|
+
required_artifacts: ['review'],
|
|
60
|
+
allowed_next_phases: ['7'],
|
|
61
|
+
},
|
|
62
|
+
'7': {
|
|
63
|
+
id: '7',
|
|
64
|
+
name: 'Integrator',
|
|
65
|
+
purpose: 'Validate build/runtime behavior and final integration correctness.',
|
|
66
|
+
definition_of_done: ['Integration validation complete', 'Partial eval state resolved when required'],
|
|
67
|
+
required_artifacts: ['spec', 'tasks'],
|
|
68
|
+
allowed_next_phases: ['8'],
|
|
69
|
+
},
|
|
70
|
+
'8': {
|
|
71
|
+
id: '8',
|
|
72
|
+
name: 'Documenter',
|
|
73
|
+
purpose: 'Update docs and finalize implementation notes.',
|
|
74
|
+
definition_of_done: ['Documentation notes recorded'],
|
|
75
|
+
required_artifacts: ['documentation'],
|
|
76
|
+
allowed_next_phases: ['9'],
|
|
77
|
+
},
|
|
78
|
+
'9': {
|
|
79
|
+
id: '9',
|
|
80
|
+
name: 'Release',
|
|
81
|
+
purpose: 'Prepare the feature for PR, archival, and completion.',
|
|
82
|
+
definition_of_done: ['Release notes recorded', 'Feature artifacts archived via odin.archive_feature_release'],
|
|
83
|
+
required_artifacts: ['release_notes'],
|
|
84
|
+
allowed_next_phases: ['10'],
|
|
85
|
+
},
|
|
86
|
+
'10': {
|
|
87
|
+
id: '10',
|
|
88
|
+
name: 'Complete',
|
|
89
|
+
purpose: 'The feature is fully complete.',
|
|
90
|
+
definition_of_done: ['Feature completed'],
|
|
91
|
+
required_artifacts: [],
|
|
92
|
+
allowed_next_phases: [],
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
const PHASE_AGENT_INSTRUCTIONS = {
|
|
96
|
+
'0': {
|
|
97
|
+
name: 'planning-agent',
|
|
98
|
+
role_summary: 'Translate the request into a workflow entry point.',
|
|
99
|
+
constraints: ['Do not skip the Product phase.'],
|
|
100
|
+
},
|
|
101
|
+
'1': {
|
|
102
|
+
name: 'product-agent',
|
|
103
|
+
role_summary: 'Create a product-ready PRD or exemption.',
|
|
104
|
+
constraints: ['Do not leak implementation details into the PRD.'],
|
|
105
|
+
},
|
|
106
|
+
'2': {
|
|
107
|
+
name: 'discovery-agent',
|
|
108
|
+
role_summary: 'Gather concrete requirements and technical context.',
|
|
109
|
+
constraints: ['Read existing artifacts before adding new assumptions.'],
|
|
110
|
+
},
|
|
111
|
+
'3': {
|
|
112
|
+
name: 'architect-agent',
|
|
113
|
+
role_summary: 'Turn the requirements into an implementation plan.',
|
|
114
|
+
constraints: ['Spec-first: do not implement code here.', 'Record eval planning when required.'],
|
|
115
|
+
},
|
|
116
|
+
'4': {
|
|
117
|
+
name: 'guardian-agent',
|
|
118
|
+
role_summary: 'Review for quality, risk, and readiness to build.',
|
|
119
|
+
constraints: ['Do not approve weak or ambiguous specs.', 'Development eval readiness never overrides formal verification or other gates.'],
|
|
120
|
+
},
|
|
121
|
+
'5': {
|
|
122
|
+
name: 'builder-agent',
|
|
123
|
+
role_summary: 'Implement the approved plan with high code quality.',
|
|
124
|
+
constraints: ['Emit watched-phase claims when required.'],
|
|
125
|
+
},
|
|
126
|
+
'6': {
|
|
127
|
+
name: 'reviewer-agent',
|
|
128
|
+
role_summary: 'Run security and unit-test quality checks and summarize the result.',
|
|
129
|
+
constraints: ['High and critical findings block progression.', 'Weak or missing tests send the feature back to Builder.', 'Passing eval runs do not override security failures.'],
|
|
130
|
+
},
|
|
131
|
+
'7': {
|
|
132
|
+
name: 'integrator-agent',
|
|
133
|
+
role_summary: 'Verify integrated behavior beyond compile/build success.',
|
|
134
|
+
constraints: ['Runtime validation matters, not just build success.', 'Resolve any partial eval state with observable end-state evidence.'],
|
|
135
|
+
},
|
|
136
|
+
'8': {
|
|
137
|
+
name: 'documenter-agent',
|
|
138
|
+
role_summary: 'Record the docs and operational notes needed for the feature.',
|
|
139
|
+
constraints: ['Capture changes while they are fresh.'],
|
|
140
|
+
},
|
|
141
|
+
'9': {
|
|
142
|
+
name: 'release-agent',
|
|
143
|
+
role_summary: 'Prepare PR, archival, and release metadata.',
|
|
144
|
+
constraints: ['Agents never merge; humans decide merges.'],
|
|
145
|
+
},
|
|
146
|
+
'10': {
|
|
147
|
+
name: 'complete-agent',
|
|
148
|
+
role_summary: 'The feature is complete and available for historical inspection.',
|
|
149
|
+
constraints: ['No further forward transitions exist.'],
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
export function getPhaseContract(phase) {
|
|
153
|
+
return PHASE_CONTRACTS[phase];
|
|
154
|
+
}
|
|
155
|
+
export function getPhaseAgentInstructions(phase) {
|
|
156
|
+
return PHASE_AGENT_INSTRUCTIONS[phase];
|
|
157
|
+
}
|
|
158
|
+
export function getNextPhaseId(phase) {
|
|
159
|
+
const allowed_next_phases = PHASE_CONTRACTS[phase].allowed_next_phases;
|
|
160
|
+
return allowed_next_phases[0] ?? null;
|
|
161
|
+
}
|
|
162
|
+
export function isWatchedPhase(phase) {
|
|
163
|
+
return phase === '5' || phase === '7' || phase === '9';
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=phases.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phases.js","sourceRoot":"","sources":["../../src/domain/phases.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality-gates.d.ts","sourceRoot":"","sources":["../../src/domain/quality-gates.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAErE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality-gates.js","sourceRoot":"","sources":["../../src/domain/quality-gates.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,UAAU,qBAAqB,CAAC,IAAuB;IAC3D,OAAO,GAAG,IAAI,CAAC,SAAS,WAAW,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,MAAM,GAAG,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resonance Scoring
|
|
3
|
+
* Version: 0.1.0
|
|
4
|
+
*
|
|
5
|
+
* Retrieval-time ranking signal for related learnings.
|
|
6
|
+
* Resonance is computed in-memory and NEVER written to confidence_score.
|
|
7
|
+
*/
|
|
8
|
+
export interface ResonanceInput {
|
|
9
|
+
id: string;
|
|
10
|
+
category: string;
|
|
11
|
+
confidence_score: number;
|
|
12
|
+
source_feature_id: string;
|
|
13
|
+
shared_domains: string[];
|
|
14
|
+
created_at: string;
|
|
15
|
+
}
|
|
16
|
+
export interface ResonanceScore {
|
|
17
|
+
learning_id: string;
|
|
18
|
+
density: number;
|
|
19
|
+
corroboration: number;
|
|
20
|
+
recency: number;
|
|
21
|
+
combined: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Compute resonance scores for a set of related learnings.
|
|
25
|
+
* Returns scores sorted by combined resonance (descending).
|
|
26
|
+
*
|
|
27
|
+
* Weights: density 0.3, corroboration 0.4, recency 0.3
|
|
28
|
+
* These are tuned for knowledge retrieval — corroboration (agreement
|
|
29
|
+
* from different features) is weighted highest as it's the strongest
|
|
30
|
+
* signal that a learning is broadly applicable.
|
|
31
|
+
*/
|
|
32
|
+
export declare function computeResonance(learnings: ResonanceInput[], now?: Date): ResonanceScore[];
|
|
33
|
+
//# sourceMappingURL=resonance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resonance.d.ts","sourceRoot":"","sources":["../../src/domain/resonance.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAqED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,cAAc,EAAE,EAC3B,GAAG,CAAC,EAAE,IAAI,GACT,cAAc,EAAE,CAwBlB"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resonance Scoring
|
|
3
|
+
* Version: 0.1.0
|
|
4
|
+
*
|
|
5
|
+
* Retrieval-time ranking signal for related learnings.
|
|
6
|
+
* Resonance is computed in-memory and NEVER written to confidence_score.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Compute domain density — how many learnings share each domain.
|
|
10
|
+
* Returns a map of domain key → count of learnings in that domain.
|
|
11
|
+
*/
|
|
12
|
+
function computeDomainDensity(learnings) {
|
|
13
|
+
const density = new Map();
|
|
14
|
+
for (const learning of learnings) {
|
|
15
|
+
for (const domain of learning.shared_domains) {
|
|
16
|
+
density.set(domain, (density.get(domain) ?? 0) + 1);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return density;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Density score: average density across this learning's shared domains,
|
|
23
|
+
* normalized to 0–1 using log scaling (caps at density 20+).
|
|
24
|
+
*/
|
|
25
|
+
function scoreDensity(learning, density_map) {
|
|
26
|
+
if (learning.shared_domains.length === 0) {
|
|
27
|
+
return 0;
|
|
28
|
+
}
|
|
29
|
+
let total = 0;
|
|
30
|
+
for (const domain of learning.shared_domains) {
|
|
31
|
+
total += density_map.get(domain) ?? 0;
|
|
32
|
+
}
|
|
33
|
+
const avg = total / learning.shared_domains.length;
|
|
34
|
+
return Math.min(1, Math.log2(avg + 1) / Math.log2(21));
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Corroboration score: how many other learnings from DIFFERENT features
|
|
38
|
+
* share at least one domain AND the same category.
|
|
39
|
+
* Normalized to 0–1 (caps at 5 corroborating learnings).
|
|
40
|
+
*/
|
|
41
|
+
function scoreCorroboration(learning, all_learnings) {
|
|
42
|
+
const domain_set = new Set(learning.shared_domains);
|
|
43
|
+
let count = 0;
|
|
44
|
+
for (const other of all_learnings) {
|
|
45
|
+
if (other.id === learning.id)
|
|
46
|
+
continue;
|
|
47
|
+
if (other.source_feature_id === learning.source_feature_id)
|
|
48
|
+
continue;
|
|
49
|
+
if (other.category !== learning.category)
|
|
50
|
+
continue;
|
|
51
|
+
const overlaps = other.shared_domains.some((d) => domain_set.has(d));
|
|
52
|
+
if (overlaps) {
|
|
53
|
+
count++;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return Math.min(1, count / 5);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Recency score: exponential decay based on age in days.
|
|
60
|
+
* Half-life of 30 days — a learning 30 days old scores 0.5.
|
|
61
|
+
*/
|
|
62
|
+
function scoreRecency(learning, now) {
|
|
63
|
+
const created = new Date(learning.created_at);
|
|
64
|
+
const age_ms = now.getTime() - created.getTime();
|
|
65
|
+
const age_days = Math.max(0, age_ms / (1000 * 60 * 60 * 24));
|
|
66
|
+
const half_life = 30;
|
|
67
|
+
return Math.pow(0.5, age_days / half_life);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Compute resonance scores for a set of related learnings.
|
|
71
|
+
* Returns scores sorted by combined resonance (descending).
|
|
72
|
+
*
|
|
73
|
+
* Weights: density 0.3, corroboration 0.4, recency 0.3
|
|
74
|
+
* These are tuned for knowledge retrieval — corroboration (agreement
|
|
75
|
+
* from different features) is weighted highest as it's the strongest
|
|
76
|
+
* signal that a learning is broadly applicable.
|
|
77
|
+
*/
|
|
78
|
+
export function computeResonance(learnings, now) {
|
|
79
|
+
if (learnings.length === 0) {
|
|
80
|
+
return [];
|
|
81
|
+
}
|
|
82
|
+
const reference = now ?? new Date();
|
|
83
|
+
const density_map = computeDomainDensity(learnings);
|
|
84
|
+
return learnings
|
|
85
|
+
.map((learning) => {
|
|
86
|
+
const density = scoreDensity(learning, density_map);
|
|
87
|
+
const corroboration = scoreCorroboration(learning, learnings);
|
|
88
|
+
const recency = scoreRecency(learning, reference);
|
|
89
|
+
const combined = 0.3 * density + 0.4 * corroboration + 0.3 * recency;
|
|
90
|
+
return {
|
|
91
|
+
learning_id: learning.id,
|
|
92
|
+
density: Math.round(density * 1000) / 1000,
|
|
93
|
+
corroboration: Math.round(corroboration * 1000) / 1000,
|
|
94
|
+
recency: Math.round(recency * 1000) / 1000,
|
|
95
|
+
combined: Math.round(combined * 1000) / 1000,
|
|
96
|
+
};
|
|
97
|
+
})
|
|
98
|
+
.sort((a, b) => b.combined - a.combined);
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=resonance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resonance.js","sourceRoot":"","sources":["../../src/domain/resonance.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAmBH;;;GAGG;AACH,SAAS,oBAAoB,CAAC,SAA2B;IACvD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,QAAwB,EAAE,WAAgC;IAC9E,IAAI,QAAQ,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzC,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;QAC7C,KAAK,IAAI,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,GAAG,GAAG,KAAK,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC;IACnD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC;AAED;;;;GAIG;AACH,SAAS,kBAAkB,CAAC,QAAwB,EAAE,aAA+B;IACnF,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IACpD,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QAClC,IAAI,KAAK,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE;YAAE,SAAS;QACvC,IAAI,KAAK,CAAC,iBAAiB,KAAK,QAAQ,CAAC,iBAAiB;YAAE,SAAS;QACrE,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,QAAQ;YAAE,SAAS;QAEnD,MAAM,QAAQ,GAAG,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACrE,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,EAAE,CAAC;QACV,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;AAChC,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,QAAwB,EAAE,GAAS;IACvD,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,EAAE,CAAC;IACrB,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,GAAG,SAAS,CAAC,CAAC;AAC7C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAC9B,SAA2B,EAC3B,GAAU;IAEV,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,SAAS,GAAG,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;IACpC,MAAM,WAAW,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAEpD,OAAO,SAAS;SACb,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;QAChB,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACpD,MAAM,aAAa,GAAG,kBAAkB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,GAAG,aAAa,GAAG,GAAG,GAAG,OAAO,CAAC;QAErE,OAAO;YACL,WAAW,EAAE,QAAQ,CAAC,EAAE;YACxB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,IAAI;YAC1C,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,IAAI;YACtD,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,IAAI;YAC1C,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,IAAI;SAC7C,CAAC;IACJ,CAAC,CAAC;SACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/domain/tasks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAkCH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,OAAO,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CA8BpG"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task Artifact Helpers
|
|
3
|
+
* Version: 0.1.0
|
|
4
|
+
*/
|
|
5
|
+
function isRecord(value) {
|
|
6
|
+
return value != null && typeof value === 'object' && !Array.isArray(value);
|
|
7
|
+
}
|
|
8
|
+
function normalizeTaskStatus(status) {
|
|
9
|
+
if (status === 'completed' || status === 'done') {
|
|
10
|
+
return 'completed';
|
|
11
|
+
}
|
|
12
|
+
if (status === 'in_progress' || status === 'in-progress') {
|
|
13
|
+
return 'in_progress';
|
|
14
|
+
}
|
|
15
|
+
return 'pending';
|
|
16
|
+
}
|
|
17
|
+
function completeTaskItem(value) {
|
|
18
|
+
if (!isRecord(value)) {
|
|
19
|
+
return { changed: false, value };
|
|
20
|
+
}
|
|
21
|
+
const previous_status = normalizeTaskStatus(value.status);
|
|
22
|
+
if (previous_status === 'completed') {
|
|
23
|
+
return { changed: false, value: { ...value, status: 'completed' } };
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
changed: true,
|
|
27
|
+
value: { ...value, status: 'completed' },
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export function completeTaskArtifactContent(content) {
|
|
31
|
+
if (Array.isArray(content)) {
|
|
32
|
+
let changed = false;
|
|
33
|
+
const next = content.map((item) => {
|
|
34
|
+
const result = completeTaskItem(item);
|
|
35
|
+
changed = changed || result.changed;
|
|
36
|
+
return result.value;
|
|
37
|
+
});
|
|
38
|
+
return { changed, content: next };
|
|
39
|
+
}
|
|
40
|
+
if (isRecord(content) && Array.isArray(content.tasks)) {
|
|
41
|
+
let changed = false;
|
|
42
|
+
const tasks = content.tasks.map((item) => {
|
|
43
|
+
const result = completeTaskItem(item);
|
|
44
|
+
changed = changed || result.changed;
|
|
45
|
+
return result.value;
|
|
46
|
+
});
|
|
47
|
+
return {
|
|
48
|
+
changed,
|
|
49
|
+
content: {
|
|
50
|
+
...content,
|
|
51
|
+
tasks,
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
return { changed: false, content };
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=tasks.js.map
|