---
title: "Camp Program Rules"
slug: camp-program-rules
section: Program Configuration
status: stable
description: "Camp-specific compliance constraints, business rules, and regulatory bundle defaults for the J-1 Camp Counselor program"
last-updated: 2026-10-07
---

# Camp Program Rules

Camp-specific compliance constraints, business rules, and regulatory bundle defaults for the J-1 Camp Counselor program

## Overview

The J-1 Camp Counselor program operates under a distinct set of regulatory constraints enforced by the j1-camp-counselor regulatory bundle. These constraints are implemented as a combination of locked bundle defaults (Tier 1 — compliance) and configurable business rules (Tier 2 — operational). For the full rules cascade model, see Rules Engine Architecture .

## Camp Model Type Detection

Programs are identified as camp programs by a server-derived model type, not a stored column: resolveProgramModelType (server/services/programModelType.ts) returns camp when the program key, code, name or visa type starts with "camp". A value of camp activates camp-specific evaluation paths. The j1-camp-counselor regulatory bundle is selected by its condition predicates (visa_type J-1, category_code camp_counselor).

## J-1 Camp Counselor Bundle Defaults

The following parameters are set at the bundle level and establish the monotone lock floor. No program or season configuration can override these values to a less restrictive setting.

| Parameter | Value | Locked |
| --- | --- | --- |
| min_age | 18 | Yes |
| max_duration_months | 4 | Yes |
| accepted_paths | eligible-path enumeration (post-secondary student, youth worker, teacher, specialist) | Yes |

> **No Extensions or Renewals**
>
> J-1 Camp Counselor programs do not permit extensions or renewals. Any attempt to create an extension or renewal request for a camp program will be rejected at the API layer with a validation error referencing the bundle lock.

## Camp Metadata Keys

*Status: not built as described. There is no `program_metadata` column and no `staff_ratio_threshold`, `placement_readiness_required` or `min_age_counselor` key in the code. Camp type is a host-organisation field `campType` (values Overnight, Day, Both), and staff ratios are configured in the `staff_ratio_rules` table.*

Camp programs carry additional metadata stored in the program_metadata JSONB column. The following keys are used by camp-specific rule evaluations:

| Key | Type | Purpose |
| --- | --- | --- |
| camp_type | string | Identifies the camp category (e.g., day_camp, residential_camp) |
| staff_ratio_threshold | number | Minimum staff-to-camper ratio that triggers a review queue action |
| placement_readiness_required | boolean | Whether placement confirmation is required before SEVIS pool entry |
| min_age_counselor | number | Minimum age for camp counselor applicants (default: 18) |

## Tier 1: Compliance Rules

Tier 1 rules are classified as compliance and cannot be overridden at any layer. Failure produces a block_phase or auto_reject action.

| Rule | Condition | Failure Action |
| --- | --- | --- |
| Minimum age | Applicant must be ≥ 18 at program start date | auto_reject |
| Placement duration (`j1.camp_counselor.max_program_months`, 22 CFR 62.30(h)(2)) | The applicant's current non-cancelled placement must end no later than its start date plus four **calendar months** (inclusive boundary; month-end and leap-year dates are clamped). An active placement takes precedence over a confirmed one; conflicting current placements fail rather than picking one. Season dates and SEVIS check-in dates are never substituted. | BLOCK (blocks Ready for SEVIS) plus a REVIEW_QUEUE item in the compliance review queue |
| No extension/renewal | Extension or renewal request must not exist for a camp applicant | block_phase |

The placement-duration rule is evaluated at the Ready for SEVIS gate (it is one of the gate's dependencies, grouped as "Camp Counselor placement") rather than at every lifecycle gate, and it applies only to Camp applicants; for non-Camp applications it passes as not applicable. An end date before the start date, or one day past the four-calendar-month boundary, is a genuine failure. A missing start or end date is shown as awaiting evidence rather than a proven violation, but Ready for SEVIS stays blocked until the interval can be evaluated. A failure does not reject, cancel, or otherwise change the applicant: it blocks readiness, opens a compliance-review-required item for staff, and shows the applicant feedback in the Applicant Portal asking them to update the Camp Contract dates or upload a corrected contract and resubmit.

## Tier 2: Business Rules

Tier 2 rules are classified as business and can be overridden at the program or season layer with appropriate permissions. Failure typically produces a queue_review or warn action.

| Rule | Condition | Failure Action |
| --- | --- | --- |
| Staff ratio review | Host's confirmed counselor count falls below staff_ratio_threshold (default: 10) | queue_review |
| Placement readiness | Placement must be confirmed before SEVIS pool entry when placement_readiness_required = true | block_phase |
| Camp Contract offer terms (`compliance.camp_contract_offer_terms_match`, advisory) | The Confirm Camp Contract start date, end date, salary and pay frequency must match the terms on the linked active/confirmed placement's job order. A mismatch, missing terms, or missing linkage is `review_required`; an exact match passes. Applies to Wild Packs CAMP_WP and SWT_WP enrollment applications only. | queue_review only — never blocks a transition, lifecycle checkpoint or readiness decision (readiness impact: none) |

The Camp Contract rule is a Wild Packs business rule in the `business.wild_packs_business_rules.v1` bundle, not a regulatory or compliance bundle rule. It does not replace the blocking duration and eligible-window checks. On the applicant profile's compliance section a `review_required` result is listed under **Needs sponsor review**, and its detail shows a side-by-side table of the **Job-order offer** against the **Camp Contract** for start date, end date, salary and pay frequency, with differing values highlighted and `Not recorded` for blanks. It is labelled a review flag only: differences do not block the applicant or host.

Two seeded reason codes belong to the camp rules. `CAMP_SEASONAL_COMPENSATION_BELOW_MINIMUM` (blocking) is the reason on the `job_order.compensation.camp_seasonal_minimum` submit gate: a job order on a Camp Counselor program that guarantees less than $2,400 in total seasonal compensation cannot be submitted for review, and the host sees copy naming that floor. `CAMP_ENGLISH_PROFICIENCY_NOT_MET` (blocking) anchors both actions of the `j1_camp_counselor.english_proficiency_sufficient` rule: it blocks when the sponsor-interview English rubric level is below the accepted bands (excellent, very good, good), and a missing rating routes to compliance review without blocking.

## Camp Placement Classification

For Camp applications the placement source and Same Camp return are derived from the applicant's committed Camp Personal Information step (`personal_information_camp_v1`); they are not entered by staff. A current Camp position of **No** means **Sponsor-arranged**; **Yes** means **Self-arranged**. **Same Camp return** is true only when the applicant has a current Camp position and previously worked at that same Camp. Previous J-1 participation is a separate fact and is never converted into a Camp fact, so Camp applicants have no Participant type shown. The newest committed snapshot wins, and a "No" answer clears the dependent Camp name and same-Camp answers, even in an older snapshot.

When the derived values change, they are written to the application (`placement_source`, `camp_same_camp_return`) with an `applicant_declaration` assertion trail, and the Market Ready projection is invalidated in the same transaction. Becoming Sponsor-arranged also clears the proposed-employer answer and withdraws any active placement proposal, so contradictory self-arranged state cannot survive.

Market exposure follows the same field. An application is outside the host market when its program key is `self_arranged_intern_trainee` or `self_arranged_intern_trainee_geo`, or when its `placement_source` is self-arranged; the Market Ready evaluation returns not applicable for it instead of a verdict. A write that would expose it to the market (the staff recommendation `POST /api/applicants/:applicationId/recommend`, `applicant.manage`) is refused with `422 MARKET_NOT_READY` and `details.reasonCode` `SELF_ARRANGED_MARKET_EXPOSURE_NOT_ALLOWED`, with `details.readinessImpact` `not_applicable`, an empty `details.failedDependencies` and `details.queueKey` `blocked`. The host-facing reservation and talent-pool recommend routes run the same live check but re-wrap any refusal into a host-safe `422 MARKET_NOT_READY` whose `details` carry only `reasonCode` `MARKET_NOT_READY`.

Staff see the result in several places: the Applicants list and the Command Center rows show Placement source and, when true, **Same Camp return**; the applicant profile header shows the same chips plus the applicant-supplied **Proposed camp** and **Applicant availability** date range, kept visually separate from the confirmed Host; and the Command Center has a Camp-only **Same Camp return** filter, carried in the `sameCampReturn` URL parameter, that is independent of the Participant type and Placement source filters.

## Camp Counselor Eligibility Path & SEVIS Add-On Gate

> **Superseded — Eligibility Engine now live**
>
> The legacy Cat 1/2/3 auto-derivation and staff-confirmed eligibility path described in earlier revisions of this section have been **fully retired**. Camp counselor eligibility is now decided by the automated Eligibility Engine (live on development, designed under ADR 0003): the engine evaluates a universal minimum-age requirement plus four qualifying paths from facts and staff-verified evidence, and a compliance officer issues the sponsor determination. See the Eligibility Engine & Compliance Tab page for the full model.

Camp Counselor (Wildpacks) applicants are held at a program-specific eligibility gate that stacks on top of the global `ready_for_sevis` gate every applicant must satisfy. For the full gate architecture, see the SEVIS Readiness page.

The eligibility gate now reads the engine's determination:

| Rule | Condition |
| --- | --- |
| CAMP-001 Eligibility approved | The applicant has an **approved and currently valid** sponsor determination from the Eligibility Engine. Reads only the engine's determination — never an applicant-entered field — and fails closed if the fact is missing or unreadable. |

The former standalone category-evidence checks (youth worker evidence, special skill verification) are subsumed by the engine's qualifying paths, each of which requires uploaded **and staff-verified** evidence before it can satisfy — with the special-skills path always routed to manual review. Applicants verified under the old model had their approvals preserved as legacy records and are never re-opened automatically.
