14ff41faf5
Merge pull request 'feat(rules): rule creation becomes propose-then-approve (#3557)' (#141) from dev into main
main
bvandeusen2026-09-04 22:01:47 -04:00
1a34363059
feat(rules): the rule-creation tools ask for approval, and ask what would enforce it (#3557)
bvandeusenandClaude Opus 52026-09-04 20:02:05 -04:00
67df41ae00
Merge pull request 'feat(rules): the instruction surfaces say to RETRIEVE a rule, not only to receive one (#3523)' (#140) from dev into main
bvandeusen2026-09-03 22:07:10 -04:00
30d87e461a
feat(rules): the instruction surfaces say to RETRIEVE a rule, not only to receive one (#3523)
bvandeusenandClaude Opus 52026-09-03 21:41:53 -04:00
0915c48bb0
Merge pull request 'feat(telemetry): tell a ranker decline from a repeat before the observation window opens (#3497)' (#139) from dev into main
bvandeusen2026-09-03 21:23:01 -04:00
8be555d6dd
feat(telemetry): tell a ranker decline from a repeat before the observation window opens (#3497)
bvandeusenandClaude Opus 52026-09-03 21:12:38 -04:00
aea7b63b62
Merge pull request 'fix(telemetry): both rule arms logged only their hits, so the clear-rate could only read 100% (#3497)' (#138) from dev into main
bvandeusen2026-09-03 07:19:08 -04:00
154a5de13e
fix(telemetry): both rule arms logged only their hits, so the clear-rate could only read 100% (#3497)
bvandeusenandClaude Opus 52026-09-03 06:57:13 -04:00
5b02908dfd
dev → main: rules become measurable at the preload, and retrievable at the tool call (#137)
bvandeusen2026-09-02 23:41:09 -04:00
8b9b3a1d9b
feat(telemetry): the preload emits, and the always-on set stops being unfalsifiable (#3473)
bvandeusenandClaude Opus 52026-09-02 23:06:40 -04:00
34cd389371
dev → main: rule usage telemetry, the plugin's derived version (#136)
bvandeusen2026-09-02 18:52:20 -04:00
6627cfc2f0
feat(rules): a usage badge on the rule list, and the badge becomes canon instead of a second copy (#3319)
bvandeusenandClaude Opus 52026-09-02 18:37:55 -04:00
238510080e
feat(retrieval): the standing-rule arm gets its own bar, and asks for one rule not two (#3318)
bvandeusenandClaude Opus 52026-09-02 18:05:00 -04:00
8901c904a9
feat(telemetry): retrieval_telemetry reports rule pull-through where it reported nothing (#3317)
bvandeusenandClaude Opus 52026-09-02 17:25:11 -04:00
70761b16d9
test(telemetry): the rule-arm fixture never reached the arm — it returned at the guard (#3316)
bvandeusenandClaude Opus 52026-09-02 17:17:59 -04:00
8f7f447fda
feat(telemetry): the rule arm records what it showed, and get_rule records the read (#3316)
bvandeusenandClaude Opus 52026-09-02 17:15:03 -04:00
111eef7e30
fix(telemetry): the user-scoped rule_usage export read _rule_ids before it existed (#3315)
bvandeusenandClaude Opus 52026-09-02 16:56:54 -04:00
8826be7a91
feat(telemetry): rule_usage_events — the table, the service, and a restore that maps rule ids through the rule map (#3315)
bvandeusenandClaude Opus 52026-09-02 16:55:22 -04:00
e029a7db64
fix(frontend): every request carries a deadline, and expiry arrives as an error callers already handle (#3412)
bvandeusenandClaude Opus 52026-09-02 14:59:41 -04:00
9bb59b73ba
feat(frontend): the app says what it is running, and says so honestly when it cannot find out (#3329)
bvandeusenandClaude Opus 52026-09-02 11:23:43 -04:00
f5a3643da8
refactor(plugin): retire what the hand-bump scheme left behind — the README that taught it, the floor test, the stale rationale (#3328)
bvandeusenandClaude Opus 52026-09-02 00:38:50 -04:00
ea972ac3f7
refactor(plugin): one definition of what ships, and the exclusion that makes the version check mean something (#3326)
bvandeusenandClaude Opus 52026-09-01 18:28:26 -04:00
0d4b155699
feat(telemetry): pull-through per surface, not just per corpus (#3311)
bvandeusen2026-08-31 15:52:17 -04:00
05da26eb24
ci(integration): the run: shell is dash, not busybox (#3237)
bvandeusen2026-08-31 08:24:14 -04:00
70d84fbfd7
ci(integration): print the runner facts that rules 79 and 81 assert (#3237)
bvandeusen2026-08-31 08:20:11 -04:00
9d8104f7a5
fix(embeddings): key_share alone is FOR NO KEY UPDATE, not FOR KEY SHARE (#3262)
bvandeusen2026-08-31 08:13:29 -04:00
7827b4ce63
fix(embeddings): the index refresh loses the race it used to deadlock (#3262)
bvandeusen2026-08-31 08:09:09 -04:00
69ce7afc45
fix(ci): /api/version reported the channel where the build belongs (rule 149)
bvandeusenandClaude Opus 52026-08-31 00:45:22 -04:00
b267037911
Two milestones: a note can carry its own check (317), and a rule keeps what it used to say (323) (#135)
bvandeusen2026-08-31 00:01:15 -04:00
5c9bb40777
feat(rules): a session is told when its rules move under it (#3244, milestone 323 step 5)
bvandeusenandClaude Opus 52026-08-30 13:02:00 -04:00
a8b2040216
feat(rules): the edit history is visible in the slide-over (#3243, milestone 323 step 4)
bvandeusenandClaude Opus 52026-08-30 12:52:07 -04:00
0704988528
feat(rules): the history is readable — service, REST and MCP (#3242, milestone 323 step 3)
bvandeusenandClaude Opus 52026-08-29 23:46:15 -04:00
255c43a8fe
fix(tests): the rule-history fixture must not delete a book the embedder is still writing (#3241)
bvandeusenandClaude Opus 52026-08-29 23:28:03 -04:00
9006affda8
feat(rules): a rule keeps what it used to say — rule_versions (#3240, milestone 323 step 1)
bvandeusenandClaude Opus 52026-08-29 18:38:16 -04:00
9657478500
docs(notes): the guidance gains the sharper test and the three false candidates (#3180, milestone 317 step 6)
bvandeusen2026-08-29 00:16:18 -04:00
1d65e98ac2
docs(notes): the surfaces say WHEN a note earns a check, and a guard keeps them saying it (#3168, milestone 317 step 5)
bvandeusen2026-08-29 00:10:43 -04:00
1ec44071d2
feat(ui): a note's check is editable, dated and sweepable (#3167, milestone 317 step 4)
bvandeusen2026-08-28 22:04:00 -04:00
b51621fca7
fix(tests): the sweep assertions read the WHERE clause, not the SELECT list (#3166)
bvandeusen2026-08-28 16:59:41 -04:00
8489206224
feat(notes): the sweep — which notes assert a fact nobody has confirmed (#3166, milestone 317 step 3)
bvandeusen2026-08-28 16:39:50 -04:00
4736a0a0ba
fix(tests): the recurrence stand-ins come from fake_note, not a bare MagicMock (#3164)
bvandeusen2026-08-28 16:01:28 -04:00
700ef20eb0
feat(notes): a note's check is writable through both doors, and empty means empty (#3164, milestone 317 step 2)
bvandeusen2026-08-28 15:42:12 -04:00
b134fe9aa1
fix(tests): the column guard names join tables as _BACKED_UP holds them (#3182)
bvandeusen2026-08-28 15:24:38 -04:00
a6ef3a6a5a
fix(backup): a restore stops flattening the record vocabulary, and a column guard stops the next one (#3182)
bvandeusen2026-08-28 15:22:50 -04:00
2263fd04a4
fix(tests): the notes table has 27 columns — deleted_batch_id is the second deliberate exclusion (#3165)
bvandeusen2026-08-28 14:55:44 -04:00
2065781302
feat(notes): a note can carry its own check — verify_with, expires_when, verified_at (#3165, milestone 317 step 1)
bvandeusen2026-08-28 14:54:07 -04:00
454c617ca0
docs(models): the record-splitting rule gets a findable home — note 3163 (#3128 rec 9)
bvandeusen2026-08-28 13:11:02 -04:00
f80401d58e
fix(knowledge): the browse vocabulary catches up three kinds, and a snippet's mirror survives the generic door (#3128 recs 2-6)
bvandeusen2026-08-28 12:06:43 -04:00
d0a2733cb6
fix(design): text on a tint of itself now clears AA app-wide, and the check gates it (#3141)
bvandeusenandClaude Opus 52026-08-27 21:38:09 -04:00
0c74dc8275
fix(design): badge text clears AA — the ladder was painting a hue on a tint of itself (#3132)
bvandeusenandClaude Opus 52026-08-27 19:11:14 -04:00
056c7c75da
A task's kind is correctable — the Kind select stops lying (#3129)
bvandeusen2026-08-27 18:05:16 -04:00
63036ed52e
merge: bring main's rebased history into dev after PR #132bvandeusen2026-08-27 18:00:32 -04:00
2e39dca9cf
fix(tasks): import minted_kind by name — a stubbed service must not stub the guard (#3129)
bvandeusenandClaude Opus 52026-08-27 15:57:06 -04:00
5aabc31ee7
Rules that can go stale say so — verify_with, expires_when, the sweep, and task_kind='spike' (milestone 312, steps 1–5)
bvandeusen2026-08-27 13:43:57 -04:00
e2e64b94c0
feat(tasks): task_kind gains 'spike' — the investigation, not the change (#3099, milestone 312 step 5)
bvandeusenandClaude Opus 52026-08-27 12:02:41 -04:00
3345be84d1
feat(rules): the check is editable, visible, and sweepable in the UI (#3098, milestone 312 step 4)
bvandeusenandClaude Opus 52026-08-27 11:53:35 -04:00
35c632f834
docs(rules): a project rule is shaped differently, not just scoped differently (milestone 312)
bvandeusenandClaude Opus 52026-08-27 11:29:10 -04:00
b97f57ee7f
feat(rules): the staleness sweep — which standing rules assert a fact nobody has confirmed (#3097, milestone 312 step 3)
bvandeusenandClaude Opus 52026-08-27 10:49:47 -04:00
91b34619f9
feat(rules): the write path carries a rule's check, and empty finally means empty (#3096, milestone 312 step 2)
bvandeusenandClaude Opus 52026-08-27 09:28:03 -04:00
3d4f5be711
feat(rules): a rule can carry its own check — verify_with, expires_when, verified_at (#3095, milestone 312 step 1)
bvandeusenandClaude Opus 52026-08-27 07:44:13 -04:00
88e9c0b0bd
feat(tasks): task_kind gains 'spike' — the investigation, not the change (#3099, milestone 312 step 5)
bvandeusenandClaude Opus 52026-08-27 12:02:41 -04:00
c83bedf3be
feat(rules): the check is editable, visible, and sweepable in the UI (#3098, milestone 312 step 4)
bvandeusenandClaude Opus 52026-08-27 11:53:35 -04:00
9d7485df2d
docs(rules): a project rule is shaped differently, not just scoped differently (milestone 312)
bvandeusenandClaude Opus 52026-08-27 11:29:10 -04:00
410d616c22
feat(rules): the staleness sweep — which standing rules assert a fact nobody has confirmed (#3097, milestone 312 step 3)
bvandeusenandClaude Opus 52026-08-27 10:49:47 -04:00
c61925be76
feat(rules): the write path carries a rule's check, and empty finally means empty (#3096, milestone 312 step 2)
bvandeusenandClaude Opus 52026-08-27 09:28:03 -04:00
e08e999406
feat(rules): a rule can carry its own check — verify_with, expires_when, verified_at (#3095, milestone 312 step 1)
bvandeusenandClaude Opus 52026-08-27 07:44:13 -04:00
02c1e37620
feat(rules): the write path can notice a standing rule it was never given (#3031, milestone 307 step 5, hook arm)
bvandeusenandClaude Opus 52026-08-26 16:35:36 -04:00
cd9aa87aa4
feat(rules): tier 1 preloads, tier 2 arrives by area — and a split rule can no longer be read half-way (#3031, milestone 307 step 5)
bvandeusenandClaude Opus 52026-08-26 15:10:41 -04:00
8b60d552d2
feat(rules): the rule editor asks when it applies, and the list shows its age (#3029, milestone 307 step 3, UI)
bvandeusenandClaude Opus 52026-08-26 14:23:40 -04:00
ffb7a0fe38
feat(rules): both doors carry the trigger, the tier, the areas and the edges (#3029, milestone 307 step 3, surfaces)
bvandeusenandClaude Opus 52026-08-26 14:17:41 -04:00
6ddb8bf859
feat(rules): a rule can say when it applies, which area it is about, and what it belongs with (#3029, milestone 307 step 3, schema)
bvandeusenandClaude Opus 52026-08-26 14:11:32 -04:00
c58529718b
feat(systems): the catalog reaches the moment a name is minted, and gets a face (#3028, milestone 307 step 2)
bvandeusenandClaude Opus 52026-08-26 12:58:30 -04:00
a97547fbc6
feat(systems): the area vocabulary becomes a global table so a rule can point at one (#3027, milestone 307 step 1)
bvandeusenandClaude Opus 52026-08-26 12:31:18 -04:00
6b1f5e8031
Merge pull request 'Three fixes where the capability already existed and only the door was missing (#2782, #2975, #2278)' (#130) from dev into main
bvandeusen2026-08-24 07:56:44 -04:00
a8f35e465e
refactor(plugin+tests): the last two parallel-family gaps — pageable list tools, one config preamble (#2278)
bvandeusenandClaude Fable 52026-08-24 01:28:07 -04:00
64bfa5725f
feat(telemetry): a read surface over retrieval_logs — the tuning loop had no read half (#2975)
bvandeusenandClaude Fable 52026-08-23 22:48:54 -04:00