fpf-thinking-map 1.4.2__tar.gz → 1.4.3__tar.gz
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.
- {fpf_thinking_map-1.4.2 → fpf_thinking_map-1.4.3}/PKG-INFO +8 -3
- {fpf_thinking_map-1.4.2 → fpf_thinking_map-1.4.3}/README.md +7 -2
- {fpf_thinking_map-1.4.2 → fpf_thinking_map-1.4.3}/fpf_thinking_map/ADVISORIES.md +17 -1
- {fpf_thinking_map-1.4.2 → fpf_thinking_map-1.4.3}/fpf_thinking_map.egg-info/PKG-INFO +8 -3
- {fpf_thinking_map-1.4.2 → fpf_thinking_map-1.4.3}/pyproject.toml +1 -1
- {fpf_thinking_map-1.4.2 → fpf_thinking_map-1.4.3}/LICENSE +0 -0
- {fpf_thinking_map-1.4.2 → fpf_thinking_map-1.4.3}/fpf_thinking_map/FPF_AUDIT_RESPONSE.md +0 -0
- {fpf_thinking_map-1.4.2 → fpf_thinking_map-1.4.3}/fpf_thinking_map/FPF_FLOOR_MAP.md +0 -0
- {fpf_thinking_map-1.4.2 → fpf_thinking_map-1.4.3}/fpf_thinking_map/FPF_SOURCE_TO_CODE_RELATION_AUDIT.md +0 -0
- {fpf_thinking_map-1.4.2 → fpf_thinking_map-1.4.3}/fpf_thinking_map/README.md +0 -0
- {fpf_thinking_map-1.4.2 → fpf_thinking_map-1.4.3}/fpf_thinking_map/REJECTED_C32_CANDIDATE_SYNTHESIS.md +0 -0
- {fpf_thinking_map-1.4.2 → fpf_thinking_map-1.4.3}/fpf_thinking_map/REJECTED_NQD_OEE_CULTURAL_EVOLUTION.md +0 -0
- {fpf_thinking_map-1.4.2 → fpf_thinking_map-1.4.3}/fpf_thinking_map/RELATED_WORK_GOFLOW_FPF_SKILL.md +0 -0
- {fpf_thinking_map-1.4.2 → fpf_thinking_map-1.4.3}/fpf_thinking_map/SOURCES.md +0 -0
- {fpf_thinking_map-1.4.2 → fpf_thinking_map-1.4.3}/fpf_thinking_map/WHY_THIS_EXISTS.md +0 -0
- {fpf_thinking_map-1.4.2 → fpf_thinking_map-1.4.3}/fpf_thinking_map/__init__.py +0 -0
- {fpf_thinking_map-1.4.2 → fpf_thinking_map-1.4.3}/fpf_thinking_map/examples.py +0 -0
- {fpf_thinking_map-1.4.2 → fpf_thinking_map-1.4.3}/fpf_thinking_map/guards.py +0 -0
- {fpf_thinking_map-1.4.2 → fpf_thinking_map-1.4.3}/fpf_thinking_map/logic.py +0 -0
- {fpf_thinking_map-1.4.2 → fpf_thinking_map-1.4.3}/fpf_thinking_map/primitives.py +0 -0
- {fpf_thinking_map-1.4.2 → fpf_thinking_map-1.4.3}/fpf_thinking_map/py.typed +0 -0
- {fpf_thinking_map-1.4.2 → fpf_thinking_map-1.4.3}/fpf_thinking_map/state.py +0 -0
- {fpf_thinking_map-1.4.2 → fpf_thinking_map-1.4.3}/fpf_thinking_map/traversal.py +0 -0
- {fpf_thinking_map-1.4.2 → fpf_thinking_map-1.4.3}/fpf_thinking_map/verify.py +0 -0
- {fpf_thinking_map-1.4.2 → fpf_thinking_map-1.4.3}/fpf_thinking_map.egg-info/SOURCES.txt +0 -0
- {fpf_thinking_map-1.4.2 → fpf_thinking_map-1.4.3}/fpf_thinking_map.egg-info/dependency_links.txt +0 -0
- {fpf_thinking_map-1.4.2 → fpf_thinking_map-1.4.3}/fpf_thinking_map.egg-info/top_level.txt +0 -0
- {fpf_thinking_map-1.4.2 → fpf_thinking_map-1.4.3}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: fpf-thinking-map
|
|
3
|
-
Version: 1.4.
|
|
3
|
+
Version: 1.4.3
|
|
4
4
|
Summary: Agentic thinking map — structured reasoning constraints for LLMs with TTL evidence decay, deterministic guards, and propositional logic glue. Compiled from FPF (First Principles Framework).
|
|
5
5
|
Author-email: "prichindel.com" <igareosh@igareosh.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -26,7 +26,7 @@ Dynamic: license-file
|
|
|
26
26
|
|
|
27
27
|
# prichindel.com Agentic Thinking Map
|
|
28
28
|
|
|
29
|
-
**v1.4.
|
|
29
|
+
**v1.4.3** — [FPF (First Principles Framework)](https://github.com/ailev/FPF), compiled into a small traversal map for LLM agents.
|
|
30
30
|
|
|
31
31
|
A Python package that gives a model a bounded move board instead of a giant framework to digest at runtime. Instead of rereading a sprawling semantic corpus and improvising from it, the model gets a small JSON slice: what context it is in, what move is open, what evidence is missing, what is risky, and what outcome class applies.
|
|
32
32
|
|
|
@@ -234,6 +234,11 @@ The model's job shrinks from "figure out the entire epistemic state of your own
|
|
|
234
234
|
- **Four more advisories** (`ADV-03`–`ADV-06`), found the same way as `ADV-01`/`ADV-02` — running scenarios through `dev_mcp`, not inspection. The one to actually read: **`ADV-03`** — `RuntimeBinding.active_context_id` is self-asserted input, never verified against having actually crossed a bridge; a caller can claim any context directly and get the identical `CONTINUE` a licensed `cross_bridge()` call would produce. `ADV-04` — contradiction detection between `DecisionRule`s is opt-in via `exclusive_with`, not inferred from opposite-looking action names. `ADV-05` — gate `DEGRADE` only distinguishes partial evidence when related facts are grouped into *one* `GateCheck`; split across separate checks, "one of three known" collapses to indistinguishable from "none known." `ADV-06` — `agency_level` (PASSIVE/REACTIVE/AUTONOMOUS/DELIBERATIVE) is descriptive metadata only, same shape as `risk_level` (`ADV-02`) — nothing stops a `PASSIVE` role from firing what a `DELIBERATIVE` role can.
|
|
235
235
|
- `check_advisories_content` now asserts all six advisory IDs are present, not just the original two.
|
|
236
236
|
|
|
237
|
+
## v1.4.3 changes
|
|
238
|
+
|
|
239
|
+
- **`ADV-07`** — the sharpest advisory yet, called out at the top of `ADVISORIES.md` alongside `ADV-03`. `RiskAbove(threshold)` matches `risk_level` against a fixed table via plain dict lookup; anything not found — including a correctly-spelled value in the wrong case (`"CRITICAL"` vs. `"critical"`) — silently resolves to `"normal"`. Confirmed directly: a `RiskAbove("critical")` rule wired exactly as `ADV-02` recommends returns the *opposite* routed action for `"CRITICAL"` vs. `"critical"`, with no error, no warning, `consistency_check()` reporting `True` either way. Following the library's own documented fix for `ADV-02` does not protect you from this — normalize and validate `risk_level` at your harness boundary before it reaches the engine.
|
|
240
|
+
- `check_advisories_content` now asserts all seven advisory IDs.
|
|
241
|
+
|
|
237
242
|
## Design principles
|
|
238
243
|
|
|
239
244
|
- **Only add structure when it changes agentic behavior** — not for source fidelity alone
|
|
@@ -331,4 +336,4 @@ MIT. See [LICENSE](LICENSE).
|
|
|
331
336
|
|
|
332
337
|
---
|
|
333
338
|
|
|
334
|
-
**prichindel.com** — v1.4.
|
|
339
|
+
**prichindel.com** — v1.4.3 — 2026-07-08
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# prichindel.com Agentic Thinking Map
|
|
2
2
|
|
|
3
|
-
**v1.4.
|
|
3
|
+
**v1.4.3** — [FPF (First Principles Framework)](https://github.com/ailev/FPF), compiled into a small traversal map for LLM agents.
|
|
4
4
|
|
|
5
5
|
A Python package that gives a model a bounded move board instead of a giant framework to digest at runtime. Instead of rereading a sprawling semantic corpus and improvising from it, the model gets a small JSON slice: what context it is in, what move is open, what evidence is missing, what is risky, and what outcome class applies.
|
|
6
6
|
|
|
@@ -208,6 +208,11 @@ The model's job shrinks from "figure out the entire epistemic state of your own
|
|
|
208
208
|
- **Four more advisories** (`ADV-03`–`ADV-06`), found the same way as `ADV-01`/`ADV-02` — running scenarios through `dev_mcp`, not inspection. The one to actually read: **`ADV-03`** — `RuntimeBinding.active_context_id` is self-asserted input, never verified against having actually crossed a bridge; a caller can claim any context directly and get the identical `CONTINUE` a licensed `cross_bridge()` call would produce. `ADV-04` — contradiction detection between `DecisionRule`s is opt-in via `exclusive_with`, not inferred from opposite-looking action names. `ADV-05` — gate `DEGRADE` only distinguishes partial evidence when related facts are grouped into *one* `GateCheck`; split across separate checks, "one of three known" collapses to indistinguishable from "none known." `ADV-06` — `agency_level` (PASSIVE/REACTIVE/AUTONOMOUS/DELIBERATIVE) is descriptive metadata only, same shape as `risk_level` (`ADV-02`) — nothing stops a `PASSIVE` role from firing what a `DELIBERATIVE` role can.
|
|
209
209
|
- `check_advisories_content` now asserts all six advisory IDs are present, not just the original two.
|
|
210
210
|
|
|
211
|
+
## v1.4.3 changes
|
|
212
|
+
|
|
213
|
+
- **`ADV-07`** — the sharpest advisory yet, called out at the top of `ADVISORIES.md` alongside `ADV-03`. `RiskAbove(threshold)` matches `risk_level` against a fixed table via plain dict lookup; anything not found — including a correctly-spelled value in the wrong case (`"CRITICAL"` vs. `"critical"`) — silently resolves to `"normal"`. Confirmed directly: a `RiskAbove("critical")` rule wired exactly as `ADV-02` recommends returns the *opposite* routed action for `"CRITICAL"` vs. `"critical"`, with no error, no warning, `consistency_check()` reporting `True` either way. Following the library's own documented fix for `ADV-02` does not protect you from this — normalize and validate `risk_level` at your harness boundary before it reaches the engine.
|
|
214
|
+
- `check_advisories_content` now asserts all seven advisory IDs.
|
|
215
|
+
|
|
211
216
|
## Design principles
|
|
212
217
|
|
|
213
218
|
- **Only add structure when it changes agentic behavior** — not for source fidelity alone
|
|
@@ -305,4 +310,4 @@ MIT. See [LICENSE](LICENSE).
|
|
|
305
310
|
|
|
306
311
|
---
|
|
307
312
|
|
|
308
|
-
**prichindel.com** — v1.4.
|
|
313
|
+
**prichindel.com** — v1.4.3 — 2026-07-08
|
|
@@ -4,6 +4,8 @@ Not defects. These are places where `fpf_thinking_map` deliberately stays minima
|
|
|
4
4
|
|
|
5
5
|
Each advisory: what the default behavior actually is, why that's the default, and exactly how to get stricter behavior if your domain needs it.
|
|
6
6
|
|
|
7
|
+
**Read these two first if you read nothing else here: [`ADV-03`](#adv-03--active_context_id-is-self-asserted-not-verified-against-how-you-got-there) (context claims aren't verified) and [`ADV-07`](#adv-07--riskaboves-string-matching-is-case-sensitive-and-fails-silently) (a routing rule built exactly as this doc recommends can still silently do the opposite of what you intended). Both are silent — no error, no warning — and both sit directly behind paths this document itself tells you to use.**
|
|
8
|
+
|
|
7
9
|
---
|
|
8
10
|
|
|
9
11
|
## ADV-01 — Evidence staleness warns, it does not block
|
|
@@ -68,4 +70,18 @@ Each advisory: what the default behavior actually is, why that's the default, an
|
|
|
68
70
|
|
|
69
71
|
---
|
|
70
72
|
|
|
71
|
-
|
|
73
|
+
## ADV-07 — `RiskAbove`'s string matching is case-sensitive and fails silently
|
|
74
|
+
|
|
75
|
+
**The other one to read before you ship. Following `ADV-02`'s own advice does not protect you from this.**
|
|
76
|
+
|
|
77
|
+
**What**: `RiskAbove(threshold)` compares `binding.risk_level` against a fixed internal table (`{"low": 0, "normal": 1, "high": 2, "critical": 3}`) via plain dict lookup — `self._levels.get(state.binding.risk_level, 1)`. Any string not found in that table, including a correctly-spelled value in the wrong case (`"CRITICAL"` instead of `"critical"`), silently resolves to `1` — the same numeric level as `"normal"`. There is no error, no warning, no `UNKNOWN` sentinel. A `DecisionRule` gated on `RiskAbove("critical")` will report `satisfied: False` for `risk_level="CRITICAL"` exactly as if the input had genuinely been low-risk.
|
|
78
|
+
|
|
79
|
+
Confirmed directly: a rule wired `condition=RiskAbove("critical"), action_if_true="escalate", action_if_false="queue"` returns `action: "escalate"` for `risk_level="critical"` and silently `action: "queue"` — the opposite decision — for `risk_level="CRITICAL"`. `consistency_check()` reports `consistent: True` in both cases; nothing in the outcome distinguishes a genuine low-risk case from a typo'd critical one.
|
|
80
|
+
|
|
81
|
+
**Why this is the default**: `risk_level` is a plain string on `RuntimeBinding`, not a validated enum — the primitive layer accepts any value a caller supplies, and `RiskAbove` was built to degrade gracefully (default to `1`/`"normal"`) rather than raise on unrecognized input, on the assumption that a missing/malformed risk signal should fail toward caution-as-normal rather than crash the traversal. That default-to-normal choice is defensible in isolation; it becomes dangerous specifically because it's silent and specifically because `ADV-02` recommends `RiskAbove` as *the* fix for risk-based routing without calling out that the string has to match exactly.
|
|
82
|
+
|
|
83
|
+
**How to close the gap**: normalize `risk_level` before it reaches the engine — lowercase and validate against the known set (`{"low", "normal", "high", "critical"}`) at the point where your harness constructs `RuntimeBinding`, and reject or log anything that doesn't match rather than letting it fall through to `RiskAbove`'s silent default. Do this at the boundary, once, rather than trusting every caller to spell `risk_level` correctly forever.
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
*v1 — 2026-07-08 (ADV-01/02), v2 — 2026-07-08 (ADV-03..06), v3 — 2026-07-08 (ADV-07). All found by actually running scenarios through `dev_mcp` (`scope="core"`), not by inspection or guesswork. More advisories get added here the same way — dug up, not invented.*
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: fpf-thinking-map
|
|
3
|
-
Version: 1.4.
|
|
3
|
+
Version: 1.4.3
|
|
4
4
|
Summary: Agentic thinking map — structured reasoning constraints for LLMs with TTL evidence decay, deterministic guards, and propositional logic glue. Compiled from FPF (First Principles Framework).
|
|
5
5
|
Author-email: "prichindel.com" <igareosh@igareosh.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -26,7 +26,7 @@ Dynamic: license-file
|
|
|
26
26
|
|
|
27
27
|
# prichindel.com Agentic Thinking Map
|
|
28
28
|
|
|
29
|
-
**v1.4.
|
|
29
|
+
**v1.4.3** — [FPF (First Principles Framework)](https://github.com/ailev/FPF), compiled into a small traversal map for LLM agents.
|
|
30
30
|
|
|
31
31
|
A Python package that gives a model a bounded move board instead of a giant framework to digest at runtime. Instead of rereading a sprawling semantic corpus and improvising from it, the model gets a small JSON slice: what context it is in, what move is open, what evidence is missing, what is risky, and what outcome class applies.
|
|
32
32
|
|
|
@@ -234,6 +234,11 @@ The model's job shrinks from "figure out the entire epistemic state of your own
|
|
|
234
234
|
- **Four more advisories** (`ADV-03`–`ADV-06`), found the same way as `ADV-01`/`ADV-02` — running scenarios through `dev_mcp`, not inspection. The one to actually read: **`ADV-03`** — `RuntimeBinding.active_context_id` is self-asserted input, never verified against having actually crossed a bridge; a caller can claim any context directly and get the identical `CONTINUE` a licensed `cross_bridge()` call would produce. `ADV-04` — contradiction detection between `DecisionRule`s is opt-in via `exclusive_with`, not inferred from opposite-looking action names. `ADV-05` — gate `DEGRADE` only distinguishes partial evidence when related facts are grouped into *one* `GateCheck`; split across separate checks, "one of three known" collapses to indistinguishable from "none known." `ADV-06` — `agency_level` (PASSIVE/REACTIVE/AUTONOMOUS/DELIBERATIVE) is descriptive metadata only, same shape as `risk_level` (`ADV-02`) — nothing stops a `PASSIVE` role from firing what a `DELIBERATIVE` role can.
|
|
235
235
|
- `check_advisories_content` now asserts all six advisory IDs are present, not just the original two.
|
|
236
236
|
|
|
237
|
+
## v1.4.3 changes
|
|
238
|
+
|
|
239
|
+
- **`ADV-07`** — the sharpest advisory yet, called out at the top of `ADVISORIES.md` alongside `ADV-03`. `RiskAbove(threshold)` matches `risk_level` against a fixed table via plain dict lookup; anything not found — including a correctly-spelled value in the wrong case (`"CRITICAL"` vs. `"critical"`) — silently resolves to `"normal"`. Confirmed directly: a `RiskAbove("critical")` rule wired exactly as `ADV-02` recommends returns the *opposite* routed action for `"CRITICAL"` vs. `"critical"`, with no error, no warning, `consistency_check()` reporting `True` either way. Following the library's own documented fix for `ADV-02` does not protect you from this — normalize and validate `risk_level` at your harness boundary before it reaches the engine.
|
|
240
|
+
- `check_advisories_content` now asserts all seven advisory IDs.
|
|
241
|
+
|
|
237
242
|
## Design principles
|
|
238
243
|
|
|
239
244
|
- **Only add structure when it changes agentic behavior** — not for source fidelity alone
|
|
@@ -331,4 +336,4 @@ MIT. See [LICENSE](LICENSE).
|
|
|
331
336
|
|
|
332
337
|
---
|
|
333
338
|
|
|
334
|
-
**prichindel.com** — v1.4.
|
|
339
|
+
**prichindel.com** — v1.4.3 — 2026-07-08
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "fpf-thinking-map"
|
|
3
|
-
version = "1.4.
|
|
3
|
+
version = "1.4.3"
|
|
4
4
|
description = "Agentic thinking map — structured reasoning constraints for LLMs with TTL evidence decay, deterministic guards, and propositional logic glue. Compiled from FPF (First Principles Framework)."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = "MIT"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fpf_thinking_map-1.4.2 → fpf_thinking_map-1.4.3}/fpf_thinking_map/RELATED_WORK_GOFLOW_FPF_SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fpf_thinking_map-1.4.2 → fpf_thinking_map-1.4.3}/fpf_thinking_map.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|