Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions docs/project-memory.md
Original file line number Diff line number Diff line change
Expand Up @@ -340,6 +340,20 @@ question no single document holds — *what line of work is this a step in* —
and renders the sequences on one page. A cycle, or a comparison held on one
side only, becomes a finding rather than a page that quietly omits it.

Some lines run through documents of another kind: an argument goes claim →
inference → claim, and no single field says which claim follows from which.
A **path pattern** names that relation, in Cypher's pattern syntax, and a
chain walks it wherever it would walk a field:

```yaml
patterns:
follows_from: (b:CLAIM)<-[:concludes]-(i:INF)<-[:premise_of]-(a:CLAIM)
```

Labels are schemes and edge types are reference fields, checked when the
config loads, and the page names what each step went *through*
([ADR-tmpfdvjo](../record/decisions.d/ADR-tmpfdvjo.md), `examples/argument-map`).

**Tag rules.** A vocabulary says what a value *means*; a group says which of
them may appear together, because some fields are an axis rather than a pile.
The group is declared under the field it constrains:
Expand Down
1 change: 1 addition & 0 deletions examples/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ that turned out to conflate *committed* with *hand-maintained*.
| [`knowledge-base/`](knowledge-base/) | a record of *domain* content rather than project meta-documentation: two schemes that cite each other and carry separate statuses, with required fields and a one-primary-category rule |
| [`world-bible/`](world-bible/) | a story bible: scenes that `follow` several scenes (a plural reference) and belong to world trajectories drawn from a closed vocabulary with a default — a field that is neither a reference, a tag nor a status |
| [`constitution/`](constitution/) | a record with no code in it at all: an AI assistant's operating instructions decomposed into values, practices and boundaries, where **precedence is a checked reference** (`BOUNDARY.overrides → PRACTICE`) rather than escalating emphasis, and a practice is retired by a boundary from another scheme |
| [`argument-map/`](argument-map/) | an argument as a record: claims, the inferences drawn between them, and objections — lines of argument walked as **named path patterns** through the inference documents, with an uncontested view that drops challenged steps |

To run one by hand:

Expand Down
46 changes: 46 additions & 0 deletions examples/argument-map/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# Argument map

An argument kept as a record, and the shape that needed path patterns.

**Three kinds of document.** A *claim* states something. An *inference*
draws one claim from others: its `premises` name the claims it starts from,
and `concludes` names the claim it reaches. An *objection* `challenges` a
claim or an inference.

**No field says which claim follows from which.** That fact takes two
fields on two documents: `premise_of` on the premise and `concludes` on the
inference. A chain over either field alone stops at the inference. So the
line is declared as a named path pattern, and the chain walks that:

```yaml
patterns:
follows_from: (b:CLAIM)<-[:concludes]-(i:INF)<-[:premise_of]-(a:CLAIM)
```

It reads like the field it stands in for: the first node is the step and
the last is the claim it builds on, so a conclusion nests under its
premises. `i` is named, so each step on the page says which inference it
went through.

**Two views of one argument.** [Lines of argument](docs/argument.md) walks
every step. [Uncontested lines](docs/uncontested.md) walks `stands_on`, the
same pattern with `WHERE NOT (i)<-[:challenges]-(:OBJ)`. It drops the step
from the 2025 inspection to "the repair can wait", because [OBJ-001](record/objections.d/OBJ-001.md)
challenges it.

**An unfinished step draws nothing.** [INF-004](record/inferences.d/INF-004.md) has a premise and no
conclusion yet, so it is not a step on either page. What counts as
unfinished depends on what this record requires, so luria does not guess.
The record can say it as a pattern of its own:

```yaml
unfinished: (i:INF)<-[:premise_of]-(:CLAIM) WHERE NOT (i)-[:concludes]->(:CLAIM)
```

Rendering such a pattern as a list of its matches is luria's
[issue 373](https://github.com/dmarx/luria/issues/373).

```
LURIA_ROOT=$PWD luria index
LURIA_ROOT=$PWD luria lint
```
81 changes: 81 additions & 0 deletions examples/argument-map/luria.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
# examples/argument-map/luria.yaml
#
# An argument kept as a record: claims, the inferences that draw one claim
# from others, and objections to either. No single field says which claim
# follows from which — that takes two, `premise_of` on a claim and
# `concludes` on an inference — so the lines of argument are walked as
# named path patterns (#371).
issue_url: https://github.com/acme/bridge/issues/{n}
vocabularies:
statuses:
Active:
blurb: held — the record stands behind it
Proposed:
blurb: put forward and not yet settled
Withdrawn:
blurb: no longer held; kept so what cited it still resolves
schemes:
CLAIM:
dir: record/claims.d
output: docs/claims
render: index
fields:
status: {vocabulary: statuses}
references:
premise_of:
scheme: INF
many: true
required: false
converse: premises
INF:
dir: record/inferences.d
output: docs/inferences
render: index
fields:
status: {vocabulary: statuses}
references:
premises:
scheme: CLAIM
many: true
required: false
converse: premise_of
concludes:
scheme: CLAIM
required: false
OBJ:
dir: record/objections.d
output: docs/objections
render: index
fields:
status: {vocabulary: statuses}
references:
# An objection may challenge a claim or the step drawn from it.
challenges:
scheme: [CLAIM, INF]
many: true
required: true
patterns:
# Read like the field it stands in for: the first node is the step, the
# last the claim it builds on — so a conclusion nests under its premises.
# `i` is named, so the page says which inference each step went through.
follows_from: (b:CLAIM)<-[:concludes]-(i:INF)<-[:premise_of]-(a:CLAIM)
stands_on:
match: >-
(b:CLAIM)<-[:concludes]-(i:INF)<-[:premise_of]-(a:CLAIM)
WHERE NOT (i)<-[:challenges]-(:OBJ)
blurb: A step no objection challenges.
chains:
argument:
scheme: CLAIM
relation: follows_from
output: docs/argument.md
title: Lines of argument
blurb: Every step, challenged or not.
uncontested:
scheme: CLAIM
relation: stands_on
output: docs/uncontested.md
title: Uncontested lines
blurb: Only the steps no objection challenges.
site:
title: Argument map
12 changes: 12 additions & 0 deletions examples/argument-map/record/claims.d/CLAIM-001.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
status: Active
title: 'Traffic on the bridge has doubled since 2020'
version: 1
date: '2026-09-01'
premise_of:
- INF-001
---

# CLAIM-001: Traffic on the bridge has doubled since 2020

The council's counts: 9,000 crossings a day in 2020, 18,500 in 2026.
12 changes: 12 additions & 0 deletions examples/argument-map/record/claims.d/CLAIM-002.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
status: Active
title: 'The load rating has not changed'
version: 1
date: '2026-09-01'
premise_of:
- INF-001
---

# CLAIM-002: The load rating has not changed

The deck was rated in 1998 and has not been re-rated since.
12 changes: 12 additions & 0 deletions examples/argument-map/record/claims.d/CLAIM-003.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
status: Active
title: 'The bridge now carries loads near its rating'
version: 1
date: '2026-09-02'
premise_of:
- INF-002
---

# CLAIM-003: The bridge now carries loads near its rating

Drawn from the first two claims by [INF-001](../inferences.d/INF-001.md).
12 changes: 12 additions & 0 deletions examples/argument-map/record/claims.d/CLAIM-004.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
status: Active
title: 'Freeze–thaw accelerates damage to a heavily loaded deck'
version: 1
date: '2026-09-02'
premise_of:
- INF-002
---

# CLAIM-004: Freeze–thaw accelerates damage to a heavily loaded deck

Water in existing cracks expands, and a deck near its rating has more of them.
14 changes: 14 additions & 0 deletions examples/argument-map/record/claims.d/CLAIM-005.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
status: Active
title: 'The bridge should be repaired before winter'
version: 1
date: '2026-09-03'
premise_of:
- INF-004
---

# CLAIM-005: The bridge should be repaired before winter

The conclusion this record exists to support. [INF-004](../inferences.d/INF-004.md), which would price
the repair, has premises and no conclusion yet, so it draws no step on
either page.
10 changes: 10 additions & 0 deletions examples/argument-map/record/claims.d/CLAIM-006.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
status: Proposed
title: 'The repair can wait until spring'
version: 1
date: '2026-09-04'
---

# CLAIM-006: The repair can wait until spring

The rival conclusion, drawn by [INF-003](../inferences.d/INF-003.md) and challenged by [OBJ-001](../objections.d/OBJ-001.md).
12 changes: 12 additions & 0 deletions examples/argument-map/record/claims.d/CLAIM-007.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
status: Active
title: 'The last inspection found no cracking'
version: 1
date: '2026-09-04'
premise_of:
- INF-003
---

# CLAIM-007: The last inspection found no cracking

The 2025 inspection report, section 4.
14 changes: 14 additions & 0 deletions examples/argument-map/record/inferences.d/INF-001.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
status: Active
title: 'Twice the traffic on the same rating'
version: 1
date: '2026-09-02'
premises:
- CLAIM-001
- CLAIM-002
concludes: CLAIM-003
---

# INF-001: Twice the traffic on the same rating

If the load has doubled and the rating has not moved, the margin has shrunk.
15 changes: 15 additions & 0 deletions examples/argument-map/record/inferences.d/INF-002.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
status: Active
title: 'A loaded deck will not survive a winter unrepaired'
version: 1
date: '2026-09-03'
premises:
- CLAIM-003
- CLAIM-004
concludes: CLAIM-005
---

# INF-002: A loaded deck will not survive a winter unrepaired

Together the premises say the damage a winter does is damage this deck
cannot absorb.
13 changes: 13 additions & 0 deletions examples/argument-map/record/inferences.d/INF-003.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
status: Proposed
title: 'No cracking, so no urgency'
version: 1
date: '2026-09-04'
premises:
- CLAIM-007
concludes: CLAIM-006
---

# INF-003: No cracking, so no urgency

Damage needs somewhere to start, and an uncracked deck gives it nowhere.
13 changes: 13 additions & 0 deletions examples/argument-map/record/inferences.d/INF-004.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
status: Proposed
title: 'What the repair should cost'
version: 1
date: '2026-09-05'
premises:
- CLAIM-005
---

# INF-004: What the repair should cost

Unfinished: the premises are in and the conclusion is not. A partial match
is no step, so neither page draws one until it names its conclusion.
14 changes: 14 additions & 0 deletions examples/argument-map/record/objections.d/OBJ-001.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
status: Active
title: 'The inspection predates the traffic increase'
version: 1
date: '2026-09-05'
challenges:
- INF-003
---

# OBJ-001: The inspection predates the traffic increase

The 2025 inspection measured a deck carrying 2023 traffic. An absence of
cracks then says little about the deck now, so the step from [CLAIM-007](../claims.d/CLAIM-007.md) to
[CLAIM-006](../claims.d/CLAIM-006.md) does not hold, and the uncontested page leaves it out.
Loading
Loading