| #!/usr/bin/env bash |
| set -euo pipefail |
|
|
| SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" |
| ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)" |
| |
| source "${SCRIPT_DIR}/gojira-b-ssh-lib.sh" |
| kaiju_gojira_b_init |
|
|
| MODEL_REMOTE="${KAIJU_MERGED_MODEL_REMOTE:-/home/richardecholsai5/kaiju-coder/models/Kaiju-Coder-Qwen3.6-27B-v1.8-merged}" |
| STAGING="${KAIJU_MERGED_METADATA_STAGING:-/tmp/kaiju-coder-7-merged-hf-metadata}" |
| APPLY="${KAIJU_MERGED_METADATA_APPLY:-0}" |
|
|
| usage() { |
| cat <<'USAGE' |
| Prepare Hugging Face metadata files for the merged Kaiju Coder 7 model on Gojira-B. |
|
|
| Dry-run by default. Set KAIJU_MERGED_METADATA_APPLY=1 to sync metadata into the |
| remote merged-model directory. This script does not upload, create Hugging Face |
| repos, or read authentication tokens. |
|
|
| Environment: |
| KAIJU_MERGED_MODEL_REMOTE remote merged model dir on Gojira-B |
| KAIJU_MERGED_METADATA_STAGING local temp staging dir |
| KAIJU_MERGED_METADATA_APPLY 0 dry-run, 1 rsync metadata to Gojira-B |
| KAIJU_MERGED_METADATA_USE_SUDO auto, 0, or 1; default auto for root-owned model dirs |
| USAGE |
| } |
|
|
| if [[ "${1:-}" == "--help" || "${1:-}" == "-h" ]]; then |
| usage |
| exit 0 |
| fi |
|
|
| rm -rf "${STAGING}" |
| mkdir -p "${STAGING}/assets" "${STAGING}/upstream/qwen3.6-27b" |
|
|
| cp "${ROOT}/release/MODEL_CARD_DRAFT.md" "${STAGING}/README.md" |
| cp "${ROOT}/release/assets/RMDWlogo.png" "${STAGING}/assets/RMDWlogo.png" |
| cp "${ROOT}/release/PUBLIC_TESTING_QUICKSTART.md" "${STAGING}/PUBLIC_TESTING_QUICKSTART.md" |
| cp "${ROOT}/release/LOCAL_TEST_INSTRUCTIONS.md" "${STAGING}/LOCAL_TEST_INSTRUCTIONS.md" |
| cp "${ROOT}/release/SERVING_BENCHMARKS.md" "${STAGING}/SERVING_BENCHMARKS.md" |
| cp "${ROOT}/release/EVAL_SCOREBOARD.md" "${STAGING}/EVAL_SCOREBOARD.md" |
| cp "${ROOT}/release/DATA_PROVENANCE_DRAFT.md" "${STAGING}/DATA_PROVENANCE_DRAFT.md" |
| cp "${ROOT}/release/SOURCE_INVENTORY.md" "${STAGING}/SOURCE_INVENTORY.md" |
| cp "${ROOT}/release/UPSTREAM_LICENSE_CHECK.md" "${STAGING}/UPSTREAM_LICENSE_CHECK.md" |
| cp "${ROOT}/release/PAID_API_READINESS.md" "${STAGING}/PAID_API_READINESS.md" |
| cp "${ROOT}/release/FINAL_RELEASE_REPORT.md" "${STAGING}/FINAL_RELEASE_REPORT.md" |
| cp "${ROOT}/release/GOAL_COMPLETION_AUDIT.md" "${STAGING}/GOAL_COMPLETION_AUDIT.md" |
| cp "${ROOT}/release/HF_UPLOAD_EVIDENCE.md" "${STAGING}/HF_UPLOAD_EVIDENCE.md" |
| cp "${ROOT}/release/upstream/qwen3.6-27b/LICENSE" "${STAGING}/upstream/qwen3.6-27b/LICENSE" |
|
|
| cat > "${STAGING}/MERGED_MODEL_RELEASE_MANIFEST.json" <<EOF |
| { |
| "product": "Kaiju Coder 7", |
| "model_id": "kaiju-coder-7", |
| "remote_model_dir": "${MODEL_REMOTE}", |
| "metadata_status": "prepared_for_huggingface_review", |
| "notes": [ |
| "Local metadata sync only; no Hugging Face upload performed.", |
| "Qwen attribution belongs in README/provenance/license notes, not the product model id.", |
| "Public paid API preflight evidence has passed; real customer charging still requires the deliberate Stripe live-mode switch." |
| ] |
| } |
| EOF |
|
|
| python3 - <<PY |
| from pathlib import Path |
| root = Path("${STAGING}") |
| for path in sorted(p for p in root.rglob("*") if p.is_file()): |
| print(path.relative_to(root)) |
| PY |
|
|
| kaiju_gojira_b_ssh " |
| set -euo pipefail |
| test -d '${MODEL_REMOTE}' || { echo 'Missing merged model: ${MODEL_REMOTE}' >&2; exit 2; } |
| test -f '${MODEL_REMOTE}/config.json' || { echo 'Missing config.json in ${MODEL_REMOTE}' >&2; exit 2; } |
| shard_count=\$(find '${MODEL_REMOTE}' -maxdepth 1 -name '*.safetensors' | wc -l | tr -d ' ') |
| if [[ \"\${shard_count}\" -lt 1 ]]; then |
| echo 'No safetensors shards found in ${MODEL_REMOTE}' >&2 |
| exit 2 |
| fi |
| echo 'Remote merged model present: ${MODEL_REMOTE}' |
| echo \"Safetensors shards: \${shard_count}\" |
| " |
|
|
| if [[ "${APPLY}" != "1" ]]; then |
| echo |
| echo "Dry run. Set KAIJU_MERGED_METADATA_APPLY=1 to sync metadata to Gojira-B." |
| echo "Metadata staging: ${STAGING}" |
| echo "Remote target: ${MODEL_REMOTE}" |
| exit 0 |
| fi |
|
|
| rsync_args=(-az) |
| case "${KAIJU_MERGED_METADATA_USE_SUDO:-auto}" in |
| auto) |
| if ! kaiju_gojira_b_ssh "test -w '${MODEL_REMOTE}'"; then |
| kaiju_gojira_b_ssh "sudo -n true" >/dev/null |
| rsync_args+=(--rsync-path="sudo -n rsync") |
| echo "Remote model directory is not writable by SSH user; using sudo rsync." |
| fi |
| ;; |
| 1) |
| kaiju_gojira_b_ssh "sudo -n true" >/dev/null |
| rsync_args+=(--rsync-path="sudo -n rsync") |
| echo "Using sudo rsync as requested." |
| ;; |
| 0) |
| ;; |
| *) |
| echo "KAIJU_MERGED_METADATA_USE_SUDO must be auto, 0, or 1" >&2 |
| exit 2 |
| ;; |
| esac |
|
|
| kaiju_gojira_b_rsync "${rsync_args[@]}" "${STAGING}/" "${KAIJU_GOJIRA_B_DEST}:${MODEL_REMOTE}/" |
|
|
| kaiju_gojira_b_ssh " |
| set -euo pipefail |
| for required in \ |
| README.md \ |
| PUBLIC_TESTING_QUICKSTART.md \ |
| LOCAL_TEST_INSTRUCTIONS.md \ |
| SERVING_BENCHMARKS.md \ |
| EVAL_SCOREBOARD.md \ |
| DATA_PROVENANCE_DRAFT.md \ |
| SOURCE_INVENTORY.md \ |
| UPSTREAM_LICENSE_CHECK.md \ |
| PAID_API_READINESS.md \ |
| FINAL_RELEASE_REPORT.md \ |
| GOAL_COMPLETION_AUDIT.md \ |
| HF_UPLOAD_EVIDENCE.md \ |
| assets/RMDWlogo.png \ |
| MERGED_MODEL_RELEASE_MANIFEST.json \ |
| upstream/qwen3.6-27b/LICENSE; do |
| test -f '${MODEL_REMOTE}/'\${required} || { echo \"Missing synced metadata: \${required}\" >&2; exit 2; } |
| done |
| echo 'Merged model metadata synced and verified.' |
| " |
|
|