79a3358810
web/handlers/window.go: GET /window (list), GET /window/new (form),
POST /window (open), GET /window/{id} (detail+lifecycle+audit), POST
/window/{id}/activate|revoke|expire (lifecycle transitions). Store
extensions: OpenWindow/ActivateWindow/RevokeWindow/ExpireWindow/
ListWindows/GetWindow/GetAuditLog — all call the REAL x/window/types
Window.Activate/Revoke/Expire methods (not reimplementation). Revoke on
Expired is a no-op (v0.2 terminal-state contract). AuditEntry appended on
each transition. 3 Window templates. window_test.go: lifecycle
correctness (asserts real methods invoked), idempotent revoke, revoke-on-
expired no-op, G-026 error lexicon checks. Coverage: store 99.2%,
handlers 87.7%.
---ci---
project: oy
phase: 3
milestone: v0.6
status: execute
---/ci---
33 lines
1.0 KiB
HTML
33 lines
1.0 KiB
HTML
{{define "title"}}Window — OpenYield{{end}}
|
|
|
|
{{define "content"}}
|
|
<section class="panel">
|
|
<h1>Window</h1>
|
|
<p>A Window is a Holder-authorized, scope-bounded, time-limited, revocable
|
|
delegation of access (REQ-015). The Holder opens a Window so a partner or
|
|
service can read a Stash or process a Pass-Act — without giving up custody.
|
|
The Window is revocable, rate-limited, and audited.</p>
|
|
<p><a href="/window/new" class="btn">Open a Window</a></p>
|
|
</section>
|
|
|
|
<section class="panel">
|
|
<h2>Windows for {{.Grantor}}</h2>
|
|
{{if .Windows}}
|
|
<table>
|
|
<thead><tr><th>Window ID</th><th>Grantee</th><th>Scope</th><th>Status</th></tr></thead>
|
|
<tbody>
|
|
{{range .Windows}}
|
|
<tr>
|
|
<td><a href="/window/{{.WindowID}}">{{.WindowID}}</a></td>
|
|
<td>{{.Grantee}}</td>
|
|
<td>{{.Scope.Kind}} ({{.Scope.ResourceID}})</td>
|
|
<td>{{.Status}}</td>
|
|
</tr>
|
|
{{end}}
|
|
</tbody>
|
|
</table>
|
|
{{else}}
|
|
<p>No Windows yet for {{.Grantor}}. <a href="/window/new">Open a Window</a> to begin.</p>
|
|
{{end}}
|
|
</section>
|
|
{{end}} |