concord-engine 0.3.1 → 0.3.2

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.
Files changed (3) hide show
  1. package/README.md +4 -2
  2. package/dist/cli.js +15 -1
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -20,10 +20,12 @@ parallel run:
20
20
  Concord Engine answers it by comparison, never by a model, and refuses the
21
21
  second answer at the moment it is written.
22
22
 
23
- [![A real Claude Code session: a refunds feature is split across four workers, two of them settle the error format differently, and the second is refused with the decision already in force, who made it and why.](assets/brag.gif)](https://github.com/harsh-chandak/concord-engine/blob/main/assets/brag.gif)
23
+ [![A real Claude Code session: two workers on a refunds feature settle the error format differently, the second is refused with the decision already in force, who made it and why, and the acceptance checks then run.](assets/brag.gif)](https://github.com/harsh-chandak/concord-engine/blob/main/assets/brag.gif)
24
24
 
25
25
  <sub>Recorded, not drawn. `brag/record.mjs` runs the real CLI and captures its
26
- output verbatim; `brag/video.html` only renders what was captured.</sub>
26
+ output verbatim; `brag/video.html` only renders what was captured. The loop
27
+ shows the refusal arc — the full run also writes the contract, binds it and
28
+ briefs four workers first.</sub>
27
29
 
28
30
  ## What a decision is
29
31
 
package/dist/cli.js CHANGED
@@ -158,7 +158,21 @@ async function main() {
158
158
  // decision from the first release while `decide` recorded it silently, so
159
159
  // which interface you used decided whether the product's central promise
160
160
  // held. --force records anyway, for the deliberate case.
161
- const clash = findContradiction(activeDecisions(all), values.kind, values.subject, parseValue(values.value));
161
+ // A deliberate override is the other way through, and it has to be a real
162
+ // one: the id must already be in the log. That also stops a decision
163
+ // naming the id it is about to be given, which superseded it out of force
164
+ // the moment it was written — "recorded", exit 0, and not in force.
165
+ if (values.supersedes && !all.some((d) => d.id === values.supersedes)) {
166
+ console.error(`${red("refused")} --supersedes ${values.supersedes}: no decision has that id.`);
167
+ console.error(` \`concord-engine check --json\` lists the ids in force.`);
168
+ return 1;
169
+ }
170
+ // An override replaces what it names, so that decision is no longer in
171
+ // force to be contradicted. This is the same reading detect() takes
172
+ // through activeDecisions(), which is why record_decision on the MCP side
173
+ // never had this bug and `decide` did.
174
+ const inForce = activeDecisions(all).filter((d) => d.id !== values.supersedes);
175
+ const clash = findContradiction(inForce, values.kind, values.subject, parseValue(values.value));
162
176
  if (clash && !values.force) {
163
177
  const spec = kindSpec(values.kind);
164
178
  console.error(`${red("refused")} this contradicts a decision already in force.`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "concord-engine",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "description": "Scale parallelism. Preserve alignment. A fleet of coding agents builds one task in parallel against a spec contract, and a decision that contradicts one already in force is refused \u2014 deterministically, with no model in the decision path.",
5
5
  "keywords": [
6
6
  "ai-agents",