{
  "club": "Royal Cork Yacht Club",
  "event": "Keelboat racing 2026",
  "documents": [
    {
      "output": "source/RCYC-Course-Card-Art-2026.md",
      "source": "source/RCYC-Course-Card-Art-2026.pdf",
      "url": "https://www.royalcork.com/wp-content/uploads/2026/04/RCYC-Course-Card-Art-2026.pdf",
      "title": "Royal Cork Yacht Club Keelboat Racing Course Card, 2026 update",
      "why": "The card itself: forty numbered courses as rounds with cumulative distances under wind headings, the notes that the General Sailing Instructions say form part of them, and the card's own description of its two starting and finishing lines. Published on the club's Keelboats Notice Board. The sidecar leaves out page 1, the chart: its labels overlap (\"COURSE CARD UPDATE 2026\" is set twice over itself) and pdftotext splits them differently from one poppler version to the next, so a sidecar of that page would not reproduce in CI; nothing on it is text a reader needs.",
      "pages": "2-4"
    },
    {
      "output": "source/General-Sailing-Instructions-for-Royal-Cork-Yacht-Club-Keelboat-Racing-2026.md",
      "source": "source/General-Sailing-Instructions-for-Royal-Cork-Yacht-Club-Keelboat-Racing-2026.pdf",
      "url": "https://www.royalcork.com/wp-content/uploads/2026/03/General-Sailing-Instructions-for-Royal-Cork-Yacht-Club-Keelboat-Racing-2026.pdf",
      "title": "General Sailing Instructions for Royal Cork Yacht Club Keelboat Racing 2026",
      "why": "22.1 makes the card the round-the-cans course list; 22.3 gives the only positions the club publishes, for the Port of Cork's four permanently laid race marks; 26 defines the start and finish lines every course begins and ends at."
    },
    {
      "output": "source/Royal-Cork-Yacht-Club-Keelboat-Autumn-League-2026-Sailing-Instructions-Final.md",
      "source": "source/Royal-Cork-Yacht-Club-Keelboat-Autumn-League-2026-Sailing-Instructions-Final.pdf",
      "url": "https://www.royalcork.com/wp-content/uploads/2026/09/Royal-Cork-Yacht-Club-Keelboat-Autumn-League-2026-Sailing-Instructions-Final.pdf",
      "title": "Sailing Instructions for Royal Cork Yacht Club Autumn League 2026",
      "why": "36 positions three of the Port of Cork's permanently laid race marks — Harp, Ringabella and Dosco — and it is the later of the club's two 2026 statements of where they are. The general instructions' 22.3 gives all three differently, Ringabella by 408 m; the marks file takes these, the later document, as Pat Tanner's Cork Harbour workbook does, and the club has not said which is right. 43 names Cage (C1) as the Grassy Walk line's distance mark."
    }
  ],
  "artifacts": [
    {
      "output": "marks.json",
      "tool": "extract_rcyc_marks",
      "source": "source/Royal-Cork-Yacht-Club-Keelboat-Autumn-League-2026-Sailing-Instructions-Final.pdf",
      "url": "https://www.royalcork.com/wp-content/uploads/2026/09/Royal-Cork-Yacht-Club-Keelboat-Autumn-League-2026-Sailing-Instructions-Final.pdf",
      "card": "source/RCYC-Course-Card-Art-2026.pdf",
      "supplement": {
        "source": "source/General-Sailing-Instructions-for-Royal-Cork-Yacht-Club-Keelboat-Racing-2026.pdf",
        "url": "https://www.royalcork.com/wp-content/uploads/2026/03/General-Sailing-Instructions-for-Royal-Cork-Yacht-Club-Keelboat-Racing-2026.pdf",
        "ids": [
          "East Mark"
        ],
        "citation": "General Sailing Instructions for Royal Cork Yacht Club Keelboat Racing 2026, 22.3",
        "why": "The Autumn League instructions' 36 lists three of the four Port of Cork laid race marks; East Mark (formerly Mark B), which the card never names but 22.2 lets the race officer call, is positioned only by the general instructions, and is taken from them."
      },
      "addMarks": {
        "why": "The instructions position four marks between them; the card names twenty-six more. The numbered channel buoys and the E, W, EF2 and C1 buoys are Port of Cork navigation marks: charted, but given a position in no official document, no Cork Week instruction of any year, and no Port of Cork publication found — the port's Information Manual and passage plans name them and place none, and the NGA List of Lights (Pub. 114) carries Cork Harbour's shore, range and pier lights but not one channel buoy. Nineteen of them are positioned from eOceanic's list of Irish marks, which names each by its number — see `buoys`; their entries here carry only an id and a name. E4, a north cardinal, is positioned from Pat Tanner's Cork Harbour workbook: a geotagged photograph of the buoy, which a Navionics reading puts 6.9 m off and a B&G Vulcan reading 0.9 m off. It is preferred to eOceanic's E4, 23 m away and 24–30 m from both plotter readings. OpenStreetMap, where all twenty were first traced and numbered by eye against the chart, is now the cross-check in `checks`; its E4 is 16 m from the photograph's. Cage is placed from neither: buoy C1 is not in OpenStreetMap — the nearest node to it is 850 m away — and the club supplied its position directly, so it is carried as club correspondence; eOceanic's C1 is 39 m from it, corroboration rather than a better authority for the mark the club's own line is laid to. It is the Grassy Walk line's outer distance mark, and with it placed the line's geometry checks out: solving for the start line that best fits the card's own printed distances over 28 courses lands 321 m from the midpoint of the line between Cage and the club, which is corroboration of Cage, of the numbering and of both at once. EF2 is placed as the club gave it, 51° 50.631' N 8° 14.238' W, the same footing as Cage; eOceanic's EF2 is 49 m from it and a Navionics reading by Pat Tanner 15 m. EF4 is not a navigation buoy: Pat Tanner's workbook records it as a permanently moored race mark, unlit, at 51° 50.720' N 8° 14.740' W, citing an RCYC reference it does not name; it is placed on the workbook's word until that reference is found. It is not EF1, the lit starboard-hand channel buoy 1.6 km to the east, and eOceanic, which lists the channel's lit buoys, has nothing within 500 m of it. OpenStreetMap's three East Ferry nodes, once taken for the EF buoys, are not them: the nearest is 571 m from EF2. Dutchman and Curlane are laid marks the card places in words; White Bay the card only names.",
        "marks": [
          {
            "id": "No.3",
            "name": "Harbour navigation buoy No.3"
          },
          {
            "id": "No.5",
            "name": "Harbour navigation buoy No.5"
          },
          {
            "id": "No.6",
            "name": "Harbour navigation buoy No.6"
          },
          {
            "id": "No.7",
            "name": "Harbour navigation buoy No.7"
          },
          {
            "id": "No.8",
            "name": "Harbour navigation buoy No.8"
          },
          {
            "id": "No.9",
            "name": "Harbour navigation buoy No.9"
          },
          {
            "id": "No.10",
            "name": "Harbour navigation buoy No.10"
          },
          {
            "id": "No.11",
            "name": "Harbour navigation buoy No.11"
          },
          {
            "id": "No.12",
            "name": "Harbour navigation buoy No.12"
          },
          {
            "id": "No.13",
            "name": "Harbour navigation buoy No.13"
          },
          {
            "id": "No.14",
            "name": "Harbour navigation buoy No.14"
          },
          {
            "id": "No.16",
            "name": "Harbour navigation buoy No.16"
          },
          {
            "id": "No.18",
            "name": "Harbour navigation buoy No.18"
          },
          {
            "id": "No.20",
            "name": "Harbour navigation buoy No.20"
          },
          {
            "id": "E1",
            "name": "Harbour navigation buoy E1"
          },
          {
            "id": "E2",
            "name": "Harbour navigation buoy E2"
          },
          {
            "id": "E4",
            "name": "Harbour navigation buoy E4",
            "position": {
              "lat": 51.798842,
              "lng": -8.262568
            },
            "source": "Pat Tanner, Cork Harbour workbook v3.19 (github.com/Bateleur88/cork-harbour-orc): a geotagged photograph of the buoy, confirmed within 7 m by Navionics and B&G Vulcan readings, 29 September 2026"
          },
          {
            "id": "W1",
            "name": "Harbour navigation buoy W1"
          },
          {
            "id": "W2",
            "name": "Harbour navigation buoy W2"
          },
          {
            "id": "W4",
            "name": "Harbour navigation buoy W4"
          },
          {
            "id": "EF2",
            "name": "Harbour navigation buoy EF2",
            "position": {
              "lat": 51.84385,
              "lng": -8.2373
            },
            "source": "Royal Cork Yacht Club correspondence"
          },
          {
            "id": "EF4",
            "name": "EF4, a race mark",
            "position": {
              "lat": 51.845333,
              "lng": -8.245667
            },
            "source": "Pat Tanner, Cork Harbour workbook v3.19 (github.com/Bateleur88/cork-harbour-orc), which cites an RCYC reference it does not name"
          },
          {
            "id": "Cage",
            "name": "Cage (C1)",
            "shape": "conical",
            "color": "green",
            "position": {
              "lat": 51.8139,
              "lng": -8.2828
            },
            "source": "Royal Cork Yacht Club correspondence"
          },
          {
            "id": "Dutchman",
            "name": "Dutchman",
            "placement": "The Dutchman mark will be a ‘laid’ club racing mark positioned approx. 2 cables SE of the Dutchman Rock/Fennels Bay."
          },
          {
            "id": "Curlane",
            "name": "Curlane",
            "placement": "“Curlane” will be a mark laid on the Curlane Bank."
          },
          {
            "id": "White Bay",
            "name": "White Bay",
            "placement": "Named by course 73 only; the card says nothing of where it is beyond its name, White Bay being the bay on the harbour's east shore north of Roches Point."
          }
        ]
      },
      "meta": {
        "club": "RCYC",
        "name": "Keelboat racing marks 2026: the Port of Cork laid race marks the Autumn League Sailing Instructions position, and East Mark the General Sailing Instructions do, the harbour navigation buoys from eOceanic's list and local knowledge, Cage as the club gave it, and every other mark the course card names",
        "source": "https://www.royalcork.com/wp-content/uploads/2026/09/Royal-Cork-Yacht-Club-Keelboat-Autumn-League-2026-Sailing-Instructions-Final.pdf",
        "notes": [
          {
            "title": "Positions",
            "text": "Port of Cork Laid Race Marks are yellow permanently laid and may be in these approximate locations."
          }
        ]
      },
      "buoys": {
        "source": "source/eoceanic-ireland.html",
        "url": "https://eoceanic.com/weather/ireland",
        "fetched": "2026-10-05",
        "citation": "eOceanic's list of Irish marks (eoceanic.com/weather/ireland, 5 October 2026)",
        "why": "eOceanic, a cruising-guide site, lists Ireland's buoys and lights by name with positions to a thousandth of a minute and their light characteristics, and names every channel buoy the card uses by its number. It does not say where its positions come from. It is preferred to OpenStreetMap, which these buoys were first traced from, because it is a document that numbers them — the numbering was otherwise our own reading of the chart — and because Pat Tanner's Cork Harbour workbook (github.com/Bateleur88/cork-harbour-orc), whose depth tests for the passages in #16 were run against these positions, takes its buoys from it. E4 is not taken from it: see the manifest's addMarks.",
        "rows": {
          "No.3": "White Bay No.3.",
          "No.5": "Cork outer harbour Dogsnose bank No.5",
          "No.6": "Cork outer harbour Ramshead Bank No.6.",
          "No.7": "Cork outer harbour Corkbeg No.7",
          "No.8": "Cork outer harbour Curlane bank No.8",
          "No.9": "Cork Harbour east channel No.9",
          "No.10": "Cork outer harbour Curlane bank No.10",
          "No.11": "Cork harbour fairway No.11",
          "No.12": "Spike Island No.12",
          "No.13": "Cork harbour fairway No.13",
          "No.14": "Spike Island No.14",
          "No.16": "Cork harbour fairway No.16",
          "No.18": "Cork harbour fairway No.18",
          "No.20": "Cork harbour Cobh Road No.20",
          "E1": "Chicargo Knoll E1 Cork Outer Harbour",
          "E2": "Cork outer harbour rock E2",
          "W1": "Cork outer harbour W1",
          "W2": "Cork outer harbour W2",
          "W4": "Cork outer harbour W4"
        }
      }
    },
    {
      "output": "keelboat.json",
      "tool": "extract_rcyc_card",
      "source": "source/RCYC-Course-Card-Art-2026.pdf",
      "url": "https://www.royalcork.com/wp-content/uploads/2026/04/RCYC-Course-Card-Art-2026.pdf",
      "why": "A course is its rounds run together, from the start line to \"Finish\", which is the same line (26); the rounds, with the cumulative distance each closes at, are where the race officer may shorten it and are carried as the card's first note. Courses 76 and 81 cross the finishing line laid at Cage at the end of their first round and sail on: that crossing is an entry passing Cage. Course 23 prints no distances. The blue dot some course numbers carry on the printed card is a graphic and is not read.",
      "meta": {
        "club": "RCYC",
        "name": "Keelboat Racing Course Card, 2026 update",
        "source": "https://www.royalcork.com/wp-content/uploads/2026/04/RCYC-Course-Card-Art-2026.pdf",
        "marks": "marks.json"
      },
      "notesSource": "source/RCYC-Course-Card-Art-2026.pdf",
      "startLine": {
        "source": "source/General-Sailing-Instructions-for-Royal-Cork-Yacht-Club-Keelboat-Racing-2026.pdf",
        "clauses": [
          "26."
        ],
        "why": "26 lists the lines that may be used — the Grassy Walk line to Cage or a laid mark, and a committee-vessel line — and each is also the finish, so every course ends at SL.",
        "meta": {
          "id": "SL",
          "name": "Start line",
          "source": "General Sailing Instructions for Royal Cork Yacht Club Keelboat Racing 2026, 26"
        }
      }
    },
    {
      "output": "routing.json",
      "tool": "extract_orc_routing",
      "source": "source/RCYC_Cork_Harbour_ORC_MASTER_v3_19_CAGE_CORROBORATED.xlsx",
      "url": "https://github.com/Bateleur88/cork-harbour-orc/raw/50dbdb28af7daade1ed3af37134a3724ba06b30f/RCYC_Cork_Harbour_ORC_MASTER_v3_19_CAGE_CORROBORATED.xlsx",
      "marks": "marks.json",
      "meta": {
        "club": "RCYC",
        "name": "Cork Harbour passages for the 2026 keelboat card",
        "source": "https://github.com/Bateleur88/cork-harbour-orc",
        "contributor": "Pat Tanner",
        "method": "Local knowledge, from Pat Tanner's master workbook v3.19 (SHA-256 ff0ae3ee…a735220). Every straight line between marks and waypoints was tested against INFOMAR's 2 m bathymetry (Contains Irish Public Sector Data (Geological Survey Ireland & Marine Institute) licensed under CC BY 4.0), sampled every 5 m: a line passes with at least 1.5 m below chart datum throughout, a modelling rule rather than a declaration of navigational safety. A line that fails is routed through waypoints he authored; three are routed only to keep clear of the Refinery Jetty, which the sailing instructions exclude.",
        "marks": "marks.json"
      },
      "names": {
        "Grassy Mid": "SL@grassy-walk"
      },
      "assumed": {
        "lines": [
          "SL"
        ],
        "tolerances": {
          "default": 20,
          "SL@grassy-walk": 500,
          "Dutchman": 200,
          "White Bay": 200
        },
        "notes": {
          "SL@grassy-walk": "The workbook's Grassy Mid, the point its routes from the Grassy Walk line start and finish at: the midpoint of the line's shore end and Cage. 500 m is where Pat Tanner's race officer page warns that a recorded line is away from it.",
          "Dutchman": "The workbook's planning position for a mark laid afresh each race day; the day's fix is where it is.",
          "White Bay": "The workbook's planning position for a mark laid afresh each race day; the day's fix is where it is."
        },
        "standIns": [
          {
            "id": "SL@dosco",
            "mark": "SL",
            "as": "Dosco",
            "toleranceM": 500,
            "note": "The workbook's Dosco start and finish: a committee-boat line in the area of Dosco, routed as Dosco."
          },
          {
            "id": "SL@no8",
            "mark": "SL",
            "as": "No.8",
            "toleranceM": 500,
            "note": "The workbook's No.8 start and finish: a committee-boat line in the area of No.8, routed as No.8."
          }
        ],
        "positions": {
          "Cage": {
            "position": {
              "lat": 51.8139,
              "lng": -8.2828
            },
            "note": "The club's position, which the marks file carries; the workbook tested eOceanic's C1, 39 m away. All eleven of the overlay's lines with an end at Cage were tested again here, with the workbook's own method and grids, and pass.",
            "source": "Retested by course-cards on 5 October 2026 with tools/check_depth.py: Pat Tanner's sampling (cork-harbour-orc scripts/geo.py) against INFOMAR GEO12_04, KRY12_05 and CB12_01"
          }
        }
      },
      "why": "Pat Tanner's workbook is the Cork Harbour local knowledge #16 asked for: the card's mark pairs, each tested against INFOMAR bathymetry and either found sailable as a straight line or routed through waypoints he authored. His repository is MIT-licensed, which is taken to cover the waypoints and passages. The overlay is generated from the workbook as it stands, kept verbatim; the marks it relies on are assumed where the workbook has them, which is where this data set has them too, except Dosco (10.5 m, within tolerance) and Cage, 39 m off: the workbook tested eOceanic's C1, and the marks file carries the club's position. Cage's eleven lines were tested again at the club's position, with the workbook's method, and Cage is assumed there. Curlane is left out: its ten pairs fail the 1.5 m test and are sailable only near high water, a condition of the courses (#18), not a passage."
    }
  ],
  "map": {
    "background": "map/background.png",
    "marks": "marks.json",
    "layers": [
      "osm",
      "openseamap"
    ],
    "zoom": 14,
    "paddingMinutes": 1.0
  },
  "variation": {
    "date": "2026-07-01",
    "why": "Mid-season: the card is for the 2026 keelboat season. Card pages work out the magnetic variation for this date at the middle of the marks from the World Magnetic Model; the variation changes by about a tenth of a degree a year here, so any day of the series gives the same figure."
  },
  "checks": {
    "tool": "check_rcyc",
    "items": [
      {
        "check": "osm-positions",
        "marks": "marks.json",
        "toleranceNm": 0.035,
        "why": "The buoys were first positioned from OpenStreetMap, independently of eOceanic and of the photograph E4 is placed from, and numbered by eye against the chart. Two independent readings of one buoy field should agree to within a buoy's swing and the imagery's registration; seventeen of the twenty are within 60 m. The three below are further apart and are recorded as such: which reading is nearer the buoy is not known, and eOceanic's is the one carried.",
        "positions": {
          "No.3": {
            "lat": 51.801736,
            "lng": -8.259799
          },
          "No.5": {
            "lat": 51.816964,
            "lng": -8.270356
          },
          "No.6": {
            "lat": 51.804616,
            "lng": -8.265475
          },
          "No.7": {
            "lat": 51.826951,
            "lng": -8.267406
          },
          "No.8": {
            "lat": 51.82087,
            "lng": -8.277416
          },
          "No.9": {
            "lat": 51.840383,
            "lng": -8.256752
          },
          "No.10": {
            "lat": 51.829146,
            "lng": -8.275828
          },
          "No.11": {
            "lat": 51.844012,
            "lng": -8.258683
          },
          "No.12": {
            "lat": 51.83262,
            "lng": -8.269627
          },
          "No.13": {
            "lat": 51.849553,
            "lng": -8.265228
          },
          "No.14": {
            "lat": 51.835477,
            "lng": -8.267138
          },
          "No.16": {
            "lat": 51.844794,
            "lng": -8.264219
          },
          "No.18": {
            "lat": 51.84893,
            "lng": -8.271322
          },
          "No.20": {
            "lat": 51.847303,
            "lng": -8.287576
          },
          "E1": {
            "lat": 51.794378,
            "lng": -8.25878
          },
          "E2": {
            "lat": 51.792806,
            "lng": -8.261462
          },
          "E4": {
            "lat": 51.798718,
            "lng": -8.26246
          },
          "W1": {
            "lat": 51.794504,
            "lng": -8.26762
          },
          "W2": {
            "lat": 51.794604,
            "lng": -8.272566
          },
          "W4": {
            "lat": 51.800244,
            "lng": -8.26526
          }
        },
        "expected": {
          "No.9": "the nearest eOceanic buoy to the trace all the same; the next, No.11, is 428 m from it",
          "No.6": "the nearest eOceanic buoy to the trace all the same; the next, No.3, is 451 m from it",
          "W1": "the nearest eOceanic buoy to the trace all the same; the next, W2, is 324 m from it"
        }
      },
      {
        "check": "lateral-colours",
        "marks": "marks.json",
        "buoys": "source/eoceanic-ireland.html",
        "why": "Under IALA region A the harbour's odd-numbered buoys are starboard hand, green, and its even-numbered ones port hand, red — which the card's own Cage, C1, settles as green. Each row eOceanic is read from must name the mark's number and give a light of the matching colour, so a row taken for the wrong buoy is caught."
      },
      {
        "check": "eoceanic-positions",
        "marks": "marks.json",
        "buoys": "source/eoceanic-ireland.html",
        "toleranceNm": 0.035,
        "rows": {
          "Cage": "C1",
          "EF2": "Cork Harbour east channel"
        },
        "why": "Cage and EF2 are placed from the club's correspondence, and eOceanic lists both — C1 by that name, EF2 as \"Cork Harbour east channel\" with EF2 in its light. The club's figure is carried, for the marks of its own racing; eOceanic's should agree with it to within a buoy's swing. eOceanic prints \"C1\" twice, the other off the Essex coast, so the row nearer the mark is the one compared."
      },
      {
        "check": "general-si-positions",
        "marks": "marks.json",
        "pdf": "source/General-Sailing-Instructions-for-Royal-Cork-Yacht-Club-Keelboat-Racing-2026.pdf",
        "toleranceNm": 0.02,
        "why": "The general instructions' 22.3 is the club's other 2026 statement of where the Port of Cork laid race marks are, and still current. Both print to a hundredth of a minute, about 18 m, so the two should agree to within that and a little more; Dosco does, at 29 m. Ringabella and Harp do not, and the club has not said which is right. If it corrects either document so that they agree, this check fails and the record below is removed.",
        "expected": {
          "Ringabella": "22.3 prints 51º 46.24’ N 8º 17.52’ W, 408 m from 36",
          "Harp": "22.3 prints 51º 47.19’ N 8º 14.21’ W, 82 m from 36"
        }
      }
    ]
  }
}
