> ## Documentation Index
> Fetch the complete documentation index at: https://surf-dcinside-api.kr.ask.surf/llms.txt
> Use this file to discover all available pages before exploring further.

# Rollout Stages

> Dress rehearsal, stage 1 and stage 2: what runs when, what counts as a pass, and what is still to settle

<div style={{ maxWidth: 760 }}>
  <h2 style={{ fontSize: "22px", marginBottom: 8 }}>One API, three stages</h2>

  The API is the same in every stage. What changes is what DCinside does with the scores.

  | Stage | What runs | What DCinside does with the scores | Outcomes |
  | - | - | - | - |
  | Dress rehearsal | Real candidates every cycle, scores back | Nothing goes on the board. DCinside's side only logs what it would have published, and compares the model's would-be picks with the operators' actual picks. | Daily, for operator-placed posts |
  | Stage 1 | 02:00–07:00 KST every day, weekends included | The model publishes directly to Main and Light, and operators review the next morning. Weekend daytime stays out, because operators still publish then at a lower volume. | Readings at 1, 6, 24 and 48 hours after placement |
  | Stage 2 | An interleaved daytime block, after the stage-1 results | The same, in daytime hours. | As in stage 1 |

  <Note>
    The start date depends on DCinside's publishing API, and DCinside will confirm it once it is scheduled. The adult-content Night tier is not part of the first trial.
  </Note>

  ***

  <h2 style={{ fontSize: "22px", marginBottom: 8 }}>Dress rehearsal pass criteria</h2>

  The rehearsal checks that the connection is reliable. Model quality is not judged at this stage, because that needs real placements. These are DCinside's draft criteria.

  | Criterion | Threshold |
  | - | - |
  | Duration | 3 consecutive days, covering three overnight windows (02:00–07:00) |
  | Delivery continuity | At least 99% of the 288 daily cycles sent, and any gap over 15 minutes must have triggered an alert |
  | Response time | Scores arrive within the deadline in at least 99% of cycles |
  | Complete scoring | At least 99% of queue candidates get a score within two cycles of entering, and removed posts (saved, hidden, deleted or past 24 hours) are no longer scored |
  | Daily reconciliation | Counts sent, received and scored match each day, and 100% of scores join back to DCinside's post IDs |
  | Failure drills | If DCinside stops sending for 20 minutes, the 15-minute alert reaches them. If a response is late, DCinside skips that cycle |

  <Warning>
    **Proposed change to "within two cycles of entering".** A candidate waits 15 minutes before it is scored, so its due cycle is at least three cycles after it enters. Surf proposes measuring "within two cycles" from the due cycle instead. See [How Scoring Works](/scoring#when-a-post-is-scored).
  </Warning>

  Two things are reviewed during the rehearsal without being pass criteria. Operators go through the posts the model would have published and mark unsuitable ones, including duplicates, with a reason code. And the overlap between the model's would-be picks and the operators' actual picks during the day is compared.

  ***

  <h2 style={{ fontSize: "22px", marginBottom: 8 }}>When something breaks</h2>

  DCinside's rule is: when in doubt, don't publish.

  * If scores miss the response deadline or are stale, DCinside skips that cycle. In the daytime operators keep picking as usual, and at night the board stays as it was, with nothing published.
  * If DCinside's sending machine stops entirely, it cannot alert anyone. Surf alerts DCinside when no cycle call has arrived for 15 minutes.
  * A skipped cycle is not queued. The next cycle carries the current state, and `GET /v1/scores/{cycle_id}` still returns the stored result of the skipped one.

  ***

  <h2 style={{ fontSize: "22px", marginBottom: 8 }}>To settle on the technical exchange</h2>

  | Topic | What this documentation proposes | Status |
  | - | - | - |
  | Where data goes | An HTTPS API with a long-lived key. DCinside's agenda also lists an S3 folder | To settle |
  | Images | Uploaded once per post, on their own call, never on the scoring path | Proposed |
  | Cycle interval | Five minutes. DCinside's setting starts at 2–5 minutes | Proposed default |
  | Response deadline | 60 seconds | Proposed default |
  | Scores | In the response to the cycle call. Each post is scored once and repeated unchanged | Proposed |
  | Outcomes | Daily in the dress rehearsal. In the live trial, as they occur or in hourly batches | To settle |
  | Post age limit | 24 hours, applied by DCinside before sending | DCinside's suggestion |
  | 15-minute alert | Slack, with a named person on each side | Proposed |
  | Rehearsal start date and pass criteria | See above | DCinside's draft |
</div>
