Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b3c75ccec1 | |||
| e891496163 | |||
| 382944c055 | |||
| 71b6a4fa91 |
@@ -1,10 +1,12 @@
|
||||
{
|
||||
"phase": 0,
|
||||
"stage": "plan",
|
||||
"stage": "complete",
|
||||
"milestone": "v1.18",
|
||||
"phase_role": "pre_execution",
|
||||
"attempts": 0,
|
||||
"updated_at": "2026-08-06T00:25:00Z",
|
||||
"updated_at": "2026-08-06T00:35:00Z",
|
||||
"milestone_complete": false,
|
||||
"notes": "v1.18 PLAN complete. 8 phases, 6 waves, 15 requirements. Sequential execution."
|
||||
"tag": "v1.17.0",
|
||||
"release_id": 522,
|
||||
"notes": "v1.18 P0 complete. 5 pre-execution stages done. Tag v1.17.0, release 522."
|
||||
}
|
||||
@@ -58,6 +58,103 @@ traceable to a human attestation and an immutable evidence stream.
|
||||
boundary. The platform validates, enriches with operational standards,
|
||||
and reconciles the target state.
|
||||
|
||||
## Scope: Nova is Downstream of PDLC
|
||||
|
||||
> **Promoted from Core Tenet #2 + Anti-Goal #1 (v1.18, REQ-216).** This
|
||||
> is the unmissable scope statement — the PDLC is upstream, Nova is
|
||||
> downstream.
|
||||
|
||||
The **Product Development Lifecycle (PDLC)** — product backlog, code
|
||||
authorship, IDE workflows, sprint planning, application business logic —
|
||||
is **upstream** of Nova. Nova never penetrates the PDLC. Nova's domain is
|
||||
**infrastructure + delivery only**: environment progression, cloud
|
||||
resource lifecycle, operational security/observability NFRs, policy
|
||||
enforcement, immutable audit lineage, and the two consumer surfaces
|
||||
(technical developer + agentic).
|
||||
|
||||
Integration between the PDLC and Nova is **only** through the validated,
|
||||
published contract boundary (`schemas/contract.schema.json` +
|
||||
`schemas/submission-readiness.schema.json`). The citizen developer's AI
|
||||
coding agent, an upstream agentic SDLC platform, or any upstream
|
||||
development platform may all produce submissions — the source does not
|
||||
matter because all are subject to the same compliance standards (the
|
||||
submission-readiness gate, D-133). Nova validates, enriches with
|
||||
operational standards, and reconciles the target state. Nova never
|
||||
authors application code, manages product backlogs, or provides IDE
|
||||
workflows.
|
||||
|
||||
```
|
||||
PDLC (upstream) Nova (downstream)
|
||||
───────────────── ─────────────────
|
||||
product backlog contract ingestion
|
||||
code authorship (AI agent / IDE / SDLC) → submission-readiness gate
|
||||
sprint planning → policy enforcement
|
||||
application business logic → cloud resource lifecycle
|
||||
→ environment progression (dev→qa→prod→dr)
|
||||
→ immutable audit + attestation
|
||||
```
|
||||
|
||||
## RACI Matrix
|
||||
|
||||
> **Source of truth (v1.18, REQ-215, D-139).** Three roles clarify who
|
||||
> owns what across the Nova delivery lifecycle. The matrix is the
|
||||
> authoritative version; `docs/raci.md` is the citizen-developer-facing
|
||||
> copy.
|
||||
|
||||
### Roles
|
||||
|
||||
- **Citizen Developer (CD)** — the consumer (technical developer L3A or
|
||||
non-technical L3B). Responsible for all **Functional Requirements (FRs)**
|
||||
and **User Acceptance Testing (UAT)**. The FRs + UAT are produced via
|
||||
the citizen developer's AI coding agent, an upstream agentic SDLC, or
|
||||
an upstream development platform — **the source does not matter as all
|
||||
are subject to the same compliance standards** (the submission-readiness
|
||||
gate, D-133).
|
||||
- **Platform** — Nova. Responsible for all **Non-Functional Requirements
|
||||
(NFRs)**, **Infrastructure** (cloud resource lifecycle, state, IAM),
|
||||
**QA** (the platform-side quality checks: policy, confidence, schema),
|
||||
and **Production deployments to cloud** (the apply path, the pipeline,
|
||||
the release).
|
||||
- **Release Management (RM)** — **co-owned**. QA + SRE attestations are
|
||||
required by the actual release. The attestations are performed
|
||||
agentically (the platform runs the checks), but the release is
|
||||
**overseen and triggered by the Citizen Developer** — the human
|
||||
attestation at the stage gate (D-042, hitl_gates.py). The platform
|
||||
performs; the citizen developer authorizes.
|
||||
|
||||
### Matrix
|
||||
|
||||
| Work Category | Citizen Developer | Platform | Release Management |
|
||||
|---|---|---|---|
|
||||
| **Functional Requirements (FRs)** | **R/A** | C | I |
|
||||
| **User Acceptance Testing (UAT)** | **R/A** | C | I |
|
||||
| **Non-Functional Requirements (NFRs)** | I | **R/A** | C |
|
||||
| **Infrastructure (cloud, state, IAM)** | I | **R/A** | C |
|
||||
| **QA (policy, confidence, schema checks)** | C | **R/A** | I |
|
||||
| **Production deployment to cloud** | I | **R/A** | C |
|
||||
| **Release attestation (QA + SRE sign-off)** | **A** | R | **R** |
|
||||
|
||||
**Key: R** = Responsible (does the work) · **A** = Accountable (owns the
|
||||
outcome, sign-off) · **C** = Consulted · **I** = Informed.
|
||||
|
||||
**Compliance-standard equivalence note:** the citizen developer's FRs +
|
||||
UAT may originate from any upstream source — an AI coding agent, an
|
||||
agentic SDLC platform, or a traditional development platform. All are
|
||||
subject to the same compliance standards: the submission-readiness gate
|
||||
(`schemas/submission-readiness.schema.json`), the contract schema, the
|
||||
policy envelope, and the immutable audit stream. The platform does not
|
||||
differentiate by upstream source; it validates the submission, not the
|
||||
author.
|
||||
|
||||
**Co-ownership of Release Management:** the release is co-owned. The
|
||||
platform performs the QA + SRE attestations agentically (confidence signal,
|
||||
policy checks, separation-of-duties). The citizen developer oversees and
|
||||
triggers the actual release — the human attestation at the stage gate is
|
||||
the citizen developer's authorization, recorded with approver identity
|
||||
(D-042). The platform runs the checks; the citizen developer authorizes
|
||||
the promotion. This is the "autonomy in operations, human at stage gates"
|
||||
model from the NORTH_STAR.
|
||||
|
||||
## Capability Status (Re-Verified 2026-07-27)
|
||||
|
||||
> Source of truth: `.ciagent/CAPABILITY_INVENTORY.md` (Phase 54, D-093).
|
||||
|
||||
@@ -100,9 +100,11 @@ CHROME_PATH=/root/.cache/ms-playwright/chromium-1217/chrome-linux64/chrome \
|
||||
```
|
||||
|
||||
The `--allow-local-files` flag is **required** for PPTX export so the local
|
||||
PNG diagrams are embedded in the file. PPTX files are not committed to the
|
||||
repo (binary, no meaningful diffs) — they are uploaded to the Gitea release
|
||||
as downloadable attachments.
|
||||
PNG diagrams are embedded in the file. As of v1.18 (REQ-228, D-141), PPTX
|
||||
files **are committed to the repo** as first-class binary artifacts (no LFS)
|
||||
and are also attached to the phase's Gitea release via
|
||||
`scripts/attach_release_asset.py`. The render + commit + attach pipeline is
|
||||
automated by `scripts/render_deck.sh`.
|
||||
|
||||
### Step 4 — Talking points (presenter cues)
|
||||
|
||||
|
||||
@@ -6,13 +6,25 @@ size: 16x9
|
||||
header: 'Nova — The No-Humans Infrastructure Platform'
|
||||
footer: 'Act %{page}/5 — v1.17'
|
||||
style: |
|
||||
section { font-size: 0.85em; }
|
||||
h1 { color: #1a1a2e; }
|
||||
h2 { color: #16213e; }
|
||||
table { font-size: 0.75em; }
|
||||
.badge { padding: 2px 8px; border-radius: 3px; font-size: 0.8em; }
|
||||
.badge.planned { background: #fff3cd; color: #856404; }
|
||||
section.title { background: #1a1a2e; color: white; }
|
||||
section {
|
||||
font-family: "Akkurat Pro", "Helvetica Neue", "Arial", sans-serif;
|
||||
font-size: 22px;
|
||||
color: #1B1B1B;
|
||||
}
|
||||
h1 { color: #D6002A; font-size: 34px; margin-bottom: 0.3em; }
|
||||
h2 { color: #D6002A; font-size: 26px; margin-bottom: 0.2em; }
|
||||
section.title { background: #1B1B1B; color: #fff; border-top: 8px solid #D6002A; }
|
||||
section.title h1 { color: #fff; }
|
||||
table { font-size: 18px; width: 100%; }
|
||||
th { background: #F0F0F0; }
|
||||
blockquote { border-left: 4px solid #D6002A; color: #2E2E2E; font-size: 20px; }
|
||||
img { display: block; margin: 0 auto; max-height: 320px; }
|
||||
.badge {
|
||||
display: inline-block; padding: 2px 8px; border-radius: 4px;
|
||||
font-size: 14px; font-weight: 600;
|
||||
}
|
||||
.badge.today { background: #c6f6d5; color: #22543d; }
|
||||
.badge.planned { background: #fef3c7; color: #78350f; }
|
||||
---
|
||||
|
||||
<!-- _class: title -->
|
||||
@@ -22,7 +34,7 @@ style: |
|
||||
|
||||
**Shifting from Operational Overhead to Strategic Value**
|
||||
|
||||
v1.17 — Strategic Direction, Leadership Metrics & Unified Story
|
||||
v1.18 — Citizen Developer & Production-Grade Guidance
|
||||
|
||||
---
|
||||
|
||||
@@ -37,7 +49,7 @@ v1.17 — Strategic Direction, Leadership Metrics & Unified Story
|
||||
2. **Vision** — Nova's strategic direction (NORTH_STAR)
|
||||
3. **How** — the pipeline, Decision Ledger, attestation gates
|
||||
4. **Proof** — grounded metrics that make the claim defensible
|
||||
5. **Roadmap** — deferred metrics with unblock paths + the ask
|
||||
5. **Roadmap** — deferred metrics with unblock paths + the ask + scope + RACI
|
||||
|
||||
**Benefit:** you leave knowing which claims are proven today, which are pipeline-ready, and which are deferred with a documented unblock path — no marketing, just grounded evidence.
|
||||
|
||||
@@ -289,6 +301,42 @@ From `docs/METRICS_DEFERRED_ROADMAP.md`.
|
||||
|
||||
---
|
||||
|
||||
## Slide 17 — Scope: Downstream of PDLC
|
||||
|
||||
**Nova governs infrastructure + delivery. The PDLC (product backlog, code authorship, IDE) is upstream — Nova never penetrates it.**
|
||||
|
||||
- **The PDLC is upstream:** product backlog, code authorship (AI agent / IDE / agentic SDLC), sprint planning, application business logic
|
||||
- **Nova is downstream:** contract ingestion → submission-readiness gate → policy → cloud lifecycle → environment progression → audit + attestation
|
||||
- **Integration is only through the contract boundary:** the citizen developer's AI coding agent, an upstream agentic SDLC, or any dev platform may all produce submissions — the source does not matter as all are subject to the same compliance standards
|
||||
- Nova validates the submission, not the author
|
||||
- Cites `docs/scope.md` + `PROJECT.md` § Scope
|
||||
|
||||
**Benefit:** you now know the scope boundary — Nova is purpose-built for infrastructure operations, not product development; integration is through one validated contract.
|
||||
|
||||
---
|
||||
|
||||
## Slide 18 — RACI: Who Owns What
|
||||
|
||||
**Three roles, one matrix — the citizen developer owns FRs + UAT, the platform owns NFRs + infra + QA + prod deploy, release management is co-owned.**
|
||||
|
||||
| Work Category | Citizen Dev | Platform | Release Mgmt |
|
||||
|---|---|---|---|
|
||||
| Functional Requirements (FRs) | **R/A** | C | I |
|
||||
| User Acceptance Testing (UAT) | **R/A** | C | I |
|
||||
| Non-Functional Requirements (NFRs) | I | **R/A** | C |
|
||||
| Infrastructure (cloud, state, IAM) | I | **R/A** | C |
|
||||
| QA (policy, confidence, schema) | C | **R/A** | I |
|
||||
| Production deployment to cloud | I | **R/A** | C |
|
||||
| Release attestation (QA + SRE) | **A** | R | **R** |
|
||||
|
||||
- **Compliance-standard equivalence:** FRs + UAT may come from any upstream source (AI agent, agentic SDLC, dev platform) — all pass the same submission-readiness gate
|
||||
- **Release co-ownership:** the platform runs the attestations agentically; the citizen developer oversees and triggers the actual release (human at the stage gate)
|
||||
- Cites `docs/raci.md` + `PROJECT.md` § RACI Matrix
|
||||
|
||||
**Benefit:** you now know exactly what you bring (FRs + UAT), what Nova provides (NFRs + infra + QA + prod deploy), and what you co-own (the release attestation).
|
||||
|
||||
---
|
||||
|
||||
<!-- _class: title -->
|
||||
<!-- _paginate: false -->
|
||||
|
||||
|
||||
@@ -103,6 +103,20 @@
|
||||
- "Pipeline-ready" → "production-proven" is the value proposition
|
||||
- **Key takeaway:** approve a pilot + the ledger build-out to move from pipeline-ready to production-proven
|
||||
|
||||
### Slide 17 — Scope: Downstream of PDLC
|
||||
- Nova governs infra + delivery only; the PDLC (product backlog, code authorship, IDE) is upstream
|
||||
- Integration is only through the validated contract boundary
|
||||
- Any upstream source (AI agent, agentic SDLC, dev platform) may produce submissions — all subject to the same compliance standards
|
||||
- Nova validates the submission, not the author
|
||||
- **Key takeaway:** Nova is purpose-built for infrastructure operations, not product development; the scope boundary is clean
|
||||
|
||||
### Slide 18 — RACI: Who Owns What
|
||||
- Citizen Developer owns FRs + UAT (via any upstream source — AI agent, SDLC, dev platform — all pass the same gate)
|
||||
- Platform owns NFRs + infra + QA + prod deploy
|
||||
- Release Management is co-owned: platform runs attestations agentically, citizen developer oversees + triggers the release (human at stage gate)
|
||||
- The compliance-standard equivalence is the key: the source does not matter; the submission does
|
||||
- **Key takeaway:** you bring FRs + UAT; Nova provides NFRs + infra + QA + prod deploy; the release is co-owned with you at the stage gate
|
||||
|
||||
### Appendix A1 — Metrics Glossary
|
||||
- Reference for every metric mentioned in the deck
|
||||
- Use if the audience asks "what does X mean?"
|
||||
|
||||
File diff suppressed because one or more lines are too long
Binary file not shown.
@@ -0,0 +1,85 @@
|
||||
# RACI — Who Owns What
|
||||
|
||||
> **Source of truth:** `.ciagent/PROJECT.md` § RACI Matrix (v1.18, REQ-215,
|
||||
> D-139). This page is the citizen-developer-facing copy.
|
||||
|
||||
Nova's delivery lifecycle has three roles. This page clarifies who owns
|
||||
what — so the citizen developer knows what they bring, what the platform
|
||||
provides, and what is co-owned.
|
||||
|
||||
## The Three Roles
|
||||
|
||||
### Citizen Developer (CD)
|
||||
|
||||
That's you — the consumer (technical developer L3A or non-technical L3B).
|
||||
You are **Responsible** for all **Functional Requirements (FRs)** and
|
||||
**User Acceptance Testing (UAT)**. You produce the FRs + UAT via your AI
|
||||
coding agent, an upstream agentic SDLC platform, or any upstream
|
||||
development platform. **The source does not matter** — all are subject
|
||||
to the same compliance standards (the submission-readiness gate, the
|
||||
contract schema, the policy envelope, the immutable audit stream). Nova
|
||||
validates the submission, not the author.
|
||||
|
||||
### Platform (Nova)
|
||||
|
||||
Nova is **Responsible** for all **Non-Functional Requirements (NFRs)**,
|
||||
**Infrastructure** (cloud resource lifecycle, state, IAM), **QA** (the
|
||||
platform-side quality checks: policy enforcement, confidence scoring,
|
||||
schema validation), and **Production deployments to cloud** (the apply
|
||||
path, the pipeline, the release mechanics).
|
||||
|
||||
### Release Management (RM) — co-owned
|
||||
|
||||
The release is **co-owned**. The platform performs the QA + SRE
|
||||
attestations agentically (it runs the confidence signal, the policy
|
||||
checks, the separation-of-duties). The citizen developer **oversees and
|
||||
triggers** the actual release — the human attestation at the stage gate
|
||||
is your authorization. The platform runs the checks; you authorize the
|
||||
promotion. This is the "autonomy in operations, human at stage gates"
|
||||
model.
|
||||
|
||||
## The Matrix
|
||||
|
||||
| Work Category | Citizen Developer | Platform | Release Management |
|
||||
|---|---|---|---|
|
||||
| **Functional Requirements (FRs)** | **R/A** | C | I |
|
||||
| **User Acceptance Testing (UAT)** | **R/A** | C | I |
|
||||
| **Non-Functional Requirements (NFRs)** | I | **R/A** | C |
|
||||
| **Infrastructure (cloud, state, IAM)** | I | **R/A** | C |
|
||||
| **QA (policy, confidence, schema checks)** | C | **R/A** | I |
|
||||
| **Production deployment to cloud** | I | **R/A** | C |
|
||||
| **Release attestation (QA + SRE sign-off)** | **A** | R | **R** |
|
||||
|
||||
**Key:** **R** = Responsible (does the work) · **A** = Accountable (owns
|
||||
the outcome, sign-off) · **C** = Consulted · **I** = Informed.
|
||||
|
||||
## What This Means in Practice
|
||||
|
||||
**You (Citizen Developer) bring:**
|
||||
- Your application code + a contract that declares intent.
|
||||
- Your FRs (what the application does).
|
||||
- Your UAT (you accept the deployment when it meets your FRs).
|
||||
|
||||
**Nova (Platform) provides:**
|
||||
- The NFRs (security, observability, compliance — baked into the
|
||||
pipeline, not your concern).
|
||||
- The infrastructure (cloud resources, state management, IAM scoping).
|
||||
- The QA (policy enforcement, confidence scoring, schema validation).
|
||||
- The production deployment (the apply path, the pipeline, the release).
|
||||
|
||||
**You co-own the release:**
|
||||
- Nova runs the attestations (QA confidence, SRE operational readiness).
|
||||
- You authorize the promotion at the stage gate. No promotion happens
|
||||
without your recorded attestation.
|
||||
|
||||
## Compliance Standards Apply Equally
|
||||
|
||||
Your FRs + UAT may come from any source — an AI coding agent, an
|
||||
agentic SDLC platform, or a traditional IDE. Nova does not
|
||||
differentiate. All submissions pass through the same gate
|
||||
(`schemas/submission-readiness.schema.json`): tags, environment
|
||||
metadata, policy preconditions, profile markers. The compliance
|
||||
standards are the same regardless of how the code was authored. This
|
||||
is by design: the audit trail is the same, the policy envelope is the
|
||||
same, the evidence stream is the same. The source does not matter; the
|
||||
submission does.
|
||||
@@ -0,0 +1,68 @@
|
||||
# Scope — Nova is Downstream of PDLC
|
||||
|
||||
> **Source of truth:** `.ciagent/PROJECT.md` § Scope (v1.18, REQ-216).
|
||||
> This page is the citizen-developer-facing copy.
|
||||
|
||||
## The Boundary
|
||||
|
||||
The **Product Development Lifecycle (PDLC)** is **upstream** of Nova. The
|
||||
PDLC includes:
|
||||
|
||||
- Product backlog / roadmap planning
|
||||
- Code authorship (via AI coding agent, IDE, or agentic SDLC platform)
|
||||
- Sprint planning / issue tracking
|
||||
- Application business logic
|
||||
- IDE workflows / developer experience
|
||||
|
||||
Nova never penetrates the PDLC. Nova's domain is **infrastructure +
|
||||
delivery only**.
|
||||
|
||||
## What Nova Does
|
||||
|
||||
Nova governs the downstream half:
|
||||
|
||||
- **Contract ingestion** — the validated entry point
|
||||
- **Submission-readiness gate** — what is acceptable to start
|
||||
(`schemas/submission-readiness.schema.json`)
|
||||
- **Policy enforcement** — the confidence signal, Checkov, tagging
|
||||
- **Cloud resource lifecycle** — Terraform plan/apply, state, IAM
|
||||
- **Environment progression** — dev (autonomous) → qa (QA attestation) →
|
||||
prod (SRE attestation) → dr (SRE attestation)
|
||||
- **Immutable audit + attestation** — the Decision Ledger, the evidence
|
||||
stream, the HITL gates
|
||||
|
||||
## The Integration Point
|
||||
|
||||
Integration between the PDLC and Nova is **only** through the validated,
|
||||
published contract boundary:
|
||||
|
||||
```
|
||||
PDLC (upstream) Nova (downstream)
|
||||
───────────────── ─────────────────
|
||||
product backlog contract ingestion
|
||||
code authorship (AI agent / IDE / SDLC) → submission-readiness gate
|
||||
sprint planning → policy enforcement
|
||||
application business logic → cloud resource lifecycle
|
||||
→ environment progression (dev→qa→prod→dr)
|
||||
→ immutable audit + attestation
|
||||
```
|
||||
|
||||
The citizen developer's AI coding agent, an upstream agentic SDLC
|
||||
platform, or any upstream development platform may all produce
|
||||
submissions. **The source does not matter** — all are subject to the
|
||||
same compliance standards. Nova validates the submission, not the
|
||||
author.
|
||||
|
||||
## What Nova is Not
|
||||
|
||||
- Not an upstream development platform (no product backlogs, IDE, code
|
||||
authorship).
|
||||
- Not a general-purpose AI agent platform (autonomy is narrow, bounded
|
||||
by policy envelopes).
|
||||
- Not a legacy infrastructure bridge (no VMs/bare metal/OS).
|
||||
- Not a permissive delivery highway (no escape hatches past confidence
|
||||
or HITL).
|
||||
- Not a mutable audit log (VCS history ≠ regulatory evidence).
|
||||
|
||||
These anti-goals (from `docs/vision.md` §7 and Core Tenet #2) are
|
||||
promoted here from buried tenets to an unmissable scope statement.
|
||||
Executable
+80
@@ -0,0 +1,80 @@
|
||||
#!/usr/bin/env python3
|
||||
"""scripts/attach_release_asset.py — upload a file as a Gitea release attachment.
|
||||
|
||||
REQ-228 (v1.18): PPTX (and any deck artifact) is attached to the phase's
|
||||
Gitea release. Uses the Gitea API:
|
||||
POST /api/v1/repos/{owner}/{repo}/releases/{id}/assets
|
||||
multipart form: name=<filename>, attachment=<file bytes>
|
||||
|
||||
Usage:
|
||||
python3 scripts/attach_release_asset.py <file-path> <release-id>
|
||||
python3 scripts/attach_release_asset.py docs/presentations/nova-no-humans-platform.pptx 522
|
||||
|
||||
Token resolution: reads NOVA_GITEA_TOKEN (or ACDL_GITEA_TOKEN) from .env.secrets
|
||||
/ .env, matching the ship_phase.sh pattern. Never uses shell env tokens.
|
||||
"""
|
||||
import os
|
||||
import sys
|
||||
import json
|
||||
import urllib.request
|
||||
import urllib.error
|
||||
from pathlib import Path
|
||||
|
||||
GITEA_BASE = "https://git.cloudinit.dev"
|
||||
OWNER = "continuous-intelligence"
|
||||
REPO = "acdl"
|
||||
|
||||
|
||||
def resolve_token() -> str:
|
||||
for fn in (".env.secrets", ".env"):
|
||||
try:
|
||||
for line in Path(fn).read_text().splitlines():
|
||||
if line.startswith("NOVA_GITEA_TOKEN=") or line.startswith("ACDL_GITEA_TOKEN="):
|
||||
return line.split("=", 1)[1].strip()
|
||||
except (FileNotFoundError, PermissionError):
|
||||
continue
|
||||
raise RuntimeError("No Gitea token found in .env.secrets or .env (NOVA_GITEA_TOKEN/ACDL_GITEA_TOKEN)")
|
||||
|
||||
|
||||
def attach_asset(file_path: str, release_id: str) -> dict:
|
||||
token = resolve_token()
|
||||
p = Path(file_path)
|
||||
if not p.is_file():
|
||||
raise FileNotFoundError(f"Asset file not found: {file_path}")
|
||||
|
||||
url = f"{GITEA_BASE}/api/v1/repos/{OWNER}/{REPO}/releases/{release_id}/assets"
|
||||
filename = p.name
|
||||
|
||||
boundary = "----NovaBoundary7MAgYbk"
|
||||
body = (
|
||||
f"--{boundary}\r\n"
|
||||
f'Content-Disposition: form-data; name="name"\r\n\r\n'
|
||||
f"{filename}\r\n"
|
||||
f"--{boundary}\r\n"
|
||||
f'Content-Disposition: form-data; name="attachment"; filename="{filename}"\r\n'
|
||||
f"Content-Type: application/octet-stream\r\n\r\n"
|
||||
).encode() + p.read_bytes() + f"\r\n--{boundary}--\r\n".encode()
|
||||
|
||||
req = urllib.request.Request(
|
||||
url,
|
||||
data=body,
|
||||
headers={
|
||||
"Authorization": f"token {token}",
|
||||
"Content-Type": f"multipart/form-data; boundary={boundary}",
|
||||
},
|
||||
method="POST",
|
||||
)
|
||||
try:
|
||||
resp = urllib.request.urlopen(req, timeout=60)
|
||||
return json.loads(resp.read())
|
||||
except urllib.error.HTTPError as e:
|
||||
err = e.read().decode()[:300]
|
||||
raise RuntimeError(f"HTTP {e.code} attaching {filename} to release {release_id}: {err}") from e
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
if len(sys.argv) != 3:
|
||||
print("Usage: attach_release_asset.py <file-path> <release-id>")
|
||||
sys.exit(1)
|
||||
result = attach_asset(sys.argv[1], sys.argv[2])
|
||||
print(f"Attached: {result.get('name')} → release {sys.argv[2]} (asset id {result.get('id')})")
|
||||
Executable
+56
@@ -0,0 +1,56 @@
|
||||
#!/usr/bin/env bash
|
||||
# scripts/render_deck.sh — render a Marp deck to HTML + PPTX, commit both to git.
|
||||
# REQ-228 (v1.18): PPTX is now a first-class committed artifact + release attachment.
|
||||
#
|
||||
# Usage:
|
||||
# bash scripts/render_deck.sh <deck-name>
|
||||
# bash scripts/render_deck.sh nova-no-humans-platform
|
||||
#
|
||||
# Renders:
|
||||
# docs/presentations/<deck-name>-marp.md → docs/presentations/<deck-name>.html (committed)
|
||||
# → docs/presentations/<deck-name>.pptx (committed, binary)
|
||||
#
|
||||
# The PPTX is also attached to the current phase's Gitea release via
|
||||
# scripts/attach_release_asset.py (call separately after ship, or this script
|
||||
# will invoke it if NOVA_GITEA_RELEASE_ID is set).
|
||||
set -euo pipefail
|
||||
|
||||
DECK="${1:?Usage: render_deck.sh <deck-name>}"
|
||||
cd "$(git rev-parse --show-toplevel)"
|
||||
|
||||
SRC="docs/presentations/${DECK}-marp.md"
|
||||
HTML="docs/presentations/${DECK}.html"
|
||||
PPTX="docs/presentations/${DECK}.pptx"
|
||||
|
||||
if [ ! -f "$SRC" ]; then
|
||||
echo "ERROR: source deck $SRC not found" >&2; exit 1
|
||||
fi
|
||||
|
||||
CHROME=""
|
||||
for c in \
|
||||
/root/.cache/ms-playwright/chromium-1217/chrome-linux64/chrome \
|
||||
/usr/bin/chromium \
|
||||
/usr/bin/chromium-browser \
|
||||
/usr/bin/google-chrome; do
|
||||
if [ -x "$c" ]; then CHROME="$c"; break; fi
|
||||
done
|
||||
if [ -z "$CHROME" ]; then
|
||||
echo "WARNING: no Chrome/Chromium found — skipping render (HTML/PPTX will need manual re-render)" >&2
|
||||
exit 0
|
||||
fi
|
||||
export CHROME_PATH="$CHROME"
|
||||
|
||||
echo "Rendering HTML → $HTML"
|
||||
npx --yes @marp-team/marp-cli@latest --allow-local-files "$SRC" -o "$HTML" 2>&1 | tail -3
|
||||
|
||||
echo "Rendering PPTX → $PPTX"
|
||||
npx --yes @marp-team/marp-cli@latest --allow-local-files "$SRC" -o "$PPTX" 2>&1 | tail -3
|
||||
|
||||
git add "$HTML" "$PPTX"
|
||||
echo "Staged $HTML + $PPTX for commit."
|
||||
|
||||
if [ -n "${NOVA_GITEA_RELEASE_ID:-}" ]; then
|
||||
echo "Attaching PPTX to Gitea release $NOVA_GITEA_RELEASE_ID..."
|
||||
python3 scripts/attach_release_asset.py "$PPTX" "$NOVA_GITEA_RELEASE_ID" || \
|
||||
echo "WARNING: attach failed — PPTX is still committed; attach manually."
|
||||
fi
|
||||
Reference in New Issue
Block a user