# PRD — wiki (SO Wiki System)

Evidence date: 2026-09-28.

Source: `git@bitbucket.org:overdrive/wiki.git`, `master` at `bb3c49b` (2019-05-02).

There is no prior PRD in the source repository or in Silicon Ark. Requirements below are recovered from the implementation and from the two product lines in `README.md`. Provenance is labelled. The committed private key is not reproduced.

## Product purpose

**Documented.** `README.md` says the product is **SO Wiki System**, "Basic Wiki system".

**Implemented.** The site a browser can open is a static Silicon Overdrive admin shell built on the INSPINIA 2.8 theme. It does not create, store, edit, or list wiki articles from a data source. The only wiki-specific pieces are a navigation label and a static HTML fragment of blog cards.

**Unknown / Requires Confirmation:** whether "wiki" means an article system that was never built, or a name for this admin shell.

## Users and roles

| Actor | Evidence | Status |
|---|---|---|
| Person at the login screen | `index.html` form. Inputs have no `name` attributes. The form action is the dashboard HTML file | **Implemented** as navigation. Credentials are not checked |
| Person shown in the shell | Static text "Jaco Brits", "Software Director" in `views/dashboard/index.html` | **Implemented** markup. Not loaded from a session |
| Developer (role 1, debug) | Comment in `controller/core.js` | **Planned** in a comment. The check is commented out |
| Admin (role 2) | Same comment | **Planned** in a comment |
| Manager (role 3) | Same comment | **Planned** in a comment |
| Role 4 | Comment ends at `4 -` with no name | **Unknown** |
| Deploy operator | CodeDeploy scripts and the pipeline file | **Inferred** from those files. No user interface |

No login, session, or role is enforced anywhere in runnable code.

## Systems the product talks to

At product level:

1. The visitor's browser, loading HTML, CSS, and JavaScript from the same tree.
2. Google Fonts, imported by `assets/css/style.css`.
3. AWS S3 and AWS CodeDeploy, if the deploy scripts are run.
4. `httpd` on the CodeDeploy host.

There is no database, identity provider, mail sender, or wiki API. Email HTML under `assets/email_templates/` is theme sample markup. Nothing in the application sends it.

## Major workflows

### WF-1 — Open the login screen and continue

`index.html` shows logo `SO2`, heading "Welcome to Silicon Overdrive", and the sentence "Silicon Overdrive user login to manage your services , projects."

The form:

- `action` is `views/dashboard/index.html`.
- Method is the HTML default, GET.
- Email input: `type="email"`, placeholder "Username", `required`, no `name`.
- Password input: `type="password"`, placeholder "Password", `required`, no `name`.
- Submit button label is "Login".

Because the inputs have no `name`, a successful submit does not put the typed values on the query string. The browser navigates to the dashboard file. Any non-empty password and any string the browser accepts as an email will pass the `required` / `type="email"` checks. Empty fields are blocked by the browser's built-in validation.

Provenance: **Implemented**.

"Forgot password?" is `href="#"`. It does not open a reset flow.

"Create an account" links to `views/register.html`. That file is not in the tree. The theme register page is `views/template/register.html`.

The footer reads "Silicon Overdrive WebApp framework © 2019 - DEVELOPMENT".

### WF-2 — Use the management shell

`views/dashboard/index.html` is a full page titled "SO.2 | Basic Page".

The side menu contains:

- Dashboards, linking to `../template/index.html` and to `dashboard_2.html`, `dashboard_3.html`, `dashboard_4_1.html`, `dashboard_5.html`, labelled Dashboard v.1 through v.5. `dashboard_4.html` is not in this menu.
- Wiki, linking to `../template/blog.html`.
- Logout, linking to `../index.html`.

`../index.html` from `views/dashboard/` is `views/index.html`, which does not exist. The root login is two levels up (`../../index.html`).

The top bar says "Welcome to Silicon Overdrive Management System." Its search form `action` is `search_results.html`. That file is not in `views/dashboard/`. The theme copy is `views/template/search_results.html`.

The profile menu links to `profile.html`, `contacts.html`, `mailbox.html`, and `login.html` in the same directory. Those files are not in `views/dashboard/`. They exist under `views/template/`.

The top-right "Log out" link points at `../template/login.html`, which does exist. That template login form posts to `index.html` in the template folder (the theme dashboard), not back to the root login.

Message and alert dropdowns use fixed counts (16 messages, 8 alerts) and theme sample names. Provenance: **Implemented** static markup.

The main region `.pageContents` shows the heading "This is page content" and a button back to `../template/index.html`.

The footer says "10GB of 250GB Free." and "Copyright Silicon Overdrive © 1996-2019". The storage line is theme sample copy. It is not computed from a quota.

### WF-3 — Open Wiki

The Wiki item in the shell navigates to `views/template/blog.html`.

That page is a full INSPINIA blog demo titled "SO.2 | Blog". Its own side menu is the theme catalogue (Layouts, Graphs, Mailbox, and the rest). It does not keep the shortened shell, and its diamond icon item is labelled Layouts, not Wiki.

Article titles on that page are placeholder prose (the first card is "One morning, when Gregor Samsa"). Each card links to `article.html` in the same template folder. Tags, comment counts, and view counts are fixed text.

Provenance: **Implemented**.

### WF-4 — Load a view fragment

`controller/core.js` is included by `views/dashboard/index.html` and by `views/dashboard/index_org.html`.

On document ready it calls `pageSetup()` and `pageContent('blog')`.

`pageSetup()` is an empty function. The role branch and the navigation `.load()` calls inside it are comments.

`pageContent(view, page)` loads `../../views/<view>/<page>.html` into `.pageContents`. The ready handler calls it with one argument, so the URL it would request is `../../views/blog/undefined.html`. The fragment that exists is `views/wiki/blog.html`, which would be `pageContent('wiki', 'blog')`.

The click handler that follows is not valid JavaScript. After the `switch`, the source closes with `)};` rather than the `});` required to end the click callback and the `ready` call. A browser that parses this script stops at that syntax error, so `pageSetup` and `pageContent` do not run. The shell stays on the static "This is page content" block.

`logOut()` is called from the `logout` case and is not defined in this file or elsewhere in the application scripts.

The commented navigation paths (`template/nav/`, `template/footer/`) are not in the tree.

Provenance: **Implemented** source, and it does not complete the workflow. This was established by reading the script, not by a browser run.

`views/wiki/blog.html` is the inner card markup only (no document wrapper). Its cards match the placeholder articles in the template blog and link to `../template/article.html`. Nothing in the menu points at this file.

### WF-5 — Deploy

See technical documentation for hosts, hooks, and variable names.

At product level, a pipeline step zips the tree and a Python script uploads the zip to S3 and starts a CodeDeploy deployment. The appspec copies `/` to `/var/www/html/` and the hooks install and start `httpd`.

The pipeline file is named `bitbucket-pipelines_org.yml`. Bitbucket's default pipeline filename is `bitbucket-pipelines.yml`, which is not in the repository. Whether this file ever ran is **Unknown / Requires Confirmation**.

The `develop` step calls `codedeploy_deploy_develop.py`. There is no `develop` branch in git.

## Functional requirements

### FR-001 — Show the branded login screen

**Requirement.** A visitor who opens the site root sees the Silicon Overdrive login screen described in WF-1.

**Trigger.** Request for `index.html`.

**Inputs.** None.

**Behaviour.** Static HTML. No server render.

**Output.** The login document.

**Validation.** None on the server.

**Errors.** A missing asset returns the web server's file-not-found response. No application error page is wired to the root.

**Provenance.** Implemented.

**Evidence.** `index.html`.

**Confidence.** High.

### FR-002 — Accept the login form without checking credentials

**Requirement.** Submitting the login form with an email-shaped username and a non-empty password opens `views/dashboard/index.html`. The typed values are not sent, because the inputs have no `name`.

**Trigger.** Login button.

**Inputs.** Browser-validated email text and password text. Discarded on submit.

**Behaviour.** Navigation to the form `action`.

**Output.** The dashboard shell.

**Validation.** HTML `required` and `type="email"` only.

**Errors.** The browser blocks submit when the email field is empty or not an email, or when the password is empty. There is no "invalid credentials" response.

**Provenance.** Implemented.

**Evidence.** `index.html` form.

**Confidence.** High.

### FR-003 — Offer account links that do not perform those tasks

**Requirement.** "Forgot password?" stays on the page (`href="#"`). "Create an account" targets `views/register.html`, which is absent.

**Provenance.** Implemented links. The tasks themselves are not implemented.

**Evidence.** `index.html`. Register page that does exist: `views/template/register.html` (theme demo, not linked from the root form).

**Confidence.** High.

### FR-004 — Show the management shell

**Requirement.** The dashboard shell shows the static profile "Jaco Brits" / "Software Director", the welcome line, the side menu in WF-2, placeholder page content, and the storage footer line.

**Provenance.** Implemented markup.

**Evidence.** `views/dashboard/index.html`.

**Confidence.** High.

**Requires confirmation.** Whether the profile name was meant to be the only user or is leftover sample text.

### FR-005 — Expose a Wiki entry

**Requirement.** The shell side menu includes an item labelled Wiki. Activating it opens `views/template/blog.html`, a static blog demo.

**Provenance.** Implemented.

**Evidence.** `views/dashboard/index.html` line with `nav-label">Wiki`.

**Confidence.** High.

### FR-006 — Present wiki articles as data the user can change

**Requirement.** Not implemented. No model, no save action, no editor bound to stored articles. `views/wiki/blog.html` and `views/template/article.html` are static HTML.

**Provenance.** Absent from the implementation. The README name implies an article system. That implication is **not** treated as a confirmed requirement.

**Confidence.** High that it is absent.

### FR-007 — Route pages by role

**Requirement.** Comments in `controller/core.js` describe loading a different top nav, side nav, and search partial for roles 1–4. The code is commented out. The partials are not in the tree. Role 4 has no name.

**Provenance.** Planned in comments. Not implemented.

**Confidence.** High.

### FR-008 — Swap the shell content area

**Requirement.** `pageContent` is written to replace `.pageContents` with `views/<view>/<page>.html`. The only call site passes `'blog'` and omits the page, and the script does not parse, so the replacement does not run.

**Provenance.** Implemented source that does not achieve the behaviour.

**Evidence.** `controller/core.js`, `views/dashboard/index.html`.

**Confidence.** High for the source. A browser console capture was not taken.

### FR-009 — Department dashboards

**Requirement.** `views/dashboard/dashboard_2.html`, `dashboard_3.html`, `dashboard_4_1.html`, and `dashboard_5.html` label the dashboard submenu:

| File | Active label |
|---|---|
| `dashboard_2.html` | Dashboard Technical |
| `dashboard_3.html` | Dashboard Support |
| `dashboard_4_1.html` | Dashboard HR |
| `dashboard_5.html` | Dashboard Finance |

The first submenu item on those pages is "Dashboard Software" and still links to `../template/index.html`. The shortened shell in `views/dashboard/index.html` still says Dashboard v.1–v.5.

`views/dashboard/dashboard_4.html` is a separate top-menu layout. Its title is "SO.2 | Dashboard v.4". It is not linked from the shell menu.

The pages are theme dashboards with sample charts and feeds. They do not load Software, Technical, Support, HR, or Finance data.

**Provenance.** Implemented labels on static demos.

**Requires confirmation.** Whether those five names are the intended areas of the product.

**Confidence.** High for the labels. Low for any business meaning.

### FR-010 — Deploy the static tree to httpd

**Requirement.** A CodeDeploy revision copies the repository onto `/var/www/html/` and the hooks install and start `httpd`.

**Provenance.** Implemented in `appspec.yml` and `scripts/`. Whether a deployment has succeeded is **Unknown**.

**Evidence.** `appspec.yml`, `scripts/install_dependencies`, `scripts/start_server`, `scripts/stop_server`.

**Confidence.** High for the file behaviour. Unknown for any live environment.

## Integrations

| System | Purpose | Direction | Auth in repo | Failure behaviour |
|---|---|---|---|---|
| Google Fonts | Open Sans and Roboto | Browser → fonts.googleapis.com | None | Pages still render; those font faces fall back |
| AWS S3 | Store the zip revision | Deploy script → S3 `put_object` | boto3 default chain. Not in repo | Script prints the client error and exits 1 |
| AWS CodeDeploy | Create deployment and poll status | Deploy script → CodeDeploy | Same | Prints the error or the failed deployment info and exits 1 |
| `httpd` | Serve the files | Host local | None in the app | Hook scripts have no retry beyond CodeDeploy's own hook timeout of 300 seconds |

## Important constraints

- The site is static files. There is no server-side session.
- Login does not establish identity.
- One git commit, dated 2019-05-02, is the entire history.
- A private key file is in the tree (`SOawsCodeDeploy.pem`). Serving the appspec destination would place that file under the web root. See technical documentation.
- The pipeline filename does not match Bitbucket's default, so the deploy workflow is not active on `master` unless something outside this repository points at it.

## Discrepancies

| Topic | A | B |
|---|---|---|
| Product name | README: SO Wiki System | Pages: Silicon Overdrive, SO2, SO.2, Silicon Overdrive Management System, Silicon Overdrive WebApp framework |
| Wiki destination | Menu opens `views/template/blog.html` | Fragment lives at `views/wiki/blog.html` and is not linked |
| Dashboard names | Shell: Dashboard v.1–v.5 | Other dashboard files: Software, Technical, Support, HR, Finance |
| Bootstrap | `assets/js/bootstrap.js` is Bootstrap 4.1.0 | Template login footer says "we app framework base on Bootstrap 3 © 2014" |
| Theme version | `assets/css/style.css` and `assets/js/inspinia.js` say INSPINIA 2.8 | `assets/locales/en.json` says `INSPINIA 2.4` and "Welcome to INSPINIA+ Admin Theme." |
| Pipeline | `develop` and `master` steps are written | Only `master` exists. Pipeline file is not `bitbucket-pipelines.yml` |
| Scan listing | `sonar-project.properties`, `sonarqube_scan.bat` | Not in git |
| Register link | Root form → `views/register.html` | File present at `views/template/register.html` |
| Logout | Side menu → `../index.html` (missing). Top bar → `views/template/login.html`. Profile menu → `login.html` (missing beside the shell) | Root login is `index.html` at the repository root |
