Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion .github/workflows/pages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ on:
- "scripts/validate-product-source.py"
- "scripts/build-product-site.py"
- "scripts/validate-product-build.py"
- "scripts/apply-search-authority.py"
- "scripts/validate-search-authority.py"
- "scripts/submit-indexnow.py"
- "scripts/inject-site-measurement.py"
- "scripts/validate-site-measurement.py"
Expand All @@ -23,6 +25,8 @@ on:
- "scripts/validate-product-source.py"
- "scripts/build-product-site.py"
- "scripts/validate-product-build.py"
- "scripts/apply-search-authority.py"
- "scripts/validate-search-authority.py"
- "scripts/submit-indexnow.py"
- "scripts/inject-site-measurement.py"
- "scripts/validate-site-measurement.py"
Expand Down Expand Up @@ -118,6 +122,9 @@ jobs:
- name: Build deterministic product website
run: python scripts/build-product-site.py --output _site --release-evidence /tmp/arsas-published.json

- name: Apply contextual search authority graph
run: python scripts/apply-search-authority.py _site

- name: Generate bilingual privacy pages
env:
GA4_MEASUREMENT_ID: ${{ vars.GA4_MEASUREMENT_ID }}
Expand Down Expand Up @@ -145,6 +152,9 @@ jobs:
GA4_MEASUREMENT_ID: ${{ vars.GA4_MEASUREMENT_ID }}
run: python scripts/validate-site-measurement.py _site --measurement-id "$GA4_MEASUREMENT_ID"

- name: Validate contextual authority and guide discovery
run: python scripts/validate-search-authority.py _site

- name: Check internal links and fragments
run: python scripts/check-site-health.py --site _site --output _validation/site-health

Expand Down Expand Up @@ -184,6 +194,7 @@ jobs:
! grep -R --line-number -E '(href|src|content)="http://' _site --include='*.html'
! grep -R --line-number --fixed-strings 'github.com/ghraw/masarray/arsas/main/Assets/screenshot' _site --include='*.html'
! grep -R --line-number --fixed-strings '__ARSAS_GA4_MEASUREMENT_ID__' _site --include='*.html'
test ! -e _site/search-authority.json

- name: Upload website artifact
if: github.event_name != 'pull_request'
Expand Down Expand Up @@ -222,7 +233,7 @@ jobs:
with:
python-version: "3.12"

- name: Verify deployed commit, privacy and measurement state
- name: Verify deployed commit, privacy, authority and measurement state
env:
GA4_MEASUREMENT_ID: ${{ vars.GA4_MEASUREMENT_ID }}
shell: bash
Expand Down
182 changes: 182 additions & 0 deletions .github/workflows/search-growth.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,182 @@
name: Build search growth queue

on:
schedule:
- cron: "5 4 * * 1"
workflow_dispatch:
inputs:
days:
description: Aggregated evidence window in days
required: false
default: "28"
type: choice
options: ["7", "28", "60", "90"]
pull_request:
branches: [ main ]
paths:
- "landing/**"
- "scripts/build-product-site.py"
- "scripts/apply-search-authority.py"
- "scripts/validate-search-authority.py"
- "scripts/build-search-growth-report.py"
- "scripts/build-site-measurement-report.py"
- "scripts/generate-privacy-pages.py"
- "scripts/inject-site-measurement.py"
- "scripts/check-site-health.py"
- ".github/workflows/search-growth.yml"
- ".github/workflows/pages.yml"
push:
branches: [ main ]
paths:
- "landing/**"
- "scripts/build-product-site.py"
- "scripts/apply-search-authority.py"
- "scripts/validate-search-authority.py"
- "scripts/build-search-growth-report.py"
- "scripts/build-site-measurement-report.py"
- "scripts/generate-privacy-pages.py"
- "scripts/inject-site-measurement.py"
- "scripts/check-site-health.py"
- ".github/workflows/search-growth.yml"
- ".github/workflows/pages.yml"

permissions:
contents: read

concurrency:
group: search-growth-${{ github.ref }}
cancel-in-progress: true

env:
CANONICAL_ROOT: https://masarray.github.io/arsas/

jobs:
quality:
name: Validate authority graph and structural growth queue
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
show-progress: false

- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: "3.12"

- name: Prepare stable release evidence
env:
GH_TOKEN: ${{ github.token }}
shell: bash
run: |
set -euo pipefail
if [ "$GITHUB_EVENT_NAME" = "pull_request" ]; then
cp landing/latest.json /tmp/arsas-published.json
else
gh api "repos/$GITHUB_REPOSITORY/contents/published.json?ref=release-evidence" --jq .content | base64 -d > /tmp/arsas-published.json
fi

- name: Build product website
run: python scripts/build-product-site.py --output _site --release-evidence /tmp/arsas-published.json

- name: Apply contextual search authority graph
run: python scripts/apply-search-authority.py _site

- name: Generate bilingual privacy pages
env:
GA4_MEASUREMENT_ID: ${{ vars.GA4_MEASUREMENT_ID }}
run: python scripts/generate-privacy-pages.py --output _site --release-evidence /tmp/arsas-published.json --measurement-id "$GA4_MEASUREMENT_ID"

- name: Configure optional consent-gated measurement
env:
GA4_MEASUREMENT_ID: ${{ vars.GA4_MEASUREMENT_ID }}
run: python scripts/inject-site-measurement.py _site --measurement-id "$GA4_MEASUREMENT_ID"

- name: Validate rendered authority graph
run: python scripts/validate-search-authority.py _site

- name: Check internal links and fragments
run: python scripts/check-site-health.py --site _site --output _growth/health

- name: Build credential-free structural growth queue
run: python scripts/build-search-growth-report.py --site _site --output _growth/queue

- name: Add structural queue to job summary
shell: bash
run: cat _growth/queue/search-growth.md >> "$GITHUB_STEP_SUMMARY"

- name: Upload structural growth evidence
uses: actions/upload-artifact@v4
with:
name: search-growth-quality
path: _growth/
if-no-files-found: error
retention-days: 30

insights:
name: Build private measured search growth queue
if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
needs: quality
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
show-progress: false

- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: "3.12"

- name: Install read-only reporting dependencies
run: python -m pip install --disable-pip-version-check --quiet google-auth requests

- name: Prepare stable release evidence
env:
GH_TOKEN: ${{ github.token }}
shell: bash
run: gh api "repos/$GITHUB_REPOSITORY/contents/published.json?ref=release-evidence" --jq .content | base64 -d > /tmp/arsas-published.json

- name: Build current product website
run: python scripts/build-product-site.py --output _site --release-evidence /tmp/arsas-published.json

- name: Apply contextual search authority graph
run: python scripts/apply-search-authority.py _site

- name: Generate bilingual privacy pages
env:
GA4_MEASUREMENT_ID: ${{ vars.GA4_MEASUREMENT_ID }}
run: python scripts/generate-privacy-pages.py --output _site --release-evidence /tmp/arsas-published.json --measurement-id "$GA4_MEASUREMENT_ID"

- name: Configure optional consent-gated measurement
env:
GA4_MEASUREMENT_ID: ${{ vars.GA4_MEASUREMENT_ID }}
run: python scripts/inject-site-measurement.py _site --measurement-id "$GA4_MEASUREMENT_ID"

- name: Build aggregated traffic, search and CWV evidence
env:
GOOGLE_SERVICE_ACCOUNT_JSON: ${{ secrets.GOOGLE_SERVICE_ACCOUNT_JSON }}
GA4_PROPERTY_ID: ${{ vars.GA4_PROPERTY_ID }}
GSC_SITE_URL: ${{ vars.GSC_SITE_URL || 'https://masarray.github.io/arsas/' }}
PAGESPEED_API_KEY: ${{ secrets.PAGESPEED_API_KEY }}
PAGESPEED_URLS: ${{ vars.PAGESPEED_URLS || 'https://masarray.github.io/arsas/,https://masarray.github.io/arsas/download.html,https://masarray.github.io/arsas/smart-reporting.html,https://masarray.github.io/arsas/guides.html,https://masarray.github.io/arsas/id.html,https://masarray.github.io/arsas/unduh.html' }}
REPORT_DAYS: ${{ inputs.days || '28' }}
GITHUB_STEP_SUMMARY: ""
run: python scripts/build-site-measurement-report.py --site _site --output _growth/measurement --days "$REPORT_DAYS"

- name: Build prioritized measured growth queue
run: python scripts/build-search-growth-report.py --site _site --measurement-json _growth/measurement/measurement.json --output _growth/queue

- name: Add measured queue to job summary
shell: bash
run: cat _growth/queue/search-growth.md >> "$GITHUB_STEP_SUMMARY"

- name: Upload private measured growth evidence
uses: actions/upload-artifact@v4
with:
name: search-growth-${{ github.run_number }}
path: _growth/
if-no-files-found: error
retention-days: 90
29 changes: 29 additions & 0 deletions docs/search-growth-authority.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# ARSAS search growth and authority

P1 turns the privacy-safe website measurement foundation into a controlled product-discovery loop.

## Contextual authority graph

`landing/search-authority.json` maps IEC 61850 capability pages, solution pages and troubleshooting guides into engineering clusters. Every mapped page receives two to four contextual evidence links before the Download CTA.

The graph must prove that every troubleshooting guide has at least one inbound path from a capability or solution page. Generic sitewide links and guide-only loops do not satisfy this contract.

`scripts/apply-search-authority.py` validates and renders the graph. The source graph is removed from the deployable artifact. `scripts/validate-search-authority.py` checks the rendered relationships, placement, inbound guide coverage and `build-info.json` evidence.

The post-deployment Pages attestation verifies the public authority metadata, probes the Smart Reporting relationship set and confirms that the source graph is not publicly served.

## Private growth queue

`scripts/build-search-growth-report.py` creates a prioritized private queue from:

- contextual inbound depth;
- English pages without an Indonesian alternate;
- Search Console low-CTR opportunities when evidence is available;
- consented 404 observations when evidence is available;
- PageSpeed or CrUX failures when evidence is available.

The queue does not create pages automatically. Queries must first be mapped to an existing evidence page to avoid thin or duplicate content. Localization gaps remain candidates until Indonesian demand justifies translation.

`.github/workflows/search-growth.yml` validates the structural queue on relevant changes and creates a measured private queue every Monday at 04:05 UTC or on manual dispatch. Structural artifacts are retained for 30 days and measured artifacts for 90 days.

Traffic, search queries and growth queues are never deployed to the public website.
2 changes: 1 addition & 1 deletion landing/partials/download-cta-id.html
Original file line number Diff line number Diff line change
@@ -1 +1 @@
<section class="section section-tight"><div class="container callout"><div class="callout-grid"><div><span class="kicker">Release stabil terverifikasi</span><h2>Unduh ARSAS {{STABLE_VERSION}} untuk Windows.</h2><p>Gunakan installer untuk workstation normal, pilih portable ZIP untuk deployment berbasis folder yang terkontrol, dan verifikasi SHA-256 sebelum digunakan.</p><a class="text-link" href="catatan-rilis.html">Yang baru, batasan dan status signing →</a></div><div class="section-actions"><a class="btn btn-primary" href="{{INSTALLER_URL}}" download>Unduh Windows installer</a><a class="btn" href="unduh.html">Verifikasi dan bandingkan paket</a></div></div></div></section>
<section class="section section-tight" data-section="download-cta"><div class="container callout"><div class="callout-grid"><div><span class="kicker">Release stabil terverifikasi</span><h2>Unduh ARSAS {{STABLE_VERSION}} untuk Windows.</h2><p>Gunakan installer untuk workstation normal, pilih portable ZIP untuk deployment berbasis folder yang terkontrol, dan verifikasi SHA-256 sebelum digunakan.</p><a class="text-link" href="catatan-rilis.html">Yang baru, batasan dan status signing →</a></div><div class="section-actions"><a class="btn btn-primary" href="{{INSTALLER_URL}}" download>Unduh Windows installer</a><a class="btn" href="unduh.html">Verifikasi dan bandingkan paket</a></div></div></div></section>
2 changes: 1 addition & 1 deletion landing/partials/download-cta.html
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<section class="section section-tight">
<section class="section section-tight" data-section="download-cta">
<div class="container callout">
<div class="callout-grid">
<div>
Expand Down
Loading
Loading