{
  "format": "dawn",
  "format_version": 1,
  "manifest": {
    "spec_version": 1,
    "trail_id": "trail_00800f0c-5538-4ede-b62c-4e8b24a82b93",
    "title": "Trails",
    "description": "Portable project memory you can hand to someone else.",
    "exported_at": "2026-08-18T02:37:04.209Z",
    "exporter": {
      "tool": "deerdawn",
      "version": null
    },
    "source": {
      "repo_url": null,
      "commit_sha": null,
      "branch": null,
      "pinned": false,
      "unpinned_reason": "no_repo_url"
    },
    "provenance": {
      "trail_id": "trail_00800f0c-5538-4ede-b62c-4e8b24a82b93",
      "author": null,
      "forked_from": null,
      "lineage": [],
      "generation": 0
    },
    "counts": {
      "brief_fields": 10,
      "decisions": 3,
      "graph_nodes": 6,
      "graph_edges": 0,
      "paths": 2,
      "findings": 2,
      "commands": 1,
      "board_cards": 2
    },
    "redaction": {
      "scanned": true,
      "scanner_version": 1,
      "scanned_at": "2026-08-18T02:37:04.212Z",
      "excluded_paths": [
        "content.board.cards[1].id",
        "content.board.cards[0].id"
      ],
      "kept_with_justification": []
    },
    "published": {
      "state": "published",
      "published_at": "2026-08-18T02:37:04.212Z",
      "author": null
    }
  },
  "content": {
    "brief": {
      "project_name": "Trails",
      "category": "coding",
      "description": "Portable project memory you can hand to someone else.",
      "goals": [
        "Ship a portable .dawn archive",
        "Never publish an unscanned Trail"
      ],
      "current_status": "PR #309 open; 51 tests green, awaiting merge.",
      "current_task": "Trails P0 \u2014 export, import, redaction gate",
      "next_action": "Merge #309, then start P1 fork + lineage.",
      "tech_stack": [
        "Node.js",
        "JSON",
        "SHA-256"
      ],
      "open_questions": [
        "Should a fork inherit the parent's redaction decisions?"
      ],
      "landmines": [
        {
          "paths": [],
          "summary": "trailImport mirrors canonicalWorkspaceKey byte-for-byte; drift silently discards every imported edge",
          "added_at": "2026-08-18T02:36:54.325Z",
          "importance": "critical"
        }
      ]
    },
    "decisions": [
      {
        "summary": "A .dawn file is plain JSON, never encrypted",
        "reasoning": "An OSS audience detects artificial lock-in immediately and it would define the reputation.",
        "importance": "high",
        "decided_at": "2026-08-18T02:36:54.325Z",
        "resolved": false
      },
      {
        "summary": "Import fills gaps only and never overwrites",
        "reasoning": "If importing can clobber, nobody imports twice.",
        "importance": "high",
        "decided_at": "2026-08-18T02:36:54.325Z",
        "resolved": false
      },
      {
        "summary": "No publish-all shortcut on the redaction gate",
        "reasoning": "A false negative publishes a credential permanently; a false positive costs one click.",
        "importance": "critical",
        "decided_at": "2026-08-18T02:36:54.325Z",
        "resolved": false
      }
    ],
    "graph": {
      "nodes": [
        {
          "node_id": "graph_node_0c24266b-20c5-4ee4-8ccb-51d754f62f73",
          "node_type": "decision",
          "title": "A .dawn file is plain JSON, never encrypted",
          "metadata": {
            "scope": "project",
            "pinned": false,
            "source": "manual_workspace_entity",
            "status": "active",
            "importance": "high",
            "seen_count": 1,
            "entity_type": "decision",
            "memory_tier": "durable",
            "source_keys": [
              "codex"
            ],
            "source_kind": "inferred",
            "verified_at": "2026-08-18T02:36:54.328Z",
            "source_count": 1,
            "auto_promoted": true,
            "curation_state": "promoted",
            "retrieval_hits": 0,
            "last_matched_at": "2026-08-18T02:36:54.328Z"
          },
          "created_at": "2026-08-18T02:36:54.328Z",
          "updated_at": "2026-08-18T02:36:54.328Z"
        },
        {
          "node_id": "graph_node_aa7eadec-bd5a-4417-8c87-a66e3f7dfa57",
          "node_type": "decision",
          "title": "Import fills gaps only and never overwrites",
          "metadata": {
            "scope": "project",
            "pinned": false,
            "source": "manual_workspace_entity",
            "status": "active",
            "importance": "high",
            "seen_count": 1,
            "entity_type": "decision",
            "memory_tier": "durable",
            "source_keys": [
              "codex"
            ],
            "source_kind": "inferred",
            "verified_at": "2026-08-18T02:36:54.328Z",
            "source_count": 1,
            "auto_promoted": true,
            "curation_state": "promoted",
            "retrieval_hits": 0,
            "last_matched_at": "2026-08-18T02:36:54.328Z"
          },
          "created_at": "2026-08-18T02:36:54.328Z",
          "updated_at": "2026-08-18T02:36:54.328Z"
        },
        {
          "node_id": "graph_node_0a170d2e-97d3-4005-805e-f09fc3b5da6f",
          "node_type": "decision",
          "title": "No publish-all shortcut on the redaction gate",
          "metadata": {
            "scope": "project",
            "pinned": false,
            "source": "manual_workspace_entity",
            "status": "active",
            "importance": "critical",
            "seen_count": 1,
            "entity_type": "decision",
            "memory_tier": "durable",
            "source_keys": [
              "codex"
            ],
            "source_kind": "inferred",
            "verified_at": "2026-08-18T02:36:54.328Z",
            "source_count": 1,
            "auto_promoted": true,
            "curation_state": "promoted",
            "retrieval_hits": 0,
            "last_matched_at": "2026-08-18T02:36:54.328Z"
          },
          "created_at": "2026-08-18T02:36:54.328Z",
          "updated_at": "2026-08-18T02:36:54.328Z"
        },
        {
          "node_id": "graph_node_cda8cd29-6cee-4684-b302-2969ff623770",
          "node_type": "question",
          "title": "Should a fork inherit the parent's redaction decisions?",
          "metadata": {
            "scope": "project",
            "pinned": false,
            "source": "manual_workspace_entity",
            "status": "active",
            "importance": "normal",
            "seen_count": 1,
            "entity_type": "question",
            "memory_tier": "candidate",
            "source_keys": [
              "codex"
            ],
            "source_kind": "inferred",
            "verified_at": "2026-08-18T02:36:54.328Z",
            "source_count": 1,
            "auto_promoted": true,
            "curation_state": "inferred",
            "retrieval_hits": 0,
            "last_matched_at": "2026-08-18T02:36:54.328Z"
          },
          "created_at": "2026-08-18T02:36:54.328Z",
          "updated_at": "2026-08-18T02:36:54.328Z"
        },
        {
          "node_id": "graph_node_6c83b701-9da6-4579-b1e5-d74468ae2891",
          "node_type": "knowledge",
          "title": "Portable project memory you can hand to someone else.",
          "metadata": {
            "scope": "project",
            "pinned": false,
            "source": "manual_workspace_entity",
            "status": "active",
            "importance": "normal",
            "seen_count": 1,
            "entity_type": "knowledge",
            "memory_tier": "candidate",
            "source_keys": [
              "codex"
            ],
            "source_kind": "inferred",
            "verified_at": "2026-08-17T04:45:45.485Z",
            "source_count": 1,
            "auto_promoted": true,
            "curation_state": "inferred",
            "retrieval_hits": 0,
            "last_matched_at": "2026-08-17T04:45:45.485Z"
          },
          "created_at": "2026-08-17T04:45:45.485Z",
          "updated_at": "2026-08-17T04:45:45.485Z"
        },
        {
          "node_id": "graph_node_81a71a72-882d-44d1-af24-71c73657e703",
          "node_type": "task",
          "title": "Trails P0 \u2014 export, import, redaction gate",
          "metadata": {
            "scope": "project",
            "pinned": false,
            "source": "manual_workspace_entity",
            "status": "active",
            "importance": "critical",
            "seen_count": 1,
            "entity_type": "task",
            "memory_tier": "durable",
            "source_keys": [
              "codex"
            ],
            "source_kind": "inferred",
            "verified_at": "2026-08-17T04:45:45.485Z",
            "source_count": 1,
            "auto_promoted": true,
            "curation_state": "promoted",
            "retrieval_hits": 0,
            "last_matched_at": "2026-08-17T04:45:45.485Z"
          },
          "created_at": "2026-08-17T04:45:45.485Z",
          "updated_at": "2026-08-17T04:45:45.485Z"
        }
      ],
      "edges": []
    },
    "paths": [
      {
        "path": "apps/api/src/services/trail/trailPublish.js",
        "label": "The publish gate"
      },
      {
        "path": "apps/api/src/services/trail/trailScan.js",
        "label": "Redaction scanner"
      }
    ],
    "findings": [
      {
        "summary": "manifest.description was a copy of content.brief.description, so excluding the content field left the credential in the manifest",
        "paths": [
          "apps/api/src/services/trail/trailPublish.js"
        ]
      },
      {
        "summary": "A project was blocked from publishing by its own name \u2014 seeded names were harvested from project titles",
        "paths": [
          "apps/api/src/services/trail/index.js"
        ]
      }
    ],
    "commands": [
      {
        "label": "Run the Trail suite"
      }
    ],
    "board": {
      "cards": [
        {
          "title": "Fork and lineage",
          "phase": "backlog",
          "created_at": "2026-08-18T02:36:54.325Z",
          "updated_at": "2026-08-18T02:36:54.325Z"
        },
        {
          "title": "Freshness: behind-by-N",
          "phase": "backlog",
          "created_at": "2026-08-18T02:36:54.325Z",
          "updated_at": "2026-08-18T02:36:54.325Z"
        }
      ]
    }
  },
  "checksum": {
    "algorithm": "sha256",
    "canonicalization": "sorted-key-json-v1",
    "value": "58c2b1af0bf29ca67c5f35440920ff9cd69e8b8a984d1fe82d12e296ac1dd0aa"
  }
}
