|
4 | 4 | <meta charset="utf-8" /> |
5 | 5 | <meta name="viewport" content="width=device-width, initial-scale=1" /> |
6 | 6 | <title>Codehead Systems — open source by Ned Wolpert</title> |
7 | | - <meta name="description" content="An open-source workshop of cryptography, authentication, and infrastructure libraries by engineer Ned Wolpert. Featuring pk-auth, mini-auth (a teachable identity suite), the Hofmann Elimination (OPAQUE PAKE), and a collection of JVM utilities." /> |
| 7 | + <meta name="description" content="An open-source workshop of cryptography, authentication, decision logic, and infrastructure libraries by engineer Ned Wolpert. Featuring pk-auth, mini-auth (a teachable identity suite), the Hofmann Elimination (OPAQUE PAKE), rule-engine (a forward-chaining rules engine for the JVM), and a collection of JVM utilities." /> |
8 | 8 | <meta name="theme-color" content="#0B0B0D" /> |
9 | 9 |
|
10 | 10 | <link rel="preconnect" href="https://fonts.googleapis.com" /> |
@@ -70,11 +70,11 @@ <h1 class="hero__title"> |
70 | 70 | <section id="projects" class="projects"> |
71 | 71 | <header class="section-head"> |
72 | 72 | <span class="mono-tiny">§ THE CATALOGUE</span> |
73 | | - <h2 class="section-head__title">Four corners of the workshop.</h2> |
| 73 | + <h2 class="section-head__title">Five corners of the workshop.</h2> |
74 | 74 | <p class="section-head__lede"> |
75 | | - The most recent four projects, each with its own discipline — passkeys, password-less |
76 | | - cryptography, a teachable identity suite, and the small Java tools |
77 | | - in between. |
| 75 | + The most recent five projects, each with its own discipline — passkeys, password-less |
| 76 | + cryptography, a teachable identity suite, deterministic decision |
| 77 | + logic, and the small Java tools in between. |
78 | 78 | </p> |
79 | 79 | </header> |
80 | 80 |
|
@@ -289,12 +289,117 @@ <h3 class="project__title">mini-auth</h3> |
289 | 289 | </div> |
290 | 290 | </article> |
291 | 291 |
|
292 | | - <!-- ─── 04 · Libraries ─── --> |
| 292 | + <!-- ─── 04 · rule-engine ─── --> |
293 | 293 | <article class="project"> |
294 | 294 | <header class="project__rail"> |
295 | 295 | <span class="mono-tiny">PROJECT</span> |
296 | 296 | <span class="project__num" aria-hidden="true">04</span> |
297 | | - <span class="mono-tiny project__rail-tag">D – UTILS</span> |
| 297 | + <span class="mono-tiny project__rail-tag">D – RULES</span> |
| 298 | + </header> |
| 299 | + |
| 300 | + <div class="project__body"> |
| 301 | + <div class="project__heading"> |
| 302 | + <h3 class="project__title">rule-engine</h3> |
| 303 | + <span class="project__kicker mono-tiny">rete · yaml / json · deterministic</span> |
| 304 | + </div> |
| 305 | + |
| 306 | + <p class="project__lede"> |
| 307 | + A forward-chaining rule engine for services where the rules |
| 308 | + change more often than the code deploys. |
| 309 | + </p> |
| 310 | + |
| 311 | + <p class="project__text"> |
| 312 | + An in-process, JVM rule engine that replaces nested conditionals |
| 313 | + with declarative rules written in YAML or JSON, validated against |
| 314 | + a published schema, and compiled once at startup into an |
| 315 | + immutable, thread-safe structure. The same facts in the same |
| 316 | + order produce the same firings, on any host, in any year, because |
| 317 | + the engine owns no clock — decisions stay explainable and |
| 318 | + reproducible long after they're made. |
| 319 | + </p> |
| 320 | + |
| 321 | + <ol class="sub-list"> |
| 322 | + <li> |
| 323 | + <div class="sub-list__row"> |
| 324 | + <span class="sub-list__name">rule-engine-core</span> |
| 325 | + <a href="https://github.com/codeheadsystems/rule-engine/tree/main/rule-engine-core" class="sub-list__link mono-tiny">view →</a> |
| 326 | + </div> |
| 327 | + <p class="sub-list__note">Working memory, matchers, and session management.</p> |
| 328 | + </li> |
| 329 | + <li> |
| 330 | + <div class="sub-list__row"> |
| 331 | + <span class="sub-list__name">rule-engine-compiler</span> |
| 332 | + <a href="https://github.com/codeheadsystems/rule-engine/tree/main/rule-engine-compiler" class="sub-list__link mono-tiny">view →</a> |
| 333 | + </div> |
| 334 | + <p class="sub-list__note">Rule validation and network compilation.</p> |
| 335 | + </li> |
| 336 | + <li> |
| 337 | + <div class="sub-list__row"> |
| 338 | + <span class="sub-list__name">rule-engine-dsl</span> |
| 339 | + <a href="https://github.com/codeheadsystems/rule-engine/tree/main/rule-engine-dsl" class="sub-list__link mono-tiny">view →</a> |
| 340 | + </div> |
| 341 | + <p class="sub-list__note">YAML / JSON rule-file parsing — the recommended entry point.</p> |
| 342 | + </li> |
| 343 | + <li> |
| 344 | + <div class="sub-list__row"> |
| 345 | + <span class="sub-list__name">rule-engine-cel</span> |
| 346 | + <a href="https://github.com/codeheadsystems/rule-engine/tree/main/rule-engine-cel" class="sub-list__link mono-tiny">view →</a> |
| 347 | + </div> |
| 348 | + <p class="sub-list__note">Optional Common Expression Language integration.</p> |
| 349 | + </li> |
| 350 | + <li> |
| 351 | + <div class="sub-list__row"> |
| 352 | + <span class="sub-list__name">rule-engine-schema</span> |
| 353 | + <a href="https://github.com/codeheadsystems/rule-engine/tree/main/rule-engine-schema" class="sub-list__link mono-tiny">view →</a> |
| 354 | + </div> |
| 355 | + <p class="sub-list__note">Optional fact schema validation.</p> |
| 356 | + </li> |
| 357 | + <li> |
| 358 | + <div class="sub-list__row"> |
| 359 | + <span class="sub-list__name">rule-engine-observability</span> |
| 360 | + <a href="https://github.com/codeheadsystems/rule-engine/tree/main/rule-engine-observability" class="sub-list__link mono-tiny">view →</a> |
| 361 | + </div> |
| 362 | + <p class="sub-list__note">Tracing, diagnostics, and match explanation.</p> |
| 363 | + </li> |
| 364 | + <li> |
| 365 | + <div class="sub-list__row"> |
| 366 | + <span class="sub-list__name">rule-engine-testkit</span> |
| 367 | + <a href="https://github.com/codeheadsystems/rule-engine/tree/main/rule-engine-testkit" class="sub-list__link mono-tiny">view →</a> |
| 368 | + </div> |
| 369 | + <p class="sub-list__note">Test fixtures and verification harnesses.</p> |
| 370 | + </li> |
| 371 | + </ol> |
| 372 | + |
| 373 | + <p class="project__text"> |
| 374 | + Pattern matching supports joins, negation (<code>notExists</code>), |
| 375 | + universal quantification (<code>forAll</code>), and aggregations |
| 376 | + (<code>accumulate</code>) as first-class constructs. Three |
| 377 | + independent matchers — a naive oracle, an indexed Rete-style |
| 378 | + network, and a streaming matcher — are required to agree on |
| 379 | + identical firing sequences. |
| 380 | + </p> |
| 381 | + |
| 382 | + <ul class="chips"> |
| 383 | + <li>Java 25</li><li>Gradle</li><li>Jackson 3</li><li>Rete</li><li>CEL</li><li>JSON Schema</li> |
| 384 | + </ul> |
| 385 | + |
| 386 | + <div class="project__links"> |
| 387 | + <a class="link-arrow link-arrow--lead" href="https://codeheadsystems.github.io/rule-engine/"> |
| 388 | + <span>visit the project site</span><span class="link-arrow__icon">↗</span> |
| 389 | + </a> |
| 390 | + <a class="link-arrow" href="https://github.com/codeheadsystems/rule-engine"> |
| 391 | + <span>view source</span><span class="link-arrow__icon">↗</span> |
| 392 | + </a> |
| 393 | + </div> |
| 394 | + </div> |
| 395 | + </article> |
| 396 | + |
| 397 | + <!-- ─── 05 · Libraries ─── --> |
| 398 | + <article class="project"> |
| 399 | + <header class="project__rail"> |
| 400 | + <span class="mono-tiny">PROJECT</span> |
| 401 | + <span class="project__num" aria-hidden="true">05</span> |
| 402 | + <span class="mono-tiny project__rail-tag">E – UTILS</span> |
298 | 403 | </header> |
299 | 404 |
|
300 | 405 | <div class="project__body"> |
|
0 commit comments